Bu öğreticide, sıfırdan iki Spring Cloud mikroservisi (bir hizmet sağlayıcı ve bir hizmet tüketici) oluşturma, Nacos hizmet kaydı ve keşfi ile yerel olarak test etme ve ardından her ikisini de Serverless App Engine (SAE) üzerine dağıtma adımlarını inceleyeceksiniz.
İşlem sonunda, tüketici üretim ortamında SAE üzerinde çalışırken Nacos aracılığıyla sağlayıcıyı bulacak ve çağıracaktır.
Tam kaynak koduna GitHub üzerinden erişebilirsiniz.
Bu öğretici kimler için?
Başlangıç noktanızı belirleyin ve buradan başlayın:
| Durumunuz | Nereden başlamalısınız? |
|---|---|
| Spring Cloud konusunda yeniyseniz | Tüm adımları takip edin. Spring Cloud Alibaba Nacos Discovery'nin hizmet kaydı ve keşfini nasıl uyguladığını ve tüketiciden sağlayıcıya çağrıların nasıl etkinleştirildiğini öğreneceksiniz. |
| Eureka, Consul veya ZooKeeper hakkında bilginiz varsa | Mevcut hizmet kayıt defteri bağımlılıklarınızı ve yapılandırmanızı Spring Cloud Alibaba Nacos Discovery ile değiştirin. Kod değişikliği gerekmez; Spring Cloud Alibaba standart Spring Cloud Registry arayüzlerini uygular. |
| Zaten açık kaynaklı Spring Cloud Alibaba Nacos Discovery kullanıyorsanız | Doğrudan 4. Adım: SAE'ye Dağıtım bölümüne geçin. |
Yerel Nacos kurulumunu tamamen atlamak istiyorsanız doğrudan 4. Adım: SAE'ye Dağıtım bölümüne gidin ve SAE yerleşik kayıt defterini kullanın. Bu yöntemde yerel bir Nacos Server gerekmez.
Ön koşullar
Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:
Maven yüklü olmalı ve PATH ortam değişkenine eklenmiş olmalıdır
Çalışan bir Nacos Server (1-3. Adımlar için gereklidir; 4. Adıma geçerseniz gerekli değildir)
Yerel bir Nacos Server başlatmak için:
Nacos Server paketini indirin ve çıkarın.
-
Nacos'u tek başına modda başlatın:
Linux, Unix veya macOS:
sudo sh startup.sh -m standaloneWindows:
startup.cmd -m standalone
-m standalonebayrağı, Nacos'u küme modu yerine tek başına modda başlatır. Windows'tastartup.cmddosyasına çift tıklamak varsayılan olarak küme modunda başlatır; bu durum küme yapılandırması yoksa hata verir. Başlatma hatası alırsanızstartup.cmddosyasını bir metin düzenleyicide açın,MODE="standalone"olarak ayarlayın ve dosyayı yeniden çalıştırın. Daha fazla ayrıntı için Nacos Hızlı Başlangıç konusuna bakın.
Bir hizmet kayıt defteri seçin
SAE, en çok önerilenden en az önerilene doğru sıralanan üç hizmet kayıt defteri seçeneğini destekler:
| Seçenek | En uygun olduğu durum | Notlar |
|---|---|---|
| Microservices Engine (MSE) (önerilen) | Çok sayıda mikroservis içeren üretim iş yükleri | Tam yönetimli ticari Nacos; bkz. MSE Nacos kayıt defteri kullanma |
| Kendi kendine yönetilen kayıt defteri | Tam kontrole ihtiyaç duyan ekipler | SAE ile Nacos kümeniz arasında ağ bağlantısı gerekir; aşağıdaki Kendi kendine yönetilen kayıt defteri notları bölümüne bakın |
| SAE yerleşik kayıt defteri | Yeni başlayanlar veya basit iş yükleri | Sıfır yapılandırma; SAE, dağıtım sırasında Nacos Server adresini, bağlantı noktasını, ad alanını, AccessKey ve Context-path değerlerini otomatik olarak enjekte eder |

SAE yerleşik kayıt defteri
SAE, Java mikroservis uygulamaları için otomatik Nacos Server adresleme sağlar. Bunu SAE konsolundaki service registration and discovery özelliği üzerinden yapılandırın. Kurulum talimatları için SAE yerleşik Nacos kayıt defterini kullanma konusuna bakın.

Kendi kendine yönetilen kayıt defteri notları

