目錄
前言
記錄下Nacos的整合過程
環境
Win 10 + Spring Cloud Hoxton.SR9 + Spring Cloud Alibaba 2.2.6.RELEASE + Nacos 1.4.2
Nacos是什么?
Nacos是一個服務發現組件,也是一個配置服務器,Nacos解決的兩個問題:
1、服務A怎么找到服務B
2、管理微服務的配置
Nacos官方文檔:https://nacos.io/zh-cn/docs/what-is-nacos.htmlNacos簡易架構圖

服務發現原理
-
服務發現機制
服務發現機制就是服務消費者總能找到服務提供者的機制,舉個例子:服務發現就像手機中的名片夾,記錄一個人所有的聯系方式,通過該名片可以聯系到某個人,而當某個聯系方式不存在時(服務DOWN)就將其從名片夾中刪除。 -
用於生產的服務發現機制:
1、在微服務上做緩存,定時任務發送當前的地址,調用時取緩存中微服務的地址,該做法好處首先是壓力小,不用每次都去實時取,其次是即使服務發現組件崩潰也可以取到緩存中的值,只是無法更新緩存中的值。
2、每個微服務實例都向服務發現組件發送心跳(即一次請求),告訴服務發現組件自己是活着的,如果服務發現組件發現某一個實例長時間未向自己發送心跳,即認為該實例已掛,將其健康狀態標記為DOWN,服務消費者即不再調用該實例。
搭建 Nacos Server
Nacos Server 下載地址
https://github.com/alibaba/nacos/releases
Nacos Server 的版本選擇
Nacos Server的版本選擇參照標准在spring-cloud-alibaba-dependencies-xxx.pom中有記錄,如我的Spring Cloud Alibaba的版本是2.2.6.RELEASE,其推薦的版本是1.4.2

運行 Nacos Server
- 官方文檔:https://nacos.io/zh-cn/docs/quick-start.html
- 解壓縮下載好的
Nacos壓縮包 cmd運行啟動命令
startup.cmd -m standalone

- 訪問
http://localhost:8848/nacos/#/login(默認端口是8848)

- 默認登錄賬號/密碼:
nacos/nacos

... Nacos Server 搭建完畢
Nacos Client 注冊
user-center 用戶中心微服務注冊
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.coisini</groupId>
<artifactId>user-center</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-center</name>
<description>user-center project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--spring-cloud-starter-{spring cloud子項目的名稱}-[{模塊名稱}]-->
<!-- 注冊中心客戶端 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!-- 整合spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 整合spring cloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</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>
</project>
application.yml
spring:
application:
# 服務名稱
name: user-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
- 啟動項目
- 訪問
Nacos

content-center 內容中心微服務注冊
pom.xml依賴同上application.yml
spring:
application:
# 服務名稱
name: content-center
cloud:
nacos:
discovery:
# 指定nacos server的地址
server-addr: localhost:8848
- 訪問
Nacos

服務發現測試
- 內容中心編寫測試代碼
@RestController
public class TestController {
@Autowired
private DiscoveryClient discoveryClient;
/**
* 測試:服務發現,證明內容中心總能找到用戶中心
* @return 用戶中心所有實例的地址信息
*/
@GetMapping("test")
public List<ServiceInstance> getInstances() {
// 查詢指定服務的所有實例的信息
return discoveryClient.getInstances("user-center");
}
}
- 如下所示,內容中心可以獲取到用戶中心所有實例的地址信息

測試用例
內容中心調用用戶中心的實例
user-center
TestController.java
@RestController
public class TestController {
@GetMapping("/test/{name}")
public String test(@PathVariable String name) {
return "hello " + name;
}
}
content-center
TestController.java
@RestController
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestController {
private final DiscoveryClient discoveryClient;
@GetMapping("test1")
public String test1() {
// 用戶中心所有實例信息
List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
String targetUrl = instances.stream()
.map(instance -> instance.getUri().toString() + "/test/{name}")
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("當前沒有實例"));
log.info("目標地址:{}", targetUrl);
// 調用用戶微服務獲取用戶信息
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(
targetUrl,
String.class,
"Coisini"
);
}
}
測試結果

項目源碼
GitHub: https://github.com/Maggieq8324/coisini-cloud-alibabaGitee: https://gitee.com/maggieq8324/coisini-cloud-alibaba
