Bu eğitimde, Nacos tabanlı hizmet keşfi kullanan bir Spring Cloud mikroservis uygulamasının nasıl oluşturulacağı ve ayrı bir CI/CD işlem hattına gerek kalmadan doğrudan IntelliJ IDEA üzerinden Alibaba Cloud Toolkit eklentisi kullanılarak Serverless App Engine (SAE) üzerine nasıl dağıtılacağı anlatılmaktadır.
Çalışma mantığı
Uygulama, hizmet kayıt defteri olarak yerel bir Nacos Sunucusu üzerinden iletişim kuran iki hizmetten oluşur:
Provider (
nacos-service-provider):GET /echo/{string}uç noktasını sunar ve başlangıçta kendini Nacos'a kaydeder.Consumer (
nacos-service-consumer): Provider hizmetini Nacos üzerinden keşfeder ve RestTemplate veya FeignClient kullanarak çağırır.
IntelliJ IDEA
└── Alibaba Cloud Toolkit plug-in
│
├── Deploy ──► SAE Application: nacos-service-provider (port 18081)
│ └── registers as "service-provider" in Nacos
│
└── Deploy ──► SAE Application: nacos-service-consumer (port 18082)
└── discovers "service-provider" via Nacos
└── exposes /echo-rest/{str} and /echo-feign/{str}
Geliştirme aşamasında her iki hizmet de şirket içi bir Nacos Sunucusu üzerinde yerel olarak çalışır. Yerel doğrulamanın ardından Alibaba Cloud Toolkit, bu hizmetleri doğrudan IntelliJ IDEA üzerinden SAE uygulamaları olarak derler ve dağıtır.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Aktif bir SAE hesabı. Bkz. SAE'yi Etkinleştirme
Ortam değişkenleri yapılandırılmış şekilde kurulu Maven
Kurulu JDK 1.8 veya üzeri
IntelliJ IDEA'da kurulu ve yapılandırılmış Alibaba Cloud Toolkit
JetBrains eklenti sunucusu Çin dışında barındırılmaktadır. İndirme işlemi yavaş olursa çevrimdışı kurulum paketini JetBrains web sitesinden edinin ve manuel olarak yükleyin. Yardım için bkz. Bize Ulaşın .
1. Adım: SAE'de yer tutucu uygulamalar oluşturma
SAE, JAR paketlerinden ve konteyner görüntülerinden uygulama dağıtmayı destekler. Bu eğitimde JAR paketleri kullanılır.
SAE'de bir provider uygulaması ve bir consumer uygulaması oluşturun. Adım adım talimatlar için bkz. SAE konsolunda JAR paketi kullanarak mikroservis uygulama dağıtma.
Yerel kodunuzu bu uygulamalara 5. Adım bölümünde yayınlarsınız.
2. Adım: Provider'ı oluşturma
Nacos'a hizmet provider'ı olarak kaydolacak bir Spring Boot projesi oluşturun.
nacos-service-provideradlı bir Maven projesi oluşturun.-
Aşağıdaki bağımlılıkları
pom.xmldosyasına ekleyin:Spring Cloud Edgware desteği sona ermiştir. Yeni projeler için Greenwich veya sonraki sürümleri kullanın.
Spring Cloud sürümü Spring Cloud Alibaba sürümü Greenwich 2.1.1.RELEASE Finchley 2.0.1.RELEASE Edgware 1.5.1.RELEASE <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>Bu örnekte Spring Cloud Greenwich.SR1 ile Spring Cloud Alibaba 2.1.1.RELEASE kullanılmaktadır. Projeniz farklı bir Spring Cloud sürümünü hedefliyorsa ilgili Spring Cloud Alibaba sürümünü kullanın:
src/main/javadizinindecom.aliware.edasadlı bir paket oluşturun.-
com.aliware.edaspaketi içindeProviderApplicationbaşlatma sınıfını oluşturun.@EnableDiscoveryClientek açıklaması hizmet kaydı ve keşfini etkinleştirir:package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } } -
com.aliware.edaspaketi içinde provider uç noktasını sunmak içinEchoControllersınıfını oluşturun:package com.aliware.edas; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class EchoController { @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } -
src/main/resourcesdizinindeapplication.propertiesdosyasını oluşturun ve Nacos sunucu adresini ayarlayın:Hizmet kayıt defteriniz kendi tarafından yönetilen bir kayıt defteriyse
127.0.0.1değerini kendi tarafından yönetilen hizmet kayıt defterinizin adresiyle değiştirin.spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Provider kaydını doğrulayın:
Provider'ı başlatmak için
ProviderApplicationsınıfınınmainyöntemini çalıştırın.Nacos konsolunu
http://127.0.0.1:8848/nacosadresinde açın. Varsayılan kullanıcı adı ve şifrenacosdeğeridir.Sol gezinme bölmesinde Service Management > Services seçeneğini belirleyin. Hizmet listesinde service-provider öğesinin göründüğünü doğrulayın.
3. Adım: Consumer'ı oluşturma
Provider'ı Nacos üzerinden keşfeden ve RestTemplate ile FeignClient kullanarak çağıran bir Spring Boot projesi oluşturun.
nacos-service-consumeradlı bir Maven projesi oluşturun.-
Aşağıdaki bağımlılıkları
pom.xmldosyasına ekleyin. Consumer, provider ile aynı üst proje ve bağımlılık yönetimine ihtiyaç duyar; ayrıcaspring-cloud-starter-openfeignbağımlılığı da gereklidir:<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> src/main/javadizinindecom.aliware.edasadlı bir paket oluşturun.-
com.aliware.edaspaketi içinde FeignClient arayüzüEchoServiceöğesini oluşturun:package com.aliware.edas; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; // Binds this FeignClient to the "service-provider" service in Nacos @FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
com.aliware.edaspaketi içinde başlatma sınıfıConsumerApplicationöğesini oluşturun:@EnableDiscoveryClienthizmet kaydı ve keşfini etkinleştirir.@EnableFeignClientsFeignClient özelliğini etkinleştirir.@LoadBalancedRestTemplate'i hizmet keşfi ile entegre ederekservice-providerhizmetini ada göre çözümlemesini sağlar.
package com.aliware.edas; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class ConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } } -
com.aliware.edaspaketi içinde iki uç nokta sunanTestControllersınıfını oluşturun; biri RestTemplate üzerinden, diğeri FeignClient üzerinden provider'ı çağırır:package com.aliware.edas; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class TestController { @Autowired private RestTemplate restTemplate; @Autowired private EchoService echoService; // Calls service-provider via RestTemplate @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/echo/" + str, String.class); } // Calls service-provider via FeignClient @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } } -
src/main/resourcesdizinindeapplication.propertiesdosyasını oluşturun:Hizmet kayıt defteriniz kendi tarafından yönetilen bir kayıt defteriyse
127.0.0.1:8848değerini kendi tarafından yönetilen hizmet kayıt defterinizin adresiyle değiştirin.spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Consumer kaydını doğrulayın:
Consumer'ı başlatmak için
ConsumerApplicationsınıfınınmainyöntemini çalıştırın.Nacos konsolunu
http://127.0.0.1:8848/nacosadresinde açın.Sol gezinme bölmesinde Service Management > Services seçeneğini belirleyin. Hizmet listesinde service-consumer öğesinin göründüğünü doğrulayın.
4. Adım: Hizmetleri yerel olarak test etme
Her iki hizmet çalışırken consumer'ı çağırarak provider'a başarıyla ulaştığını doğrulayın.
Linux, Unix veya macOS üzerinde:
curl http://127.0.0.1:18082/echo-rest/rest-rest
curl http://127.0.0.1:18082/echo-feign/feign-rest
Windows üzerinde bir tarayıcı açın ve şu adreslere gidin:
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Her istek, URL yolunda ilettiğiniz dizeyi döndürür; bu da consumer'ın Nacos üzerinden provider'ı keşfedip çağırdığını doğrular.

