下篇快速通道:spring cloud Alibaba : Nacos作為配置中心
什麼是 Nacos
Nacos 緻力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集,幫助您快速實作動态服務發現、服務配置、服務中繼資料及流量管理。
Nacos 幫助您更靈活和容易地建構、傳遞和管理微服務平台。 Nacos 是建構以“服務”為中心的現代應用架構 (例如微服務範式、雲原生範式) 的服務基礎設施。
Nacos 的關鍵特性包括:
-
服務發現和服務健康監測
Nacos 支援基于 DNS 和基于 RPC 的服務發現。服務提供者使用 原生SDK、OpenAPI、或一個獨立的Agent TODO注冊 Service 後,服務消費者可以使用DNS TODO 或HTTP&API查找和發現服務。
Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務執行個體發送請求。Nacos 支援傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、使用者自定義)的健康檢查。 對于複雜的雲環境和網絡拓撲環境中(如 VPC、邊緣網絡等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀表盤,幫助您根據健康狀态管理服務的可用性及流量。
-
動态配置服務
動态配置服務可以讓您以中心化、外部化和動态化的方式管理所有環境的應用配置和服務配置。
動态配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和靈活。
配置中心化管理讓實作無狀态服務變得更簡單,讓服務按需彈性擴充變得更容易。
Nacos 提供了一個簡潔易用的UI (控制台樣例 Demo) 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀釋出、一鍵復原配置以及用戶端配置更新狀态跟蹤在内的一系列開箱即用的配置管理特性,幫助您更安全地在生産環境中管理配置變更和降低配置變更帶來的風險。
-
動态 DNS 服務
動态 DNS 服務支援權重路由,讓您更容易地實作中間層負載均衡、更靈活的路由政策、流量控制以及資料中心内網的簡單DNS解析服務。動态DNS服務還能讓您更容易地實作以 DNS 協定為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 清單.
-
服務及其中繼資料管理
Nacos 能讓您從微服務平台建設的視角管理資料中心的所有服務及中繼資料,包括管理服務的描述、生命周期、服務的靜态依賴分析、服務的健康狀态、服務的流量管理、路由及安全政策、服務的 SLA 以及最首要的 metrics 統計資料。
以上節選自Nacos官方文檔
Nacos下載下傳
Nacos依賴Java環境,是以要使用Nacos必須有Java環境。官方下載下傳Nacos的包:點我下載下傳
本次案例下載下傳的事1.1.0版本的。下載下傳完成後解壓,在/bin目錄下Windows系統點選startup.cmd,就可以運作;linux系統執行
sh startup.sh -m standalone
啟動完成後控制台會列印相關的日志,啟動完後通路http://localhost:8848/nacos,Nacos預設登入賬号密碼都是nacos;
登入成功後頁面如下:
使用Nacos作為服務發現和注冊中心
目前主流的服務注冊和發現元件有Consul、Eureka等。随着Eureka的閉源,spring cloud Alibaba受到開源社群的擁護,consul和nacos作為開發者的首選。
本次示範需要兩個服務nacos-provider和nacos-consumer;
建立服務提供者nacos-provider
建立一個Spring Boot項目,Spring boot版本為2.1.6.RELEASE,Spring Cloud 版本為Greenwich.SR1,在pom檔案引入nacos的Spring Cloud
<!--nacos-->
<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: 8100
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
以上配置檔案,啟動端口為8100,注冊服務名為nacos-provider,注冊位址為127.0.0.1:8848,然後在Spring Boot的的啟動類中加上@EnableDiscoveryClient注解;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
建立服務消費者nacos-consuer
過程和nacos-provider,端口為8200,這裡省略。
服務注冊發現
分别啟動兩個項目,通路localhost:8848可以看到兩個服務已經注冊進來
服務調用
nacos作為服務注冊和發現元件時,在進行服務消費,可以選擇RestTemplate和Feign等方式。這和使用Eureka和Consul作為服務注冊和發現的元件是一樣的,沒有什麼差別。這是因為spring-cloud-starter-alibaba-nacos-discovery依賴實作了Spring Cloud服務注冊和發現的相關接口,可以和其他服務注冊發現元件無縫切換。
提供服務
在nacos-provider工程,建立controller編寫一個對外提供服務的接口
@RestController
public class ProviderContreoller {
@Value("${spring.application.name}")
private String servicename;
@GetMapping("/hi")
public String hi(){
return "hi: "+servicename;
}
}
消費服務
這裡提供兩種方式來展示,一種是RestTemplate,一種是Feign。
使用FeignClient
在nacos-consumer的pom檔案引入以下的依賴:
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在nacos-consumer的啟動類中加上@EnableFeignClients注解開啟FeignClient的功能
@SpringBootApplication
@EnableDiscoveryClient
@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")
public String hi();
}
在controller寫一個對外服務的接口,使用ProviderClient 來調用nacos-provider的API服務
@RestController
public class ConsumerController {
@Autowired
private ProviderClient providerClient;
@GetMapping("/hi")
public String hiFeign(){
return providerClient.hi();
}
}
重新開機項目,在浏覽器上通路http://localhost:8200/hi,可以在浏覽器上傳回資料,表示nacos-consumer調用nacos-provider服務成功。
使用RestTemplate
RestTemplate可以使用Ribbon作為負載均衡元件,在nacos-consumer工程中引入ribbon的依賴:
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
在nacos-consumer啟動檔案注入RestTemplate的Bean
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
開啟@LoadBalanced注解即可在RestTemplate上開啟LoadBalanced負載均衡的功能。
寫一個消費服務的ConsumerController
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hi/rt")
public String restTemplate(){
return restTemplate.getForObject("http://nacos-provider/hi",String.class);
}
}
重新開機項目,在浏覽器上通路http://localhost:8200/hi/rt,可以看到浏覽器上傳回資料,表示nacos-consumer調用nacos-provider服務成功。
本項目示例代碼:https://github.com/zhangwenbinbin/spring-cloud-alibaba