Azure'da Spring Cloud Function ile çalışmaya başlama
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.
Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.
Önkoşullar
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 Functions Core Tools 3.0.13901.0 veya üzeri bir sürüm
Önemli
Bu hızlı başlangıç JAVA_HOME JDK'nin yükleme konumu olarak ortam değişkenlerini ayarlamanız gerekir.
Neleri derlemek için
Azure İşlevleri İşlevi ile yapılandırılmış klasik bir "Hello, World" işlevi Spring Cloud Azure İşlevleri yapacağız.
Kullanıcı adı içeren basit bir JSON nesnesi alır ve bu kullanıcıya karşılama iletisi UserGreeting içeren bir nesnesi gönderir.
Hazırlayacak proje, GitHub'daki hello-spring-function-azure deposunda GitHub. Bu hızlı başlangıçta açıklanan son işi görmek için bu örnek depoyu doğrudan kullanabilirsiniz.
Yeni bir Maven projesi oluşturma
Boş bir Maven projesi oluşturacak ve bunu Spring Cloud Function ve Azure İşlevleri.
Boş bir klasörde yeni bir pom.xml dosyası oluşturun ve örnek projeninpom.xmldosyasındaki içeriği kopyalayın/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ıza birkaç özelliği özelleştirmeniz gerekir:
<functionAppName>, Azure İşlevinizin adıdır<functionAppRegion>, İşlevinizin dağıtıldığı Azure bölgesinin adıdır<functionResourceGroup>, kullandığınız Azure kaynak grubunun adıdır
Aşağıdaki örnekte gösterildiği gibi bu özellikleri pom.xml doğrudan dosyanın üst kısmında değiştirin:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<azure.functions.java.library.version>1.4.2</azure.functions.java.library.version>
<azure.functions.maven.plugin.version>1.13.0</azure.functions.maven.plugin.version>
<!-- customize those two properties. The functionAppName should be unique across Azure -->
<functionResourceGroup>my-spring-function-resource-group</functionResourceGroup>
<functionAppName>my-spring-function</functionAppName>
<functionAppRegion>westeurope</functionAppRegion>
<stagingDirectory>${project.build.directory}/azure-functions/${functionAppName}</stagingDirectory>
<start-class>com.example.DemoApplication</start-class>
</properties>
Azure yapılandırma dosyalarını oluşturma
src/main/azure klasörü oluşturun ve içine aşağıdaki Azure İşlevleri yapılandırma dosyalarını ekleyin.
host.json:
{
"version": "2.0",
"functionTimeout": "00:10:00"
}
local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "java",
"MAIN_CLASS":"com.example.DemoApplication",
"AzureWebJobsDashboard": ""
}
}
Etki alanı nesnelerini oluşturma
Azure İşlevleri, JSON biçimindeki nesneleri alabilir ve gönderebilir.
Şimdi etki alanı modelimizi temsil eden UserGreeting ve nesnelerimizi oluşturacak.
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
Uygulama, iş mantığını yönetecek ve Spring Boot ekosisteminin tamamına erişebilecek. Bu özellik, standart Azure İşlevi'ne göre iki temel avantaj sunar:
- Api'leri Azure İşlevleri, bu nedenle kolayca diğer sistemlere taşınabilir. Örneğin, normal bir uygulama içinde Spring Boot kullanabilirsiniz.
- Yeni özellikler eklemek için
@EnableSpring Boot ek açıklamaları 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 çalıştırmak istediğiniz İşlevi temsil eden bir Spring Boot bileşeni içeren aşağıdaki dosyayı oluşturun:
Hello.java:
package com.example;
import com.example.model.Greeting;
import com.example.model.User;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import java.util.function.Function;
@Component
public class Hello implements Function<Mono<User>, Mono<Greeting>> {
public Mono<Greeting> apply(Mono<User> mono) {
return mono.map(user -> new Greeting("Hello, " + user.getName() + "!\n"));
}
}
Not
Hello işlevi oldukça özeldir:
- Bu bir '
java.util.function.Functiondır. İş mantığını içerir ve bir nesneyi diğerine dönüştürmek için standart bir Java API'si kullanır. - Ek açıklamasına sahip olduğundan Spring Bean'dır ve adı varsayılan olarak sınıfıyla aynıdır, ancak küçük
@Componentharfle başlayarak:hello. Bu adlandırma kuralının ardından, uygulamanıza başka işlevler oluşturmak istemeniz önemlidir. Ad, sonraki Azure İşlevleri oluşturacak olan adla eşleşmesi gerekir.
Azure İşlevini oluşturma
Api'nin Azure İşlevleri yararlanmak için, şimdi yürütmesini önceki adımda oluşturduğumız Spring Cloud İşlevi'ne devredecek bir Azure İşlevi kodlayazıyoruz.
src/main/java/com/example klasöründe aşağıdaki Azure İşlevi sınıf dosyasını oluşturun:
HelloHandler.java:
package com.example;
import com.example.model.Greeting;
import com.example.model.User;
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 org.springframework.cloud.function.adapter.azure.FunctionInvoker;
import java.util.Optional;
public class HelloHandler extends FunctionInvoker<User, Greeting> {
@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(handleRequest(user, context))
.header("Content-Type", "application/json")
.build();
}
}
Bu Java sınıfı bir Azure İşlevidir ve şu ilginç özelliklere sahiptir:
- İşlevler ile
FunctionInvokerİşlevler arasında bağlantı oluşturan Azure İşlevleri genişlet Spring Cloud.FunctionInvoker,handleRequest()yönteminde kullanılan yönteminibody()sağlar. - Ek açıklamayla tanımlandığı gibi işlevin
@FunctionName("hello")adıhelloolur. - Gerçek bir Azure İşlevi olduğu için api'nin tamamını Azure İşlevleri 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.
src/test/java/com/example klasörü oluşturun ve aşağıdaki JUnit testlerini ekleyin:
HelloTest.java:
package com.example;
import com.example.model.Greeting;
import com.example.model.User;
import com.microsoft.azure.functions.ExecutionContext;
import org.junit.jupiter.api.Test;
import org.springframework.cloud.function.adapter.azure.FunctionInvoker;
import reactor.core.publisher.Mono;
import java.util.logging.Logger;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloTest {
@Test
public void test() {
Mono<Greeting> result = new Hello().apply(Mono.just(new User("foo")));
assertThat(result.block().getMessage()).isEqualTo("Hello, foo!\n");
}
@Test
public void start() {
FunctionInvoker<User, Greeting> handler = new FunctionInvoker<>(
Hello.class);
Greeting result = handler.handleRequest(new User("foo"), new ExecutionContext() {
@Override
public Logger getLogger() {
return Logger.getLogger(HelloTest.class.getName());
}
@Override
public String getInvocationId() {
return "id1";
}
@Override
public String getFunctionName() {
return "hello";
}
});
handler.close();
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ında cURL isteğinin ve alttaki yerel Azure İşlevi'nin ekran görüntüsü:

İşlevde yerel olarak hata ayıklama
Aşağıdaki bölümlerde işlevin hata ayıklaması açıklanmaktadır.
Intellij IDEA kullanarak hata ayıklama
Intellij IDEA'da projeyi açın ve eklemek için Uzak JVM Hata Ayıklama çalıştırma yapılandırmasını 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üyorsunuz:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Intellij IDEA'da proje hata ayıklamayı başlatma. 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ına işaret tıklayın. Intellij IDEA, istek gönderdikten sonra hata ayıklama moduna geçer.
Visual Studio Code kullanarak hata ayıklama
Projeyi Visual Studio Code açın ve ardından aşağıdaki launch.json dosyası içeriğini yapılandırabilirsiniz:
{
"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üyorsunuz:
Worker process started and initialized.
Listening for transport dt_socket at address: 5005
Proje hata ayıklamayı Visual Studio Code sonra hata ayıklamak istediğiniz kesme noktalarına işaret ediyorsanız. İstek gönderdikten sonra Visual Studio Code hata ayıklama moduna girer. Daha fazla bilgi için bkz. Java'da çalıştırma ve hata ayıklama.
İşlevi Azure İşlevleri'ne dağıtma
Şimdi Azure İşlevi'nin üretime yayımlayabilirsiniz. İşlevi <functionAppName> yapılandırmak için,pom.xmldosyanız içinde tanımlandığı , ve <functionAppRegion> özelliklerinin kullan olacağını <functionResourceGroup> unutmayın. <functionAppName>
Not
Maven eklentisinin Azure ile kimlik doğrulaması yapmaları gerekir. Azure CLI yüklüyse devam etmeden önce az login kullanın.
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 öğesinin oluşturulup oluşturulmadığına bakın.
İşlevi seçin:
- İşleve genel bakış sayfasında işlevin URL'sini not edin.
- Platform özellikleri sekmesini seçip Günlük akışı hizmetini bulun ve ardından çalışan işlevinizi denetlemek için bu hizmeti seçin.
Şimdi, aşağıdaki örnekte gösterildiği gibi, önceki bölümde olduğu gibi cURL kullanarak çalışan işleve erişin. yerine gerçek your-function-name işlevinizin adını yazı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!
Sonraki adımlar
Spring ve Azure hakkında daha fazlasını öğrenmek için Azure’da Spring belge merkezinde çalışmaya devam edin.