前文
SpringCloud —— 服務註冊進 Eureka 集羣
SpringCloud —— SpringCloud Consul 實現服務註冊中心
SpringCloud —— HystrixDashboard 服務監控
SpringCloud —— Sleuth 分佈式請求鏈路跟蹤
文章目錄
Nacos 是什麼?
一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺
簡單地說:Nacos 就是註冊中心 + 配置中心的結合
等價於 Nacos = Eureka + Config + Bus
Nacos 能幹嘛?
-
替代 Eureka 做服務註冊中心
-
替代 Config 做服務配置中心
各種註冊中心比較
服務註冊發現框架 | CAP 模型 | 控制檯管理 | 社區活躍度 |
---|---|---|---|
Eureka | AP | 支持 | 低(2.X 版本閉源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
Nacos 下載啓動
Nacos 的下載地址 https://github.com/alibaba/nacos/releases
下載之後解壓打開 bin 目錄,雙擊 startup.cmd 即可啓動 Nacos
啓動之後會出現 Nacos 的字樣
Nacos 訪問
啓動之後訪問 http://localhost:8848/nacos 即可訪問 Nacos 控制檯,但是需要先登錄,用戶名和密碼默認都爲 nacos
登錄之後即可跳轉到控制檯
Nacos 作爲服務註冊中心演示
官方文檔
官方文檔地址 https://spring.io/projects/spring-cloud-alibaba#learn ,目前當前最新的版本是 2.1.0
這是 SpringCloud Alibaba 的一個依賴
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
基於 Nacos 的服務提供者
新建 Module
POM
這裏需要添加兩個 POM ,一個是父 POM ,一個是本 POM(當然,如果你只有一個微服務的話那就都添加到一個 POM 就行了)
父 POM 中需要添加以下依賴
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
本 POM(如果你只是想測試 Nacos 服務註冊的話直接添加 Nacos 的依賴就行了)
<dependencies>
<!-- SpringCloud Alibaba Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web組件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
主要是這個依賴
application.yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置地址
# 監控端點全部打開
management:
endpoints:
web:
exposure:
include: '*'
啓動類
記得加上 @EnableDiscoveryClient 註解
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author Woo_home
* @create 2020/5/20 11:28
*/
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args){
SpringApplication.run(PaymentMain9001.class, args);
}
}
業務類
簡單返回字符串就行
package com.java.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Woo_home
* @create 2020/5/20 11:29
*/
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "Nacos register, serverPort: " + serverPort + "\t id: " + id;
}
}
測試
運行啓動類
刷新一下 Nacos 的控制檯界面,點擊服務列表選項,可以發現我們的服務已經註冊進來了(這跟 Eureka 是類似的,這裏也不多說了),集羣數量爲 1,實例數爲 1 等等
我們點擊一下詳情
點擊詳情選項可以詳細地查看服務信息
更多操作這裏就不一一展示了,感興趣的朋友可以自己玩下
如果你想拒絕這個服務註冊,你還可以點擊刪除操作
新建模塊 9002(與 9001 一樣的服務提供者)
與模塊 9001 一樣即可(依賴,配置,代碼都是一樣即可)
啓動 9001 和 9002
刷新一下 Nacos 控制檯,可以發現,現在已經有兩個服務了,實例數爲 2
也可以點擊詳情進去看下
基於 Nacos 的服務消費者
新建 Module
POM
老規矩,主要是 nacos 的依賴,其它根據需要添加
<dependencies>
<!-- SpringCloud Alibaba Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web組件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
application.yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置地址
# 消費者將要去訪問的微服務名稱(註冊成功進 Nacos 的微服務提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
啓動類
跟前兩個模塊的啓動類是一樣的
package com.java.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author Woo_home
* @create 2020/5/20 12:26
*/
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args){
SpringApplication.run(OrderNacosMain83.class, args);
}
}
配置類
配置類很簡單,只需要聲明一個 bean 就行了,爲什麼要這個 bean,等會兒會說
package com.java.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author Woo_home
* @create 2020/5/20 12:28
*/
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
業務類
package com.java.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* @author Woo_home
* @create 2020/5/20 12:29
*/
@RestController
@Slf4j
public class OrderNacosController {
@Resource // 寫成 @Autowrie 也行,隨你喜歡
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
測試
啓動三個微服務
刷新一下 Nacos 控制檯,現在已經成功註冊三個服務了(兩個服務提供者,一個服務消費者)
訪問 http://localhost:83/consumer/payment/nacos/13 測試一下,報錯了。。。
原因是我們沒有在 RestTemplate 加上 @LoadBalanced 註解,加上就行了
添加 @LoadBalanced 註解之後啓動服務,再次訪問 http://localhost:83/consumer/payment/nacos/13 測試下,現在返回的是 9002 端口的服務
再次刷新一下,現在返回的是 9001 端口的微服務
爲什麼 Nacos 自帶負載均衡?
學過 Ribbon 的朋友會發現(沒學過也沒關係,這裏有文章可以看下 SpringCloud —— Ribbon),這不是負載均衡麼?是的,這是 Nacos 自帶的負載均衡,爲什麼 Nacos 會自帶負載均衡呢?因爲 spring-cloud-starter-alibaba-nacos-discovery 依賴裏面添加了 Ribbon 的依賴,也可以說 Nacos 整合了 Ribbon,所以 Nacos 就默認支持了負載均衡
完整代碼已上傳至碼雲 代碼下載地址