1.什麼是Nacos?
Nacos 是阿裡巴巴開源的一個更易于建構雲原生應用的動态服務發現、配置管理和服務管理平台。
2.Nacos Config整合
Nacos Config Starter實作Spring Cloud應用程式的外部化配置。
2.1 啟動 Nacos Server 并添加配置
1.下載下傳位址:2.啟動
- 直接下載下傳:Nacos Server 下載下傳頁
- 源碼建構:Github 項目頁面
3.在指令行執行如下指令,向 Nacos Server 中添加一條配置,也可在控制台中手動添加。
- Linux/Unix/Mac 作業系統,執行指令
sh startup.sh -m standalone
- Windows 作業系統,執行指令
cmd startup.cmd
- 預設賬戶密碼:nacos
添加的配置的詳情如下
dataId 為 nacos-config-example.properties group 為 DEFAULT_GROUP 内容如下 user.id=1 user.name=james user.age=17
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
2.1 引入pom檔案
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.2 添加bootstrap.properties
spring.application.name=nacos-config-example
spring.cloud.nacos.config.server-addr=ip:8848 #伺服器ip或本地ip
2.3 擷取相應的配置
@RefreshScope //打開動态重新整理功能
class SampleController {
@Value("${user.name}")
String userName;
@Value("${user.age}")
int age;
}
2.4 應用啟動
1.添加/application.properties2.App啟動server.port=18084 management.endpoints.web.exposure.include=*
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
2.5 原理
1.Nacos Config 資料結構
Nacos Config 主要通過 dataId 和 group 來唯一确定一條配置.
Nacos Client 從 Nacos Server 端擷取資料時,調用的是此接口
。
ConfigService.getConfig(String dataId, String group, long timeoutMs)
2.Spring Cloud 應用擷取資料
dataId
在 Nacos Config Starter 中,dataId 的拼接格式如下${prefix} - ${spring.profiles.active} . ${file-extension}
預設為
prefix
的值,也可以通過配置項
spring.application.name
來配置。
spring.cloud.nacos.config.prefix
spring.profiles.active
即為目前環境對應的 profile,詳情可以參考 Spring Boot文檔
注意,當 activeprofile 為空時,對應的連接配接符 - 也将不存在,dataId 的拼接格式變成 p r e f i x . {prefix}. prefix.{file-extension}
為配置内容的資料格式,可以通過配置項
file-extension
來配置。 目前隻支援
spring.cloud.nacos.config.file-extension
類型。
properties
group
預設為
group
,可以通過
DEFAULT_GROUP
配置。
spring.cloud.nacos.config.group
3.自動注入
Nacos Config Starter 實作了
org.springframework.cloud.bootstrap.config.PropertySourceLocator
接口,并将優先級設定成了最高。
在 Spring Cloud 應用啟動階段,會主動從 Nacos Server 端擷取對應的資料,并将擷取到的資料轉換成 PropertySource 且注入到 Environment 的 PropertySources 屬性中,是以使用 @Value 注解也能直接擷取 Nacos Server 端配置的内容。
4.動态重新整理
Nacos Config Starter 預設為所有擷取資料成功的 Nacos 的配置項添加了監聽功能,在監聽到服務端配置發生變化時會實時觸發
org.springframework.cloud.context.refresh.ContextRefresher
的 refresh 方法 。
如果需要對 Bean 進行動态重新整理,給類添加
或
@RefreshScope
注解。
@ConfigurationProperties
5.Endpoint 資訊檢視
Springboot支援這一點,Nacos Config也同時可以使用Endpoint來暴露資訊。
在maven 中添加
依賴,并在配置中允許 Endpoints 的通路。
spring-boot-starter-actuator
- Spring Boot 1.x 中添加配置 management.security.enabled=false
- Spring Boot 2.x 中添加配置 management.endpoints.web.exposure.include=*
Spring Boot 1.x 可以通過通路 http://127.0.0.1:18084/nacos_config 來檢視 Nacos Endpoint 的資訊。
Spring Boot 2.x 可以通過通路 http://127.0.0.1:18084/actuator/nacos-config 來通路。
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
2.6 更多
配置項 | key | 預設值 | 說明 |
服務端位址 | spring.cloud.nacos.config.server-addr | ||
DataId字首 | spring.cloud.nacos.config.prefix | spring.application.name | |
Group | spring.cloud.nacos.config.group | DEFAULT_GROUP | |
dataID字尾及内容檔案格式 | spring.cloud.nacos.config.file-extension | properties | dataId的字尾,同時也是配置内容的檔案格式,目前隻支援 properties |
配置内容的編碼方式 | spring.cloud.nacos.config.encode | UTF-8 | 配置的編碼 |
擷取配置的逾時時間 | spring.cloud.nacos.config.timeout | 3000 | 機關為 ms |
配置的命名空間 | spring.cloud.nacos.config.namespace | 常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源隔離等。 | |
AccessKey | spring.cloud.nacos.config.access-key | ||
SecretKey | spring.cloud.nacos.config.secret-key | ||
相對路徑 | spring.cloud.nacos.config.context-path | 服務端 API 的相對路徑 | |
接入點 | spring.cloud.nacos.config.endpoint | UTF-8 | 地域的某個服務的入口域名,通過此域名可以動态地拿到服務端位址 |
是否開啟監聽和自動重新整理 | spring.cloud.nacos.config.refresh.enabled | true |
3.Nacos Discovery 整合
Nacos Discovery Starter 完成 Spring Cloud 應用的服務注冊與發現。
3.1 添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.2 application.properties
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3.3 服務注冊和發現
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return string;
}
}
}
3.4 啟動Nacos服務端
- 通過從源代碼下載下傳或建構來安裝Nacos Server。推薦的最新版本Nacos Server
- 下載下傳Nacos Server 下載下傳頁面
- 從源代碼建構:通過git clone [email protected]擷取源代碼:來自Github Nacos的alibaba / Nacos.git并建構您的代碼。有關詳細資訊,請參閱建構
- 運作
- Linux / Unix / Mac,執行
sh startup.sh -m standalone
- Windows,執行
cmd startup.cmd
3.5 啟動用戶端
1.添加application.properties配置spring.application.name=service-provider server.port=18082
3.6 查詢服務
http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=service-provider
3.7 服務發現
Nacos Discovery Starter預設內建了Ribbon,是以對于使用Ribbon進行負載平衡的元件,您可以直接使用Nacos服務發現。
NacosServerList實作com.netflix.loadbalancer.ServerList接口并在@ConditionOnMissingBean下自動注入它。
使用RestTemplate和FeignClient
- 添加@LoadBlanced注釋以使Ribbon可以通路RestTemplate
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
- FeignClient預設內建了功能區,顯示了如何配置FeignClient。
使用@FeignClient批注将@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); }
接口包裝為FeignClient,其屬性名稱對應于服務名稱
EchoService
service-provider
。
方法的
注釋
@RequestMapping
将echo方法與URL對應
echo
,
/echo/{str}
注釋映射
@PathVariable
到
{str}
echo方法的參數的URL路徑中。
str
- 完成上述配置後,将它們注入TestController。
@RestController public class TestController { @Autowired private RestTemplate restTemplate; @Autowired private EchoService echoService; //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); } //FeignClient @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return echoService.echo(str); } }
- 添加application.properties配置
spring.application.name=service-consumer server.port=18083
- 運作
驗證
在浏覽器位址欄中輸入并單擊轉到,我們可以看到浏覽器顯示nacos-discovery-provider-example傳回的消息“hello Nacos Discovery 1234”,以證明服務發現有效。
http://127.0.0.1:18083/echo-rest/1234
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
在浏覽器位址欄中輸入并單擊轉到,我們可以看到浏覽器顯示nacos-discovery-provider-example傳回的消息“hello Nacos Discovery 12345”,以證明服務發現有效。
http://127.0.0.1:18083/echo-feign/12345
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
3.8 原理
服務注冊
在Spring雲應用程式的啟動階段,将監視WebServerInitializedEvent事件。在初始化Web容器後收到WebServerInitializedEvent事件時,将觸發注冊操作,并調用ServiceRegistry注冊方法以将服務注冊到Nacos Server。服務發現
NacosServerList實作com.netflix.loadbalancer.ServerList接口并在@ConditionOnMissingBean下自動注入它。功能區預設為內建。端點
Nacos Discovery Starter還支援Spring Boot執行器端點的實作。
先決條件:
将依賴spring-boot-starter-actuator添加到pom.xml檔案中,并配置端點安全政策。
Spring Boot 1.x:添加配置management.security.enabled = false
Spring Boot 2.x:添加配置management.endpoints.web.exposure.include = *
要檢視端點資訊,請通路以下URL:
Spring Boot1.x:Nacos Discovery端點URL是http://127.0.0.1:18083/nacos_discovery。
Spring Boot2.x:Nacos Discovery端點URL是http://127.0.0.1:18083/actuator/nacos-discovery。
![]()
Nacos整合SpringCloud(配置中心、注冊中心)
3.9 更多
配置項 | 鍵 | 預設值 | 描述 |
伺服器位址 | spring.cloud.nacos.discovery.server-addr | nacos注冊中心位址 | |
服務名 | spring.cloud.nacos.discovery.service | spring.application.name | 服務名 |
權重 | spring.cloud.nacos.discovery.weight | 1 | 值從1到100,值越大,重量越大 |
IP | spring.cloud.nacos.discovery.ip | ip address to registry,最高優先級 | |
網絡接口 | spring.cloud.nacos.discovery.network-interface | 未配置IP時,注冊的IP位址為網絡接口對應的IP位址。如果未配置此項,則預設采用第一個網絡接口的位址。 | |
端口 | spring.cloud.nacos.discovery.port | -1 | 注冊端口,無需配置即可自動檢測 |
namesapce | spring.cloud.nacos.discovery.namespace | 開發環境(dev、pro等) | |
accesskey | spring.cloud.nacos.discovery.access-key | ||
secretkey | spring.cloud.nacos.discovery.secret-key | ||
中繼資料 | spring.cloud.nacos.discovery.metadata | 擴充資料,使用Map格式配置 | |
日志名稱 | spring.cloud.nacos.discovery.log-name | ||
端點 | spring.cloud.nacos.discovery.endpoint | 服務的域名,通過該域名可以動态擷取伺服器位址。 | |
內建功能區 | ribbon.nacos.enabled | true |