Nacos
SpringCloud Alibaba Nacos是一個狗抑郁構建雲原生應用的動態服務發現、配置管理和服務管理平台。
Nacos:Dynamic Naming and Configuration Service
Nacos是注冊中心+配置中心=Eureka+Bus+Config
Nacos安裝並運行
本地環境必須有Java8以上版本和maven環境,先從官網上下載Nacos,然后解壓安裝包,直接在bin目錄下的startup.cmd,運行成功后直接訪問http://localhost:8848/nacos
。用戶名密碼都是nacos,然后登陸到控制台。
服務注冊與發現
如果要在您的項目中使用 Nacos 來實現服務注冊/發現,使用 group ID 為 com.alibaba.cloud 和 artifact ID 為 spring-cloud-starter-alibaba-nacos-discovery
的 starter。
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
如果不想使用 Nacos 作為您的服務注冊與發現,可以將 spring.cloud.nacos.discovery 設置為 false。一般使用時設置成true。
application.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: '*'
之后輸入localhost:8848/nacos
進入web端nacos管理平台,然后可以在服務列表中看到注冊成功的實例名稱。
注冊到Nacos中有服務提供者和服務消費者。消費者調用提供者的方式要稍微復雜一些。
因為Nacos的依賴中默認引入了Ribbon服務調用和負載均衡工具,因為在 Consumer 端需要去調用 Provider 端提供的REST 服務。例子中我們使用最原始的一種方式, 即顯示的使用 LoadBalanceClient 和 RestTemplate 結合的方式來訪問。
服務提供方Controller
@RestController
public class PayController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "9001 nacos payment" + string;
}
}
服務提供方配置
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: '*'
消費方的pomxml和提供者的一樣,這里不再顯示。
消費者的配置文件
server:
port: 83
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
application:
name: nacos-order83-consumer
management:
endpoints:
web:
exposure:
include: '*'
# 消費者將要訪問的微服務名稱(服務提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
消費方的配置類
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
消費者的controller
@RestController
public class OrderController {
@Resource
private RestTemplate restTemplate;
@Value("{service-url.nacos-user-service}")
private String SERVICE_URL;
@GetMapping(value = "/consumer/echo/{string}")
public String echo(@PathVariable String string) {
return restTemplate.getForObject("http://nacos-payment-provider/echo/" + string,String.class);
}
}
啟動兩個服務,然后訪問消費者的localhost:83/consumer/echo/參數
輸出“9002 nacos payment,參數”
服務注冊中心對比
C:是所有節點在同一時間看到的數據是一致的;A:是所有的請求都會得到響應。
一般倆說如果不需要存儲服務級別的信息且服務實例是通過nacos-client注冊,並能夠保持心跳上報,那么可以選擇AP模式,當前主流的服務如Spring cloud和Dubbo服務,都適用於AP模式,AP模式是為了服務的可能性減弱了一致性,因此AP模式下只支持注冊臨時實例。
如果需要在服務級別編輯或者存儲配置信息,那么CP是必要的,K8s服務和DNS服務適用於CP模式。CP模式下則支持持久化實例,此時則是以Raft協議偽集群運行模式,該模式下注冊實例之前還必須先注冊服務,如果服務不存在,則會返回錯誤。
Nacos引入中,默認包含有Ribbon相關依賴,因此負載均衡算法包含輪詢,隨機,加權等。
Nacos Config
使用Spring Cloud Alibaba Nacos Config,可基於SpringCloud的編程模式快速接入Nacos配置管理功能。
Nacos同SpringCloud-Config一樣,在項目初始化時,要保證先從配置中心進行配置拉取,拉取配置后,才能保證項目的正常啟動。
SpringBoot中配置文件是存在優先級順序的,bootstrap優先級高於application。
引入相關依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置文件
application.yml
spring:
profiles:
active: dev # 表示開發環境
#active: test # 表示測試環境
#active: info
bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務注冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
動態獲取配置
在自定義的屬性值所在的類上添加@RefreshScope
:動態獲取並刷新配置
@Value("${配置項的名}")
:獲取配置文件中指定配置項的值
controller
@RestController
@RefreshScope //動態刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("config/info")
public String getConfigInfo(){
//將nacos控制平台上的配置信息返回
return configInfo;
}
}
啟動nacos,主啟動類啟動。
進入localhost:8848/nacos/
,登錄nacos后,點擊配置列表,選擇添加配置。
這里需要注意的是,配置文件名的命名規范。
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
將這三個屬性值合並起來就是配置中心新建的配置文件的DataIdnacos-config-client-dev.yaml
。只有這樣動態刷新配置時才能識別。
這時配置好config.info的值后,訪問controller指定路徑。結果如下。
將配置文件中的版本改成2后重新訪問。
如果配置中心和當前應用的配置文件中配置了相同的項,優先使用配置中心的配置。
{"msg":"success","empname":"zhangsan","code":0,"age":24}
Nacos的名稱空間
類似於Java里面的包名和類名,最外層的namespace是可以用於區分部署環境的,GroupID和DataID用於區分不同的對象。
Nacos默認名稱空間是public,Namespace主要用來實現隔離。
比如說現在有三個環境:開發,測試和生產環境,我們可以創建三個NameSpace,不同的Namespace之間是相互隔離的。
Service是微服務,一個Service可以包含多個集群,Nacos默認幾圈是DEFAULT,集群Cluster是對指定微服務的一個虛擬划分。
將Service微服務分別部署在杭州機房和北京機房。
最后是Instance是微服務的實例。
指定spring.profile.active和配置文件的DataID 來使不同的環境下讀取不同的配置
默認空間+默認分組+新建dev+test兩個DataID。
通過`spring.profile.active屬性就能進行火哥環境下配置文件的讀取。