SAE ile kendi kendine yönetilen bir Nacos kayıt defteri kullanırken, uygulamanızı bir görüntü veya JAR paketi olarak dağıtın ve -jar öncesinde aşağıdaki başlatma parametrelerini ekleyin:
-Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false
-D ve -XX JVM parametrelerini aynı bağımsız değişkende karıştırmayın; bu durum komutun başarısız olmasına neden olur. Yanlış: Doğru:
java -Dalicloud.deployment.mode=EDAS_MANAGED -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 ... -jar /home/admin/app/xx-server.jar
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 ... -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar /home/admin/app/xx-server.jar
Görüntü dağıtımları için: Parametreleri görüntü başlatma komutuna ekleyin:
RUN echo 'eval exec java -Dnacos.use.endpoint.parsing.rule=false -Dnacos.use.cloud.namespace.parsing=false -jar $CATALINA_OPTS /home/admin/app/hello-edas-0.0.1-SNAPSHOT.jar'> /home/admin/start.sh && chmod +x /home/admin/start.sh
Docker görüntüsü oluşturma rehberi için Görüntü oluşturma örneği konusuna bakın.
JAR paketi dağıtımları için: SAE konsolunda Startup Command Settings bölümüne gidin ve parametreleri options Settings alanına girin.

Daha fazla ayrıntı için Başlatma komutu yapılandırma konusuna bakın.
1. Adım: Hizmet sağlayıcıyı oluşturun
Hizmet sağlayıcı Nacos'a kaydolur ve bir echo uç noktası sunar. Bu örnekte Spring Boot 2.1.4.RELEASE ve Spring Cloud Greenwich.SR1 kullanılmaktadır.
Spring Boot 2.4 ve sonraki sürümler desteklenmez. Spring Cloud Alibaba 2.2.6.RELEASE kullanıyorsanız gereken istemci sürümü 1.4.2'dir.
nacos-service-provideradında bir Maven projesi oluşturun.-
Aşağıdakileri
pom.xmldosyasına ekleyin:Spring Cloud Edgware kullanım ömrünü tamamlamıştır. Yeni projeler için Greenwich veya sonraki sürümleri kullanın.
Spring Cloud sürümü Spring Cloud Alibaba sürümü Greenwich (bu örnekte kullanılır) 2.1.1.RELEASE Finchley 2.0.1.RELEASE Edgware (kullanım ömrü doldu) 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.0.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>Sürüm uyumluluğu: Spring Cloud sürümünüzü doğru Spring Cloud Alibaba sürümüyle eşleştirin:
src/main/javadizinindecom.aliware.edaspaketini 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çindeEchoControllersınıfını oluşturun. Bu sınıf GET isteklerini/echo/{string}yoluna eşler ve yol değişkenini döndürür: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 yerel Nacos Server'a işaret edin:spring.application.name=service-provider server.port=18081 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848Nacos Server'ınız farklı bir ana bilgisayarda çalışıyorsa
127.0.0.1değerini IP adresiyle değiştirin. Kullanılabilir tüm yapılandırma seçenekleri için Yapılandırma referansı bölümüne bakın. -
Kaydı doğrulayın:
mainyönteminiProviderApplicationsınıfında çalıştırın.Tarayıcıda
http://127.0.0.1:8848/nacosadresini açın. Varsayılan kullanıcı adı ve parola ikisi denacosdeğerindedir.Sol gezinme bölmesinde Service Management > Service List seçeneklerini seçin. Listede
service-providergörünmelidir. Onaylamak için Details seçeneğine tıklayın.
2. Adım: Hizmet tüketiciyi oluşturun
Hizmet tüketici Nacos'a kaydolur ve sağlayıcıyı iki mekanizma kullanarak çağırır: RestTemplate (istemci tarafı yük dengeleme ile) ve FeignClient (bildirim temelli HTTP).
nacos-service-consumeradında bir Maven projesi oluşturun.-
Aşağıdakileri
pom.xmldosyasına ekleyin. Tüketici, sağlayıcının bağımlılıklarının üzerinespring-cloud-starter-openfeignekler:<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.0.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.edaspaketini oluşturun.-
com.aliware.edaspaketi içindeEchoServicearayüzünü oluşturun.@FeignClientek açıklaması bunu Nacos'ta kayıtlıservice-providerhizmetine bağlar: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; @FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } -
com.aliware.edaspaketi içindeConsumerApplicationbaşlatma sınıfını oluşturun:@EnableDiscoveryClient— tüketiciyi Nacos'a kaydeder@EnableFeignClients— FeignClient taramasını etkinleştirir@LoadBalancedek açıklamasıRestTemplatebean'inde — Nacos üzerinden istemci tarafı yük dengelemeyi etkinleştirir
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ç noktayı (her biri farklı bir çağrı yöntemi için) sunanTestControllersınıfını oluşturun: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 the provider via RestTemplate with load balancing @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 the 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:spring.application.name=service-consumer server.port=18082 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 -
Kaydı doğrulayın:
mainyönteminiConsumerApplicationsınıfında çalıştırın.http://127.0.0.1:8848/nacosadresini açın (kullanıcı adı ve parola:nacos).Service Management > Service List seçeneklerini seçin. Listede
service-consumergörünümünü onaylayın.
3. Adım: Yerel olarak test edin
Her iki hizmet de çalışırken, tüketici üzerinden sağlayıcıya test istekleri gönderin.
Linux, Unix veya macOS:
curl http://127.0.0.1:18082/echo-rest/rest-rest
curl http://127.0.0.1:18082/echo-feign/feign-rest
Windows: Aşağıdaki URL'leri bir tarayıcıya girin:
http://127.0.0.1:18082/echo-rest/rest-rest
http://127.0.0.1:18082/echo-feign/feign-rest
Her iki uç nokta da yanıt gövdesi olarak yol parametresini döndürür; bu durum tüketicinin sağlayıcıyı başarıyla bulduğunu ve çağırdığını doğrular.
4. Adım: SAE'ye dağıtın
nacos-service-provider ve nacos-service-consumer uygulamalarını iki ayrı uygulama olarak dağıtın. Hizmet keşfinin çalışması için her ikisinin de aynı bölge ve ad alanında olması gerekir.
Adım adım dağıtım talimatları için Java uygulaması dağıtma konusuna bakın.
Paket türünüze göre Application runtime environment ayarını yapın:
| Paket türü | Uygulama çalışma zamanı ortamı |
|---|---|
| JAR paketi | Standard Java Application Runtime Environment |
| WAR paketi | apache-tomcat-XXX |
Uygulama SAE üzerinde başladığında, yerleşik hizmet kayıt defteri Nacos Server adresini, hizmet bağlantı noktasını, ad alanını, AccessKey ve Context-path değerlerini otomatik olarak enjekte eder. Bu değerler application.properties dosyasındaki tüm ayarlara göre önceliklidir. Orijinal yapılandırmanız yerinde kalabilir veya kaldırılabilir; her iki yaklaşım da çalışır.
5. Adım: Dağıtımı doğrulayın
nacos-service-consumeruygulamasına genel erişimli bir Klasik Yük Dengeleyici (CLB) bağlayın. Genel erişimi yapılandırırken Network Protocol seçeneğini HTTP, HTTP Port seçeneğini80ve Container Port seçeneğini18082olarak ayarlayın. Ayrıntılar için Uygulamaya CLB bağlama konusuna bakın.-
Bir tarayıcıda CLB'nin genel IP adresini aşağıdaki biçimlerden birinde girin:
http://<public-IP-address>/echo-rest/rest-rest http://<public-IP-address>/echo-feign/feign-restSayfada dönen bir yanıt, dağıtımın çalıştığını doğrular.
Yapılandırma referansı
application.properties dosyası için Spring Cloud Alibaba Nacos Discovery yapılandırma özellikleri:
| Anahtar | Varsayılan | Açıklama |
|---|---|---|
spring.cloud.nacos.discovery.server-addr |
Yok | Nacos Server'ın IP adresi ve bağlantı noktası |
spring.cloud.nacos.discovery.service |
${spring.application.name} |
Hizmetin kaydolduğu ad |
spring.cloud.nacos.discovery.network-interface |
Yok | Kayıt için kullanılacak ağ arabirimi; ayarlanmazsa ilk kullanılabilir arabirime geri döner |
spring.cloud.nacos.discovery.ip |
Yok | Kaydedilecek açık IP adresi (arabirim algılamasına göre önceliklidir) |
spring.cloud.nacos.discovery.port |
-1 |
Kaydedilecek bağlantı noktası; belirtilmezse otomatik algılanır |
spring.cloud.nacos.discovery.namespace |
Yok | Ortam yalıtımı için ad alanı (örneğin, geliştirmeyi üretimden ayırmak) |
spring.cloud.nacos.discovery.metadata |
Yok | Harita biçimindeki özel meta veriler |
spring.cloud.nacos.discovery.cluster-name |
DEFAULT |
Nacos küme adı |
spring.cloud.nacos.discovery.endpoint |
Yok | Dinamik Nacos Server adresi çözümlemesi için alan adı; SAE'ye dağıtım sırasında gerekli değildir |
ribbon.nacos.enabled |
true |
Ribbon entegrasyonunu Nacos ile etkinleştirir; gerekmedikçe değiştirmeyin |
Yapılandırma seçeneklerinin tam listesi için Nacos Discovery konusuna bakın.