5. Adım: Uygulamaları SAE'ye dağıtma
IntelliJ IDEA'da Alibaba Cloud Toolkit'i yapılandırarak her iki uygulamayı da 1. Adım bölümünde oluşturduğunuz SAE uygulamalarına derleyip dağıtın.
Alibaba Cloud hesabınızı yapılandırma
Araç çubuğundaki Alibaba Cloud Toolkit simgesine
tıklayın ve açılan listeden Preference… seçeneğini belirleyin.Settings sayfasının sol gezinme bölmesinde Alibaba Cloud Toolkit > Accounts seçeneğini belirleyin.
-
Access Key ID ve Access Key Secret değerlerinizi girin, ardından OK düğmesine tıklayın.
Access Key ID ve Access Key Secret değerlerinizi almak için Accounts sayfasındaki Get existing AK/SK seçeneğine tıklayın. Bu işlem Alibaba Cloud oturum açma sayfasını açar. Oturum açtıktan sonra kimlik bilgilerinizi almak için Security Management sayfasına gidin.
Dağıtım görevlerini yapılandırma ve çalıştırma
Alibaba Cloud Toolkit simgesine
tıklayın ve açılan listeden Deploy to SAE seçeneğini belirleyin.-
Deploy to SAE sayfasında provider uygulaması için ayarları yapılandırın: Kaydetmek için Apply düğmesine tıklayın.
Application bölümünde 1. Adımda oluşturduğunuz provider uygulamasıyla eşleşen bölgeyi, ad alanını ve uygulama adını seçin. Name alanı SAE uygulama adını değil, dağıtım yapılandırması adını ifade eder; genellikle bunu değiştirmeniz gerekmez.

-
İlgili bölgeyi, ad alanını ve uygulama adını seçerek consumer uygulaması için önceki adımı tekrarlayın. Kaydetmek için Apply düğmesine tıklayın.
Kendi tarafından yönetilen bir hizmet kayıt defteri kullanıyorsanız kaydetmeden önce Advanced sekmesine aşağıdaki başlatma komutlarını ekleyin:
-Dnacos.use.endpoint.parsing.rule=falseve-Dnacos.use.cloud.namespace.parsing=false.
-
Provider'ı dağıtmak için Run düğmesine tıklayın, ardından consumer'ı dağıtmak için işlemi tekrarlayın.

Dağıtımı doğrulama
-
Consumer uygulamasını genel erişime açmak için buna bir Server Load Balancer (SLB) örneği bağlayın. Bkz. Uygulamaya SLB örneği bağlama.

-
SLB genel IP adresini (örneğin,
47.111.XX.XX) kullanarak consumer'a HTTP istekleri gönderin:# Call via FeignClient curl http://47.111.XX.XX/echo-feign/feign-rest # Call via RestTemplate curl http://47.111.XX.XX/echo-rest/rest-restHer iki istek de URL yolundaki dizeyi döndürür; bu da SAE üzerindeki consumer'ın Nacos üzerinden provider'ı keşfedip çağırdığını doğrular.

-
İlgili Uygulama İzleme panolarındaki çağrı verilerini görüntüleyin.
Sonraki adımlar
Java uygulamasını SAE 1.0'a dağıtma — SAE tarafından desteklenen diğer dağıtım yöntemleri
Uygulamaya SLB örneği bağlama — Uygulamanızı harici trafiğe açma