1、參考文檔
Spring Cloud Alibaba參考文檔 https://spring-cloud-alibaba-group.github.io/github-pages/hoxton/zh-cn/index.html
Spring Cloud Alibaba官方文檔 https://github.com/alibaba/spring-cloud-alibaba/wiki/
2、引入 Alibaba 依賴
每個 SpringBoot 都有對應的 Spring Cloud 以及 Spring Cloud Alibaba 版本,為了避免依賴沖突,引入依賴前請查閱 版本說明。
以下是 SpringBoot 2.6.11 對應的版本依賴。
https://github.com/alibaba/spring-cloud-alibaba/wiki/版本說明
<properties><spring.boot.version>2.6.11</spring.boot.version><spring.cloud.version>2021.0.4</spring.cloud.version><spring.cloud.alibaba.version>2021.0.4.0</spring.cloud.alibaba.version>
</properties><dependencyManagement><dependencies><!-- spring boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 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>
依賴引入后,若無爆紅,terminal 執行命令:
mvn clean install
有 finish 提示代表項目依賴成功引入。
回到頂部
3、啟動 Nacos 服務
Nacos 是動態的服務注冊與發現、配置管理平臺,想詳細了解 Nacos 請查閱 Nacos 控制臺手冊,這里粗略地給出壓縮包方式的安裝步驟。
3.1、下載
壓縮包下載地址:https://github.com/alibaba/nacos/releases。
選擇 .zip 后綴文件進行下載,下載完成后解壓:
3.2、啟動
解壓完成后, 進入 bin 目錄, cmd 執行命令:
- ?Linux/Unix/Mac:sh startup.sh -m standalone,
- 如果是 ubuntu 系統或提示報錯,執行bash startup.sh -m standalone (standalone 代表著單機模式運行,非集群模式)。
- Windows: startup.cmd -m standalone
3.3、訪問
啟動成功訪問地址:http://localhost:8848/nacos
配置中心界面如下圖:
到這里 Nacos 啟動步驟結束。
4、創建 nacos-provider 服務提供者
在上文講到 nacos 有服務發現的功能,在這里需要兩個角色
nacos-provider: 注冊進入 nacos-server, 對外暴露服務
nacos-consumer: 注冊進入 nacos-server, 調用 nacos-provider的服務。
4.1、引入依賴
首先創建 nacos-provider模塊,由于使用了多模塊聚合項目,這里直接添加spring-cloud-starter-alibaba-nacos-discovery 依賴:
<!-- nacos服務發現 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2、配置 yml 文件
配置 yml 首先需要知道每個參數代表的含義,下面是配置列表:
配置項 | Key | 默認值 | 說明 |
---|---|---|---|
服務端地址 | spring.cloud.nacos.discovery.server-addr | Nacos Server | |
服務名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 注冊的服務名 |
權重 | spring.cloud.nacos.discovery.weight | 1 | 取值范圍 1 到 100數值越大,權重越大 |
網卡名 | spring.cloud.nacos.discovery.network-interface | 當IP未配置時 | |
注冊的IP地址 | spring.cloud.nacos.discovery.ip | 優先級最高 | |
注冊的IP地址類型 | spring.cloud.nacos.discovery.ip-type | IPv4 | 可以配置IPv4和IPv6兩種類型,如果網卡同類型IP地址存在多個,希望制定特定網段地址,可使用spring.cloud.inetutils.preferred-networks配置篩選地址 |
注冊的端口 | spring.cloud.nacos.discovery.port | -1 | 默認情況下不用配置,會自動探測 |
命名空間 | spring.cloud.nacos.discovery.namespace | 常用場景之一是不同環境的注冊的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等 | |
AccessKey | spring.cloud.nacos.discovery.access-key | 當要上阿里云時,阿里云上面的一個云賬號名 | |
SecretKey | spring.cloud.nacos.discovery.secret-key | 當要上阿里云時,阿里云上面的一個云賬號密碼 | |
Metadata | spring.cloud.nacos.discovery.metadata | 使用Map格式配置,用戶可以根據自己的需要自定義一些和服務相關的元數據信息 | |
日志文件名 | spring.cloud.nacos.discovery.log-name | ||
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | Nacos集群名稱 |
接入點 | spring.cloud.nacos.discovery.endpoint | 地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址 | |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都設置成true即可 |
是否開啟Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以設置成false來關閉 watch |
接下來配置 yml 文件:
server:port: 9001
spring:application:## 指定服務名稱,在nacos中的名字name: nacos-providercloud:nacos:discovery:# nacos的服務地址,nacos-server中IP地址:端口號server-addr: 127.0.0.1:8848
management:endpoints:web:exposure:## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯include: '*'
4.3、開啟服務發現
在啟動類添加@EnableDiscoveryClient開啟服務發現的功能:
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}}
4.4、編寫測試接口
作為服務提供者,需要提供接口給服務消費者,下面是隨意編寫的測試接口:
@RestController
@RequestMapping("/nacos")
public class NacosController {@GetMapping("/test")public String test(){return "成功訪問服務者接口";}
}
4.5、啟動項目
項目啟動成功后,訪問 nacos控制臺 -> 服務管理 -> 服務列表,可以看到 nacos-provider已成功注冊進來:
5、創建 nacos-consumer 服務消費者
既然已經有了服務提供者,那么相應的就需要消費者去消費暴露出來的接口,nacos-consumer的創建步驟與nacos-provider類似。
5.1、引入依賴
<!-- nacos服務發現 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
5.2、配置 yml 文件
server:port: 9002
spring:application:name: nacos-consumercloud:nacos:discovery:# nacos的服務地址server-addr: 127.0.0.1:8848
management:endpoints:web:exposure:## yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯include: '*'
#調用的微服務名稱,這里指服務提供者
service-url:nacos-provider: http://nacos-provider
5.3、開啟服務發現
同樣在啟動類添加@EnableDiscoveryClient開啟服務發現:
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}
5.4、編寫測試接口
在 Spring Cloud Nacos 2021 以后就沒有在默認使用 Ribbon 作為負載均衡器了,而且在Cloud官網中也推薦使用LoadBalancer 作為負載均衡器,對此先引入依賴:
引入 LoadBalancer依賴:
<!--loadbalancer負載均衡器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
創建RestTemplate,如下:
@Configuration
public class RestTemplateConfig {/*** 注入 RestTemplate* * @return*/
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
``
編寫接口調用 nacos-provider服務暴露出來的接口:
``
@RestController
@RequestMapping("/nacos")
public class NacosController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate LoadBalancerClient loadBalancerClient;@Value("${service-url.nacos-provider}")private String serviceUrl;@GetMapping("/getMessage")public String test(){//使用 LoadBalanceClient 和 RestTemplate 結合的方式來訪問ServiceInstance serviceInstance = loadBalancerClient.choose(serviceUrl);//調用 nacos-provider 的接口String url = String.format("http://%s:%s/nacos/test",serviceInstance.getHost(),serviceInstance.getPort());return restTemplate.getForObject(url,String.class);}
}
5.5、啟動項目
啟動 nacos-consumer服務,可以看得到服務提供者與服務消費者都已經注冊進來:
接下來要做的事情是調用 nacos-consumer的接口,輸入地址:
http://localhost:9002/nacos/getMessage:
成功調用 nacos-provider接口。
6、Nacos Config 服務配置中心
6.1、引入依賴
Nacos 不只有服務注冊與發現的功能,還擁有配置管理的功能, 下面是配置管理的參數列表及代表的含義:
配置項 | Key | 默認值 | 說明 |
---|---|---|---|
服務端地址 | spring.cloud.nacos.config.server-addr | Nacos Server 啟動監聽的ip地址和端口 | |
配置對應的 | DataId spring.cloud.nacos.config.name | 先取 prefix,再取 name,最后取 spring.application.name | |
配置對應的 | DataId spring.cloud.nacos.config.prefix | 先取 prefix,再取 name,最后取 spring.application.name | |
配置內容編碼 | spring.cloud.nacos.config.encode | 讀取的配置內容對應的編碼 | |
GROUP | spring.cloud.nacos.config.group | DEFAULT_GROUP | 配置對應的組 |
文件擴展名 | spring.cloud.nacos.config.fileExtension | properties | 配置項對應的文件擴展名,目前支持 properties 和 yaml(yml) |
獲取配置超時時間 | spring.cloud.nacos.config.timeout | 3000 | 客戶端獲取配置的超時時間(毫秒) |
接入點 | spring.cloud.nacos.config.endpoint | 地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址 | |
命名空間 | spring.cloud.nacos.config.namespace | 常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等 | |
AccessKey | spring.cloud.nacos.config.accessKey | 當要上阿里云時,阿里云上面的一個云賬號名 | |
SecretKey | spring.cloud.nacos.config.secretKey | 當要上阿里云時,阿里云上面的一個云賬號密碼 | |
Nacos Server 對應的 context path | spring.cloud.nacos.config.contextPath | Nacos Server 對外暴露的 context path | |
集群 | spring.cloud.nacos.config.clusterName | 配置成Nacos集群名稱 | |
共享配置 | spring.cloud.nacos.config.sharedDataids | 共享配置的 DataId, “,” 分割 | |
共享配置動態刷新 | spring.cloud.nacos.config.refreshableDataids | 共享配置中需要動態刷新的 DataId, “,” 分割 | |
自定義 Data Id 配置 | spring.cloud.nacos.config.extConfig | 屬性是個集合,內部由 Config POJO 組成。Config 有 3 個屬性,分別是 dataId, group 以及 refresh |
同上面的步驟類似,這里首先要做的一步是引入依賴, 使用 group ID 為 com.alibaba.cloud 和 artifact ID 為 spring-cloud-starter-alibaba-nacos-config 的 starter:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
從 SpringCloud 2020 版本開始bootstrap 文件便失效了,需要手動導入相應的依賴:
<!-- bootstrap 文件生效 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
bootstrap.properties/yml文件優先級高于 application.properties/yml。
6.2、配置 yml 文件
在 bootstrap.yml添加以下配置:
server:port: 9003spring:application:name: nacos-config# 當前環境,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}profiles:active: devcloud:nacos:config:# nacos的地址,作為配置中心server-addr: 127.0.0.1:8848## 配置內容的數據格式,目前只支持 properties 和 yaml 類型,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}file-extension: properties
management:endpoints:web:exposure:# yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯include: '*'
6.3、dataId 的含義
dataId 是一個配置的唯一標識,格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix:前綴,默認是spring.cloud.nacos.config.prefix的值,再是 spring.cloud.nacos.config.name的值, 最后是 spring.application.name的值。
spring.profiles.active: 即為當前環境對應的 profile。當 spring.profiles.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 p r e f i x . {prefix}. prefix.{file-extension}。
file-exetension 為配置內容的數據格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 類型。
6.4、Nacos 添加配置
在 Nacos 中 添加一個 user.age配置,如下圖:
填寫完后點擊發布保存配置,如下圖:
6.5、獲取 Nacos 配置
新建一個 entity 用于接收配置:
@Component
public class ConfigUser {@Value("${user.age}")private Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
新建一個 controller, 用于測試:
@RestController
@RequestMapping("/config")
public class NacosConfigController {@Autowiredprivate ConfigUser configUser;@GetMapping("/test")public String test() {return "current user age is:" + configUser.getAge();}
}
啟動項目,訪問 http://localhost:9003/config/test 接口,成功讀取到配置信息:
6.6、動態刷新配置
我們肯定不想每次配置完都重啟項目,想要實現動態刷新需要添加注解@RefreshScope,將注解標注在對應的類上,如下:
@Component
@RefreshScope
public class ConfigUser {@Value("${user.age}")private Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
重啟項目完畢,修改 Nacos 中的 user.age=20,然后訪問接口:
執行結果
發現配置自動更新了。6.7、多環境隔離(NameSpace)
正常的業務開發分為以下三個環境:
···
dev:本地開發環境
test:測試環境
prod:生產環境
···
雖然 dataId能夠唯一的區分每一個配置文件,但是當微服務配置多了,很難查找每個環境的配置,因此有了 NameSpace即命名空間來隔離每個環境的配置。
我們創建了以下三個命名空間:
注意:上圖中的命名空間ID是系統自動生成的唯一 ID,后續指定不同的Namespace 就用這個 ID。
Nacos 默認的命名空間是 public, 在 test命名空間添加 user.age=30的配置,如下圖:
bootstrap.yml 修改配置如下:
spring:application:name: nacos-config# 當前環境,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}profiles:active: testcloud:nacos:config:# nacos的地址,作為配置中心server-addr: 127.0.0.1:8848# 配置內容的數據格式,目前只支持 properties 和 yaml 類型,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}file-extension: properties# 命名空間IDnamespace: f633bb70-eb73-4944-b752-ad8f03881181
配置完畢,重啟項目訪問 http://localhost:9003/config/test 接口,如下:
成功讀取配置。
6.8、不同業務隔離(Group)
不同的微服務可能有著不同的配置,例如商品系統與訂單系統通過分庫分別訪問不同的數據庫,意味著有不同的數據庫配置,此時就需要根據Group即組進行配置的區分,
例如Goods_Group、Order_Group, 默認的是 DEFAULT_GROUP。
在 nacos添加配置user.age=40,命名空間為test, 分組為Goods_Group:
在 bootstrap.yml指定分組,配置如下:
spring:application:name: nacos-config# 當前環境,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}profiles:active: testcloud:nacos:config:# nacos的地址,作為配置中心server-addr: 127.0.0.1:8848# 配置內容的數據格式,目前只支持 properties 和 yaml 類型,這個和dataId有關-> ${prefix}-${spring.profiles.active}.${file-extension}file-extension: properties# 指定命名空間IDnamespace: f633bb70-eb73-4944-b752-ad8f03881181# 指定分組group: Goods_Group
重啟項目后再次訪問 http://localhost:9003/config/test 接口,如下:
讀取配置成功。
6.9、共享配置
當微服務數量增多,一般會有相同的配置,那如何把相同的配置提取出來實現共享呢?
在 Nacos添加 share-config1.properties及share-config2-properties配置,如下:
注意:dataId的后綴一定要為properties或 yml。
share-config1.properties的配置為 user.name=lin
share-config2.properties的配置為 user.age=50
新建module,命名為nacos-config-share,依賴同nacos-config一樣。
bootstrap.yml配置如下:
server:port: 9004spring:application:name: nacos-config-sharecloud:nacos:config:# nacos的地址,作為配置中心server-addr: 127.0.0.1:8848## 共享配置,List集合,可以配置多個shared-configs:## dataId:配置文件的dataId,必須帶有后綴- dataId: share-config1.properties## refresh:指定是否能夠動態刷新,默認是falserefresh: true- dataId: share-config2.properties## 指定配置文件的分組,默認是DEFAULT_GROUPgroup: Goods_Group
management:endpoints:web:exposure:# yml文件中存在特殊字符,必須用單引號包含,否則啟動報錯include: '*'
可以看到:
通過 spring.cloud.nacos.config.shared-configs[n].data-id 來支持多個共享 Data Id 的配置。
通過 spring.cloud.nacos.config.shared-configs[n].group 來配置自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP。
通過 spring.cloud.nacos.config.shared-configs[n].refresh 來控制該Data Id在配置變更時,是否支持應用中動態刷新,默認false。
新建 entity,用于接收共享配置,如下:
@Component
@RefreshScope
public class ConfigUser {@Value("${user.name}")private String name;@Value("${user.age}")private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
新建controller,用于接收共享配置,如下:
@RestController
@RequestMapping("/config")
public class NacosConfigShareController {@Autowiredprivate ConfigUser configUser;@GetMapping("/test")public String test() {return "current user name is:" + configUser.getName() + " , and age is:" + configUser.getAge();}
}
啟動項目,訪問 http://localhost:9004/config/test, 如下:
成功訪問到 share-config1.properties及 share-config2.properties的共享配置。
到這里 Nacos的基本用法介紹完畢,了解更多詳細信息參考官方Nacos config文檔。
參考文檔:
https://github.com/alibaba/spring-cloud-alibaba/wiki/
https://juejin.cn/post/6990146025545531405#heading-31
https://developer.aliyun.com/article/1082538