總概
A、技術(shù)棧
- 開發(fā)語言:Java 1.8
- 數(shù)據(jù)庫:MySQL、Redis、MongoDB、Elasticsearch
- 微服務(wù)框架:Spring Cloud Alibaba
- 微服務(wù)網(wǎng)關(guān):Spring Cloud Gateway
- 服務(wù)注冊和配置中心:Nacos
- 分布式事務(wù):Seata
- 鏈路追蹤框架:Sleuth
- 服務(wù)降級與熔斷:Sentinel
- ORM框架:MyBatis-Plus
- 分布式任務(wù)調(diào)度平臺:XXL-JOB
- 消息中間件:RocketMQ
- 分布式鎖:Redisson
- 權(quán)限:OAuth2
- DevOps:Jenkins、Docker、K8S
B、源碼地址
C、本節(jié)實(shí)現(xiàn)目標(biāo)
- 項(xiàng)目[mall2]各server注冊到Nacos服務(wù),并通過Nacos服務(wù)名訪問接口。
- 使用Nacos命名空間,創(chuàng)建dev_id/dev_name命名空間用于注冊開發(fā)環(huán)境服務(wù)。
- 使用Naocs共享配置,將各個(gè)服務(wù)都需要用的配置抽取成common.yml。
- IDEA配置Active profiles
D、系列
- 微服務(wù)開發(fā)系列 第一篇:項(xiàng)目搭建
- 微服務(wù)開發(fā)系列 第二篇:Nacos
- 微服務(wù)開發(fā)系列 第三篇:OpenFeign
- 微服務(wù)開發(fā)系列 第四篇:分頁查詢
- 微服務(wù)開發(fā)系列 第五篇:Redis
- 微服務(wù)開發(fā)系列 第六篇:Redisson
- 微服務(wù)開發(fā)系列 第七篇:RocketMQ
- 微服務(wù)開發(fā)系列 第八篇:Elasticsearch
- 微服務(wù)開發(fā)系列 第九篇:OAuth2
- 微服務(wù)開發(fā)系列 第十篇:Gateway
- 微服務(wù)開發(fā)系列 第十一篇:XXL-JOB
- 微服務(wù)開發(fā)系列 第十二篇:MongoDB
- 微服務(wù)開發(fā)系列 第n篇:AOP請求日志監(jiān)控
- 微服務(wù)開發(fā)系列 第n篇:自定義校驗(yàn)注解
E、版本說明
- Nacos:2.0.0
- spring-cloud.version:Hoxton.SR9
- spring-boot.version:2.3.6.RELEASE
- alibaba.cloud.version:2.2.3.RELEASE
F、Nacos地址
Nacos官網(wǎng)文檔
Nacos官方GitHub地址
Nacos官方下載地址
G、Nacos部署環(huán)境
Nacos定義為一個(gè)IDC內(nèi)部應(yīng)用組件,并非面向公網(wǎng)環(huán)境的產(chǎn)品,建議在內(nèi)部隔離網(wǎng)絡(luò)環(huán)境中部署,強(qiáng)烈不建議部署在公共網(wǎng)絡(luò)環(huán)境。
H、Nacos支持三種部署模式
- 單機(jī)模式 - 用于測試和單機(jī)試用。
- 集群模式 - 用于生產(chǎn)環(huán)境,確保高可用。
- 多集群模式 - 用于多數(shù)據(jù)中心場景
一、Nacos安裝
可參考:
運(yùn)行成功后訪問:http://localhost:8848/nacos 。默認(rèn)賬號:nacos,密碼:nacos


二、服務(wù)mall-member接入Nacos
2.1 加nacos依賴
服務(wù)mall-pom服務(wù)加入naocs依賴,mall-pom.xml:
<!-- 管理子類所有的jar包的版本,這樣的目的是方便去統(tǒng)一升級和維護(hù) -->
<dependencyManagement>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<!-- 其他省略-->
</dependencyManagement>
<!-- 所有的子工程都會自動加入下面的依賴 -->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 其他省略-->
</dependencies>
2.2 yml配置
在mall-member服務(wù)的application-dev.yml配置中加入配置
spring:
application:
name: mall-member
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
2.3 重啟mall-member服務(wù)查看nacos服務(wù)列表

其他server接入nacos同理。
三、Nacos命名空間
3.1 Nacos如何支持多環(huán)境
在日常使用中常常需要不同的環(huán)境,比如日常,預(yù)發(fā),線上環(huán)境,如果是邏輯隔離可以使用命名空間,Nacos支持命名空間來支持多環(huán)境隔離,可以在Nacos控制臺創(chuàng)建多個(gè)命名空間。如果需要物理隔離,就要部署多套Nacos環(huán)境。
3.2 配置Nacos命名空間
默認(rèn)在Nacos中存在一個(gè)public命名空間,所有配置在沒有指定命名空間時(shí)都在這個(gè)命名空間中獲取配置,在實(shí)際開發(fā)時(shí)可以針對于不能環(huán)境創(chuàng)建不同的namespace空間。
注意:默認(rèn)空間不能刪除。
3.2.1 新增命名空間


【命名空間ID】如果在新增時(shí)沒有填寫的話,則Nacos服務(wù)端會自動隨機(jī)產(chǎn)生一個(gè)命名空間ID。 每個(gè)命名空間都有一個(gè)唯一ID,這個(gè)ID是讀取配置時(shí)指定空間的唯一標(biāo)識。點(diǎn)擊【確定】以后,在命名空間列表處會新增一行記錄。
建議:正式項(xiàng)目中,建議將【命名空間ID】和【命名空間名】設(shè)置成相同,即都設(shè)置成dev。此處只是為了比較清晰的說明在yml配置文件中ID和名字的區(qū)別,才設(shè)置了不同的名字。

3.2.2 yml配置
在mall-member服務(wù)的application-dev.yml配置中加入配置
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
namespace: dev_id
補(bǔ)充說明NO.1
有些文章會配置nacos用戶名和密碼,即如下所示:
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
username: nacos
password: abc123
discovery:
namespace: dev_id
其實(shí)這個(gè)用戶名和密碼是個(gè)Naocs的Dashboard登錄用的,服務(wù)注冊這里不需要配置,當(dāng)然配置了也不會報(bào)錯(cuò)。
3.2.3 重啟mall-member服務(wù)查看nacos服務(wù)列表
在dev_name命名空間下,顯示了mall-member服務(wù)。

四、修改Nacos登錄密碼和登錄名稱
一般安裝Nacos后登錄密碼默認(rèn)都是nacos/nacos,但是在正式的生成環(huán)境這樣肯定是不安全的。
4.1 Nacos單機(jī)默認(rèn)內(nèi)嵌的數(shù)據(jù)庫
Nacos單機(jī)模式默認(rèn)使用內(nèi)嵌的數(shù)據(jù)庫作為存儲引擎,所以我們無法直接去修改數(shù)據(jù),因此我們可以通過Nacos的Dashboard來修改密碼。


4.2 MySQL修改密碼
4.2.1 查看Nacos源碼加密方式
Nacos底層源碼是BCryptPasswordEncoder加密器加密,我們這里使用該加密器就可以。
package com.alibaba.nacos.console.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacos"));
}
public static Boolean matches(String raw, String encoded) {
return new BCryptPasswordEncoder().matches(raw, encoded);
}
public static String encode(String raw) {
return new BCryptPasswordEncoder().encode(raw);
}
}
使用 BCryptPasswordEncoder加密器加密
導(dǎo)入Security的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
加密得到密文
public class UserServerApplication {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacosDev"));
}
}

4.2.2 構(gòu)造用戶,修改密碼
復(fù)制到nacos的user表中password字段中,我這里構(gòu)造了用戶名:nacosDev,密碼也是使用的nacosDev加密的密文。

使用設(shè)置的用戶密碼登錄

五、Nacos共享配置
日常開發(fā)中,多個(gè)模塊可能會有很多共用的配置,比如數(shù)據(jù)庫連接信息,Redis 連接信息,RabbitMQ 連接信息,監(jiān)控配置等等。那么此時(shí),我們就希望可以加載多個(gè)配置,多個(gè)項(xiàng)目共享同一個(gè)配置之類等功能,Nacos Config 也確實(shí)支持。
5.1 新建common.yml
登錄Naocs平臺,在命名空間dev_name下新建common.yml配置文件,將公共的配置抽取出來放到該配置中,如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.100.51:3306/ac_db?serverTimezone=Asia/Shanghai&useUnicode=true&tinyInt1isBit=false&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: ac_u
password: ac_PWD_123
#hikari數(shù)據(jù)庫連接池
hikari:
pool-name: YH_HikariCP
minimum-idle: 10 #最小空閑連接數(shù)量
idle-timeout: 600000 #空閑連接存活最大時(shí)間,默認(rèn)600000(10分鐘)
maximum-pool-size: 100 #連接池最大連接數(shù),默認(rèn)是10
auto-commit: true #此屬性控制從池返回的連接的默認(rèn)自動提交行為,默認(rèn)值:true
max-lifetime: 1800000 #此屬性控制池中連接的最長生命周期,值0表示無限生命周期,默認(rèn)1800000即30分鐘
connection-timeout: 30000 #數(shù)據(jù)庫連接超時(shí)時(shí)間,默認(rèn)30秒,即30000
connection-test-query: SELECT 1
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.2 配置文件將application改成bootstrap
application.yml作用域在于當(dāng)前應(yīng)用有效,bootstrap.yml系統(tǒng)級別的配置有效(一般采用遠(yuǎn)程配置的時(shí)候才會用到)。
因此,將項(xiàng)目中原來的application.yml、application-dev.yml對應(yīng)改成bootstrap.yml、bootstrap-dev.yml 。
5.3 修改mall-member服務(wù)配置
bootstrap-dev.yml
server:
port: 8080
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: dev_id
file-extension: yml
shared-configs:
- data-id: common.yml
group: DEFAULT_GROUP
refresh: true
discovery:
namespace: dev_id
swagger:
enabled: true
title: 用戶服務(wù)
basePackage: com.ac.member.controller
version: 1.0
description: 用戶服務(wù)相關(guān)接口
bootstrap.yml
spring:
profiles:
active: dev
mall-product等其他服務(wù)配置同理。

5.4 重啟服務(wù)查看Nacos服務(wù)列表

六、IDEA配置Active profiles
各個(gè)環(huán)境的配置文件(比如切換開發(fā)和測試),我們之前都是通過bootstrap.yml配置來切換的,如下:
spring:
profiles:
active: dev
一般在項(xiàng)目開發(fā)中,團(tuán)隊(duì)里的每個(gè)成員一般都會自己建立一套獨(dú)立的命名空間,以免影響他人,如果每個(gè)人都來修改bootstrap.yml里的配置項(xiàng),代碼容易產(chǎn)生沖突,因此spring.profiles.active我們可以從bootstrap.yml中移除掉,在IDEA里進(jìn)行配置。


重啟服務(wù),配置文件走的是dev環(huán)境。
六、Nacos配置MySQL數(shù)據(jù)庫
參考官網(wǎng):Nacos部署手冊
6.1 前言
在 0.7 版本之前,在單機(jī)模式時(shí) nacos 使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲,不方便觀察數(shù)據(jù)存儲的基本情況。0.7 版本后增加了支持 mysql 數(shù)據(jù)源能力。
6.2 Nacos配置MySQL
nacos 支持配置多個(gè)數(shù)據(jù)庫,通過 db.num 和 db.url.index的配置來控制。nacos 配置 mysql 數(shù)據(jù)庫只需如下三點(diǎn)即可完成:
- 安裝數(shù)據(jù)庫,版本要求:5.6.5+
- 初始化mysql數(shù)據(jù)庫,數(shù)據(jù)庫初始化文件:nacos-mysql.sql
- 修改conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的url、用戶名和密碼。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.100.51:3306/ac_db?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=ac_u
db.password.0=ac_PWD_123



6.3 驗(yàn)證
動Nacos 后,打開Nacos 管理界面,在命名空間模塊,創(chuàng)建一個(gè)開發(fā)環(huán)境配置的命名空間dev_name ,如下圖所示:

此時(shí)再查看我們的數(shù)據(jù)庫表tenant_info中已有創(chuàng)建的dev_name記錄了,如下圖所示:
