由于Eureka的停更豆胸,導致新的替代產(chǎn)品Spring Cloud Alibaba逐漸受到重視湿蛔,從本文開始怎燥,筆者將和大家一起學習Spring Cloud Alibaba全家桶荠锭。
本文示例項目地址:https://gitee.com/zhaowenyi/spring-cloud-alibaba-demo
1. 認識Nacos
Nacos官網(wǎng) : https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos Wiki: http://github.com/alibaba/nacos/wiki
Nacos是Spring Cloud Alibaba中命名與配置中心呼股,其中的Na就是Naming服務命名注冊的縮寫耕魄,Co就是Cofiguration配置的縮寫。因此Nacos的功能相當于Eureka和Spring Cloud Config的組合彭谁。Eureka的停更吸奴,導致眾多開發(fā)者不得不選擇新的墻頭,正好阿里的Nacos經(jīng)歷了多年的歷練,成功地經(jīng)受住了大流量则奥,高并發(fā)的考驗考润,成為了新的翹楚。
本文將從安裝到配置詳細的介紹Nacos的基本使用读处。
2. 下載Nacos
操作系統(tǒng): Mac
Maven: 3.6.3
Nacos Server :2.0.2
Spring Boot: 2.3.7.RELEASE
Spring Cloud Alibaba: 2.2.2.RELEASE
Nacos相當于一個軟件糊治,需要下載安裝nacos-server。Nacos Server下載地址
https://github.com/alibaba/nacos/releases
本文使用2.0.2版本
筆者使用的是mac電腦罚舱,所以下載的是 [nacos-server-2.0.2.tar.gz]
解壓壓縮包
3. 啟動Nacos
打開終端井辜,進入到解壓后的bin目錄中
Nacos啟動模式有單機模式和集群模式,在測試環(huán)境下我們以單機模式啟動管闷。執(zhí)行以下命令粥脚,以單機模式啟動
sh startup.sh -m standalone
如果出現(xiàn)以下內(nèi)容,說明啟動成功
4. 登錄Nacos
啟動成功后包个,在瀏覽器中輸入http://127.0.0.1:8848/nacos/#/login刷允,然后可以訪問到如頁面表示啟動成功。
賬號:nacos
密碼:nacos
登錄成功后碧囊,進入到以下頁面
5. 停止Nacos
進入安裝包的bin目錄树灶,執(zhí)行以下命令,停止Nacos
sh shutdown.sh
出現(xiàn)以下內(nèi)容呕臂,說明停止成功
6. 以Nacos作為注冊中心
服務的注冊與發(fā)現(xiàn)都是在nacos server端破托,每個微服務注冊到nacos server端即可肪跋,因此我們不需要像Eureka一樣新增一個Eureka Server項目歧蒋。在此例中,我們將創(chuàng)建兩個項目州既,一個是服務提供者provider-8081谜洽,一個服務消費者consumer-8091。
6.1 IDEA安裝插件Alibaba Cloud Toolkit
preferences -> plugins -> 搜索Alibaba Cloud 吴叶,選擇Alibaba Cloud Toolkit進行安裝
-
安裝后阐虚,重啟IDEA。在新建工程的面板左側找到 Alibaba Java Initializer蚌卤,選擇工程 SDK 1.8实束,點擊下一步;
image.png
2.選擇工程元數(shù)據(jù)逊彭,輸入maven坐標咸灿,點擊下一步;
- 左側邊欄是可以引入的工具,左側欄選擇Spring Cloud Alibaba侮叮,勾選Nacos Service Discovery和Nacos Configuration后避矢,點擊下一步;
- 選擇項目的存儲路徑后,點擊finish完成。
6.2 新建provider-8081項目
- 按照上面的步驟創(chuàng)建provider-8081項目审胸,項目結構如下
- 完整的pom.xml內(nèi)容如下亥宿,其中主要是spring-cloud-starter-alibaba-nacos-discovery這個依賴
<?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>
<groupId>com.elio.springcloud.alibaba.demo</groupId>
<artifactId>provider-8081</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-8081</name>
<description>Demo project for Spring Cloud Alibaba</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.4.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.elio.springcloud.alibaba.demo.Provider8081Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- NacosDiscoveryConfiguration 主要是啟用Nacos Client,作為客戶端注冊到服務中心
package com.elio.springcloud.alibaba.demo.nacosdiscovery;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;
/**
* @author <a href="mailto:chenxilzx1@gmail.com">theonefx</a>
*/
@EnableDiscoveryClient
@Configuration
public class NacosDiscoveryConfiguration {
}
- application.properties內(nèi)容如下砂沛,主要是配置Nacos Server的地址
# 應用名稱
spring.application.name=provider-8081
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發(fā)現(xiàn)與注冊配置烫扼,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public
server.port=8081
- 啟動項目碍庵,如果啟動日志出現(xiàn)以下記錄材蛛,說明注冊成功
nacos registry, DEFAULT_GROUP provider-8081 172.18.41.106:8081 register finished
- 查看Nacos管理界面,發(fā)現(xiàn)已經(jīng)成功注冊了provider-8081
6.3 新建provider-8081項目
- 同provider-8081項目怎抛,新增consumer-8091項目卑吭,項目結構如下
- pom.xml完整內(nèi)容如下
<?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>
<groupId>com.elio.springcloud.demo</groupId>
<artifactId>consumer-8091</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer-8091</name>
<description>Demo project for Spring Cloud Alibaba</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.elio.springcloud.demo.Consumer8091Application</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- application.properties內(nèi)容如下
# 應用名稱
spring.application.name=consumer-8091
# 應用服務 WEB 訪問端口
server.port=8091
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發(fā)現(xiàn)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace马绝,默認為 public
spring.cloud.nacos.discovery.namespace=public
- 啟動項目豆赏,注冊成功
6.4 總結
至此,我們已經(jīng)成功將兩個項目成功注冊到Nacos上富稻。通過注冊中心掷邦,服務可以拉取到別的服務的相關信息。
7 以Nacos作為配置中心
7.1 相關概念
- profile概念
Java項目中的配置文件一般分為多個環(huán)境配置椭赋,生產(chǎn)環(huán)境(prod)抚岗,測試環(huán)境(test),開發(fā)環(huán)境(dev)哪怔,然后通過spring.profiles.active可以指定使用哪個環(huán)境的配置宣蔚。比如sspring.profiles.active=dev將會讀取application-dev.properties的配置內(nèi)容。
當項目配置文件眾多认境,修改了配置文件內(nèi)容還需要重啟服務胚委,導致配置文件難以管理。Nacos Config的作用就是將這些配置文件集中管理起來叉信,從而可以統(tǒng)一管理并且可以修改實時刷新亩冬。
- NameSpace概念
NameSpace 默認是public,可以區(qū)分不同的環(huán)境硼身,比如dev,test,prod等硅急。
- Group概念
如果配置文件名相同,可以用Group區(qū)分佳遂,因此可以區(qū)分不同項目中营袜,配置文件名相同的配置。Group 默認為 DEFAULT_GROUP讶迁,可以通過 spring.cloud.nacos.config.group 來配置连茧,當配置項太多或者有重名時核蘸,可以通過分組來方便管理。
- Data Id概念
在使用Nacos Config的過程中啸驯,數(shù)據(jù)存儲在Data Id下面客扎,一個Data Id對應一個profile文件。
Data ID的拼接格式:{spring.profiles.active} . ${file-extension}
prefix 默認為 spring.application.name 的值罚斗,也可以通過配置項 spring.cloud.nacos.config.prefix 來配置
spring.profiles.active 取 spring.profiles.active 的值徙鱼,即為當前環(huán)境對應的 profile
file-extension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置
7.2 引入Nacos Config依賴
接下來的例子都以provider-8081為例针姿,來介紹如何使用Nacos Config
- pom.xml引入以下依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- application.properties新增以下配置
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace袱吆。需要注意,如果使用 public 的 namcespace 距淫,請不要填寫這個值绞绒,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.cloud.nacos.config.prefix= ${spring.application.name}
# 默認是DEFAULT_GROUP
# spring.cloud.nacos.config.group=
- 新增測試接口com/elio/springcloud/alibaba/demo/controller/TestController.java
package com.elio.springcloud.alibaba.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName : TestController
* @Description : 測試
* @Author : zhaowenyi
* @Date: 2021/06/23
*/
@RestController
public class TestController {
@Value("${nacos.config.test:hello world}")
private String testValue;
@GetMapping(value = "/hello")
public String hello() {
return testValue;
}
}
- Nacos 管理界面,新增配置
- 測試接口, 成功獲取到dev的配置
如果修改配置榕暇,可以實時刷新
- 回滾配置
參考:
https://blog.csdn.net/qq_42200163/article/details/109711035