如何使用nacos服務注冊和發現


本文為原創文章,轉載請標明出處。
本文鏈接:https://www.fangzhipeng.com/springcloud/2019/05/30/sc-nacos-discovery.html 
本文出自方志朋的博客

官方教程:https://nacos.io/en-us/docs/quick-start-spring.html

什么是Nacos?

Nacos 致力於幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。 是Spring Cloud A 中的服務注冊發現組件,類似於Consul、Eureka,同時它又提供了分布式配置中心的功能,這點和Consul的config類似,支持熱加載。

Nacos 的關鍵特性包括:

  • 服務發現和服務健康監測
  • 動態配置服務,帶管理界面,支持豐富的配置維度。
  • 動態 DNS 服務
  • 服務及其元數據管理

Nacos下載

Nacos依賴於Java環境,所以必須安裝Java環境。然后從官網下載Nacos的解壓包,安裝穩定版的,下載地址:https://github.com/alibaba/nacos/releases

本次案例下載的版本為1.0.0 ,下載完成后,解壓,在解壓后的文件的/bin目錄下,windows系統點擊startup.cmd就可以啟動nacos。linux或mac執行以下命令啟動nacos。

sh startup.sh -m standalone

啟動時會在控制台,打印相關的日志。nacos的啟動端口為8848,在啟動時要保證端口不被占用。珠穆拉馬峰的高度是8844,nacos的端口是8848,有點巧合。

啟動成功,在瀏覽器上訪問:http://localhost:8848/nacos,會跳轉到登陸界面,默認的登陸用戶名為nacos,密碼也為nacos。

登陸成功后,展示的界面如下:

 

 

從界面可知,此時沒有服務注冊到Nacos上。

使用Nacos服務注冊和發現

服務注冊和發現是微服務治理的根基,服務注冊和發現組件是整個微服務系統的靈魂,選擇合適的服務注冊和發現組件至關重要,目前主流的服務注冊和發現組件有Consul、Eureka、Etcd等。 隨着Eureka的閉源,Spring cloud netflix-oss組件大規模的進入到了維護期,不再提供新功能,spring cloud alibaba受到開源社區的大力擁護。

服務注冊

在本案例中,使用2個服務注冊到Nacos上,分別為nacos-provider和nacos-consumer。

構建服務提供者nacos-provider

新建一個Spring Boot項目,Spring boot版本為2.1.4.RELEASE,Spring Cloud 版本為Greenwich.RELEASE,在pom文件引入nacos的Spring Cloud起步依賴,代碼如下:

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
			<version>0.9.0.RELEASE</version>
</dependency>

在工程的配置文件application.yml做相關的配置,配置如下:


server:
  port: 8762
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848


在上述的配置的中,程序的啟動端口為8762,應用名為nacos-provider,向nacos server注冊的地址為127.0.0.1:8848。

然后在Spring Boot的啟動文件NacosProviderApplication加上@EnableDiscoveryClient注解,代碼如下:


@SpringBootApplication @EnableDiscoveryClient public class NacosProviderApplication { public static void main(String[] args) { SpringApplication.run(NacosProviderApplication.class, args); } } 

構建服務消費者nacos-consuer

和nacos-provider一樣,構建服務消費者nacos-consumer,nacos-cosumer的啟動端口8763。構建過程同nacos-provider,這里省略。

驗證服務注冊個發現

分別啟動2個工程,待工程啟動成功之后,在訪問localhost:8848,可以發現nacos-provider和nacos-consumer,均已經向nacos-server注冊,如下圖所示:

 

 

服務調用

nacos作為服務注冊和發現組件時,在進行服務消費,可以選擇RestTemplate和Feign等方式。這和使用Eureka和Consul作為服務注冊和發現的組件是一樣的,沒有什么區別。這是因為spring-cloud-starter-alibaba-nacos-discovery依賴實現了Spring Cloud服務注冊和發現的相關接口,可以和其他服務注冊發現組件無縫切換。

提供服務

在nacos-provider工程,寫一個Controller提供API服務,代碼如下:


@RestController public class ProviderController { Logger logger= LoggerFactory.getLogger(ProviderController.class); @GetMapping("/hi") public String hi(@RequestParam(value = "name",defaultValue = "forezp",required = false)String name){ return "hi "+name; } } 

消費服務

在這里使用2種方式消費服務,一種是RestTemplate,一種是Feign。

使用RestTemplate消費服務

RestTemplate可以使用Ribbon作為負載均衡組件,在nacos-consumer工程中引入ribbon的依賴:


<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>


在NacosConsumerApplication啟動文件注入RestTemplate的Bean,代碼如下:

	@LoadBalanced @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } 

加上@LoadBalanced注解即可在RestTemplate上開啟LoadBalanced負載均衡的功能。

寫一個消費服務的ConsumerController,代碼如下:


@RestController public class ConsumerController { @Autowired RestTemplate restTemplate; @GetMapping("/hi-resttemplate") public String hiResttemplate(){ return restTemplate.getForObject("http://nacos-provider/hi?name=resttemplate",String.class); } 

重啟工程,在瀏覽器上訪問http://localhost:8763/hi-resttemplate,可以在瀏覽器上展示正確的響應,這時nacos-consumer調用nacos-provider服務成功。

是FeignClient調用服務

在nacos-consumer的pom文件引入以下的依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在NacosConsumerApplication啟動文件上加上@EnableFeignClients注解開啟FeignClient的功能。

@EnableFeignClients public class NacosConsumerApplication { public static void main(String[] args) { SpringApplication.run(NacosConsumerApplication.class, args); } 

寫一個FeignClient,調用nacos-provider的服務,代碼如下:

@FeignClient("nacos-provider") public interface ProviderClient { @GetMapping("/hi") String hi(@RequestParam(value = "name", defaultValue = "forezp", required = false) String name); } 

寫一個消費API,該API使用ProviderClient來調用nacos-provider的API服務,代碼如下:



@RestController public class ConsumerController { @Autowired ProviderClient providerClient; @GetMapping("/hi-feign") public String hiFeign(){ return providerClient.hi("feign"); } } 

重啟工程,在瀏覽器上訪問http://localhost:8763/hi-feign,可以在瀏覽器上展示正確的響應,這時nacos-consumer調用nacos-provider服務成功。

總結

本文比較詳細的介紹了如何使用Nacos作為服務注冊中心,並使用案例介紹了如何在使用nacos作為服務注冊中心時消費服務。下一篇教程將介紹如何使用nacos作為分布式配置中心。

源碼下載

https://github.com/forezp/SpringCloudLearning/tree/master/springcloud-alibaba/nacos-discovery

參考資料

https://nacos.io/zh-cn/docs/what-is-nacos.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM