Azure'da Spring Cloud İşlevi
Bu makale, Java işlevi geliştirmek ve Azure İşlevleri'ne yayımlamak için Spring Cloud Function'ı kullanma adımlarını göstermektedir. Tüm adımları tamamladığınızda işleviniz Azure'da Tüketim Planı'nda çalışmaya başlar ve HTTP isteği kullanılarak tetiklenebilir.
Önkoşullar
- Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Java kullanarak işlev uygulamaları geliştirebilmeniz için şunlar yüklü olmalıdır:
- Java Developer Kit, sürüm 11
- Apache Maven, sürüm 3.0 veya üzeri
- Azure CLI
- Azure İşlevleri Core Tools sürüm 4
Önemli
- Bu hızlı başlangıcı tamamlamak için ortam değişkenini JDK'nin yükleme konumuna ayarlamanız
JAVA_HOME
gerekir. - Temel araçlar sürümünüzün en az 4.0.5455 olduğundan emin olun.
Oluşturacağımız şey
Azure İşlevleri üzerinde çalışan ve Spring Cloud İşlevi ile yapılandırılan klasik bir "Hello, World" işlevi oluşturacağız.
İşlev, kullanıcı adı içeren bir User
JSON nesnesi alır ve bu kullanıcıya karşılama iletisini içeren bir Greeting
nesneyi geri gönderir.
Proje, GitHub'daki azure-function-java-worker deposunun Azure'daki Spring Cloud İşlevi örneğinde kullanılabilir. Bu hızlı başlangıçta açıklanan son çalışmayı görmek istiyorsanız bu örneği doğrudan kullanabilirsiniz.
Yeni bir Maven projesi oluşturma
Boş bir Maven projesi oluşturacak ve spring cloud function ve Azure İşlevleri ile yapılandıracağız.
Boş bir klasörde yeni bir pom.xml dosyası oluşturun ve örnek projenin pom.xml dosyasındaki içeriği kopyalayıp yapıştırın.
Not
Bu dosya hem Spring Boot hem de Spring Cloud Function için Maven bağımlılıklarını kullanır ve Spring Boot ile Azure İşlevleri Maven eklentilerini yapılandırır.
Uygulamanız için birkaç özelliği özelleştirmeniz gerekir:
<functionAppName>
, Azure İşlevinizin adıdır<functionAppRegion>
, İşlevinizin dağıtıldığı Azure bölgesinin adıdır<functionResourceGroup>
kullanmakta olduğunuz Azure kaynak grubunun adıdır
Aşağıdaki örnekte gösterildiği gibi bu özellikleri doğrudan pom.xml dosyasının üst kısmına yakın bir şekilde değiştirin:
<properties>
<java.version>11</java.version>
<!-- Spring Boot start class. WARNING: correct class must be set -->
<start-class>com.example.DemoApplication</start-class>
<!-- customize those properties. WARNING: the functionAppName should be unique across Azure -->
<azure.functions.maven.plugin.version>1.29.0</azure.functions.maven.plugin.version>
<functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
<functionAppServicePlanName>my-spring-function-service-plan</functionAppServicePlanName>
<functionAppName>my-spring-function</functionAppName>
<functionPricingTier>Y1</functionPricingTier>
<functionAppRegion>eastus</functionAppRegion>
</properties>
Azure yapılandırma dosyalarını oluşturma
Bir src/main/resources klasörü oluşturun ve aşağıdaki Azure İşlevleri yapılandırma dosyalarını ekleyin.
host.json:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.2.0)"
},
"functionTimeout": "00:10:00"
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "java",
"FUNCTIONS_EXTENSION_VERSION": "~4",
"AzureWebJobsDashboard": ""
}
}
Etki alanı nesnelerini oluşturma
Azure İşlevleri, JSON biçimindeki nesneleri alabilir ve gönderebilir.
Şimdi etki alanı modelimizi User
temsil eden ve Greeting
nesnelerimizi oluşturacağız.
Bu hızlı başlangıcı özelleştirmek ve daha ilginç hale getirmek isterseniz daha fazla özellik kullanarak daha karmaşık nesneler oluşturabilirsiniz.
src/main/java/com/example/model klasörü oluşturup aşağıdaki iki dosyayı ekleyin:
User.java:
package com.example.model;
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Greeting.java:
package com.example.model;
public class Greeting {
private String message;
public Greeting() {
}
public Greeting(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Spring Boot uygulaması oluşturma
Bu uygulama tüm iş mantığını yönetir ve tam Spring Boot ekosistemine erişime sahiptir. Bu özellik, standart bir Azure İşlevi'ne göre iki temel avantaj sağlar:
- Azure İşlevleri API'lerine dayanmaz, bu nedenle diğer sistemlere kolayca taşıyabilirsiniz. Örneğin, normal bir Spring Boot uygulamasında yeniden kullanabilirsiniz.
- Yeni özellikler eklemek için Spring Boot'un tüm
@Enable
ek açıklamalarını kullanabilirsiniz.
src/main/java/com/example klasöründe normal bir Spring Boot uygulaması olan aşağıdaki dosyayı oluşturun:
DemoApplication.java:
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
}
}
Şimdi src/main/java/com/example/hello klasöründe aşağıdaki dosyayı oluşturun. Bu kod, çalıştırmak istediğimiz İşlevi temsil eden bir Spring Boot bileşeni içerir:
Hello.java:
package com.example.hello;
import com.example.model.*;
import org.springframework.stereotype.Component;
import java.util.function.Function;
@Component
public class Hello implements Function<User, Greeting> {
@Override
public Greeting apply(User user) {
return new Greeting("Hello, " + user.getName() + "!\n");
}
}
Not
Hello
işlevi oldukça özeldir:
- Bu bir
java.util.function.Function
. İş mantığını içerir ve bir nesneyi diğerine dönüştürmek için standart bir Java API'sini kullanır. - Ek açıklamaya
@Component
sahip olduğundan, bu bir Spring Bean'dir ve varsayılan olarak adı sınıfla aynıdır, ancak küçük harf karakterle başlar:hello
. Uygulamanızda başka işlevler oluşturmak istiyorsanız bu adlandırma kuralının uygulanması önemlidir. Ad, sonraki bölümde oluşturacağımız Azure İşlevleri adla eşleşmelidir.
Azure İşlevini oluşturma
Tam Azure İşlevleri API'sinden yararlanmak için şimdi yürütmesini önceki adımda oluşturulan Spring Cloud İşlevi'ne devreden bir Azure İşlevi kodlayacağız.
src/main/java/com/example/hello klasöründe aşağıdaki Azure İşlevi sınıf dosyasını oluşturun:
HelloHandler.java:
package com.example.hello;
import com.microsoft.azure.functions.*;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;
import com.example.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class HelloHandler {
@Autowired
private Hello hello;
@FunctionName("hello")
public HttpResponseMessage execute(
@HttpTrigger(name = "request", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<User>> request, ExecutionContext context) {
User user = request.getBody()
.filter(u -> u.getName() != null)
.orElseGet(() -> new User(request.getQueryParameters().getOrDefault("name", "world")));
context.getLogger().info("Greeting user name: " + user.getName());
return request.createResponseBuilder(HttpStatus.OK)
.body(hello.apply(user))
.header("Content-Type", "application/json")
.build();
}
}
Bu Java sınıfı bir Azure İşlevidir ve şu ilginç özelliklere sahiptir:
- sınıfı ek açıklamaya
@Component
sahiptir, bu nedenle spring bean'dır. - Ek açıklama tarafından tanımlanan işlevin
@FunctionName("hello")
adıdırhello
. - sınıfı gerçek bir Azure İşlevi uygular, böylece burada tam Azure İşlevleri API'sini kullanabilirsiniz.
Birim testi ekleme
Bu adım isteğe bağlıdır ancak uygulamanın düzgün çalıştığını doğrulamak için önerilir.
Bir src/test/java/com/example klasörü oluşturun ve aşağıdaki JUnit testlerini ekleyin:
HelloTest.java:
package com.example;
import com.example.hello.Hello;
import com.example.model.Greeting;
import com.example.model.User;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloTest {
@Test
public void test() {
Greeting result = new Hello().apply(new User("foo"));
assertThat(result.getMessage()).isEqualTo("Hello, foo!\n");
}
}
Artık Azure İşlevinizi Maven kullanarak test edebilirsiniz:
mvn clean test
İşlevi yerel olarak çalıştırma
Uygulamanızı Azure İşlevine dağıtmadan önce yerel olarak test edelim.
Öncelikle uygulamanızı Jar dosyası olarak paketlemeniz gerekir:
mvn package
Uygulamayı paketlediğinize göre azure-functions
Maven eklentisini kullanarak çalıştırabilirsiniz:
mvn azure-functions:run
Azure İşlevi artık localhost konumunda 7071 numaralı bağlantı noktası üzerinden kullanılabilir durumda olmalıdır. JSON biçiminde bir User
nesnesi içeren POST isteği göndererek işlevi test edebilirsiniz. Örneğin, cURL kullanarak:
curl -X POST http://localhost:7071/api/hello -d "{\"name\":\"Azure\"}"
İşlev JSON biçiminde bir Greeting
nesnesiyle yanıt vermelidir:
{
"message": "Hello, Azure!\n"
}
Ekranın üst kısmındaki cURL isteğinin ekran görüntüsü ve alt kısımdaki yerel Azure İşlevi aşağıdadır:
İşlevde yerel olarak hata ayıklama
Aşağıdaki bölümlerde işlevin hatalarını ayıklama açıklanmaktadır.
Intellij IDEA kullanarak hata ayıklama
Projeyi Intellij IDEA'da açın, ardından eklemek için bir Uzak JVM Hata Ayıklama çalıştırma yapılandırması oluşturun. Daha fazla bilgi için bkz . Öğretici: Uzaktan hata ayıklama.
Uygulamayı aşağıdaki komutla çalıştırın:
mvn azure-functions:run -DenableDebug
Uygulama başlatıldığında aşağıdaki çıkışı görürsünüz:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
IntelliJ IDEA'da proje hata ayıklamayı başlatın. Aşağıdaki çıkışı görürsünüz:
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
Hata ayıklamak istediğiniz kesme noktalarını işaretleyin. Intellij IDEA, istek gönderdikten sonra hata ayıklama moduna girer.
Visual Studio Code kullanarak hata ayıklama
Projeyi Visual Studio Code'da açın ve ardından aşağıdaki launch.json dosya içeriğini yapılandırın:
{
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Attach to Remote Program",
"request": "attach",
"hostName": "127.0.0.1",
"port": 5005
}
]
}
Uygulamayı aşağıdaki komutla çalıştırın:
mvn azure-functions:run -DenableDebug
Uygulama başlatıldığında aşağıdaki çıkışı görürsünüz:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Visual Studio Code'da proje hata ayıklamayı başlatın, ardından hata ayıklamak istediğiniz kesme noktalarını işaretleyin. Visual Studio Code, istek gönderdikten sonra hata ayıklama moduna girer. Daha fazla bilgi için bkz . Java'yı çalıştırma ve hata ayıklama.
İşlevi Azure İşlevleri'ne dağıtma
Şimdi Azure İşlevi'ni üretim ortamında yayımlayacaksınız. <functionAppName>
pom.xml dosyanızda tanımladığınız , <functionAppRegion>
ve <functionResourceGroup>
özelliklerinin işlevinizi yapılandırmak için kullanıldığını unutmayın.
Not
Maven eklentisinin Azure'da kimlik doğrulaması yapması gerekir. Azure CLI yüklüyse devam etmeden önce kullanın az login
.
Daha fazla kimlik doğrulama seçeneği için bkz. azure-maven-plugins deposunda kimlik doğrulaması.
İşlevinizi otomatik olarak dağıtmak için Maven'ı çalıştırın:
mvn azure-functions:deploy
Şimdi Azure portalına giderek Function App
öğesinin oluşturulup oluşturulmadığına bakın.
İşlevi seçin:
- İşleve genel bakış sayfasında işlevin URL'sini not edin.
- Çalışan işlevinizi denetlemek için gezinti menüsünde Günlük akışı'nı seçin.
Şimdi, önceki bölümde yaptığınız gibi, aşağıdaki örnekte gösterildiği gibi çalışan işleve erişmek için cURL kullanın. değerini gerçek işlev adınızla değiştirerek değiştirmeyi your-function-name
unutmayın.
curl https://your-function-name.azurewebsites.net/api/hello -d "{\"name\":\"Azure\"}"
Bir önceki bölümde olduğu gibi işlev JSON biçiminde bir Greeting
nesnesiyle yanıt vermelidir:
{
"message": "Hello, Azure!\n"
}
Tebrikler, Azure İşlevleri'nde çalışan bir Spring Cloud Function örneğiniz var! Spring Cloud işlevleri hakkında daha fazla bilgi ve örnek için aşağıdaki kaynaklara bakın:
Sonraki adımlar
Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.