【SpringCloud】黑馬學習筆記-Nacos

Goldtron發表於2024-05-14

# 1. Nacos安裝(黑馬教程安裝材料)
## 1.1 Windows安裝
開發階段採用單機安裝即可。
### 1.1.1 下載安裝包

在Nacos的GitHub頁面,提供有下載連結,可以下載編譯好的Nacos服務端或者原始碼:

GitHub主頁:https://github.com/alibaba/nacos

GitHub的Release下載頁:https://github.com/alibaba/nacos/releases

如圖:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/d4b8bb5af28d497db1393c96952d11e4.png)

課程採用1.4.1.版本的Nacos
windows版本使用`nacos-server-1.4.1.zip`包即可。
### 1.1.2 解壓
將這個包解壓到任意非中文目錄下,如圖:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/b6739312a0c2418a9a6f6203aa95ff36.png)
目錄說明:
- bin:啟動指令碼
- conf:配置檔案
### 1.1.3 埠配置

Nacos的預設埠是8848,如果你電腦上的其它程序佔用了8848埠,請先嚐試關閉該程序。

**如果無法關閉佔用8848埠的程序**,也可以進入nacos的conf目錄,修改配置檔案中的埠:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/918a6c88a4ec41259f324225fa9856a5.png)
修改其中的內容:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/9a53664f1e26424b9d2e2398c0608c90.png)
### 1.1.4 啟動
進入bin目錄,結構如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/9f69bae6af9e4a7da12f60d548dd8f55.png)
然後執行命令即可:

- windows命令:

```bash
startup.cmd -m standalone
```
執行後的效果如圖:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/fa15be664dd9498da67308cab83fecab.png)
### 1.1.5 訪問
在瀏覽器輸入地址:http://127.0.0.1:8848/nacos即可:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/db01a6773d7d4bcf97150e036f8f774a.png)
預設的賬號和密碼都是nacos,進入後:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/040d868479a24a6eb33c72f0237f4310.png)
## 1.2 Linux安裝
Linux或者Mac安裝方式與Windows類似。
### 1.2.1 安裝JDK

Nacos依賴於JDK執行,索引Linux上也需要安裝JDK才行。

上傳jdk安裝包:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/e4000bb9bac94ef18cad7f8a1d5f3d63.png)
上傳到某個目錄,例如:`/usr/local/`
然後解壓縮:
```bash
tar -xvf jdk-8u144-linux-x64.tar.gz
```
然後重新命名為java
配置環境變數:
```bash
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
```
設定環境變數:
```bash
source /etc/profile
```
### 1.2.2 上傳安裝包
如圖:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/998658502c1c4b9bb3cbf490242359dd.png)

也可以直接使用課前資料中的tar.gz:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/b42b263721a14f6bacdb95634a79e37d.png)

上傳到Linux伺服器的某個目錄,例如`/usr/local/src`目錄下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/6faafe2f4a1c4a4d941194f596941cdb.png)
### 1.2.3 解壓
命令解壓縮安裝包:
```bash
tar -xvf nacos-server-1.4.1.tar.gz
```
然後刪除安裝包:
```bash
rm -rf nacos-server-1.4.1.tar.gz
```
目錄中最終樣式:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/3cb178a389ce418da3f38c600d1c0f51.png)

目錄內部:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/3dae2c1626564a2fa8d238964389b2bf.png)
### 1.2.4 埠配置
與windows中類似
### 1.2.5 啟動
在nacos/bin目錄中,輸入命令啟動Nacos:

```bash
sh startup.sh -m standalone
```
# 2. 父子工程註冊服務到Nacos

1. 在cloud-demo父工程中新增spring-cloud-alilbaba的管理依賴:
```xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
```
2. 註釋掉order-service和user-service中原有的eureka依賴。
3. 新增nacos的客戶端依賴:
```xml
<!-- nacos客戶端依賴包 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
```
4. 修改user-service&order-service中的application.yml檔案,註釋eureka地址,新增nacos地址:
```yaml
spring:
cloud:
nacos:
server-addr: nacos:8848 # nacos服務地址
```
# 3. Nacos叢集
## 3.1 設定例項的叢集屬性
修改application.yml檔案

```yaml
spring:
cloud:
nacos:
discovery:
cluster-name: fuzhou
```
## 3.2 根據叢集負載均衡
配置優先選擇同叢集服務(提供者與消費者都需要配置1.4.1的叢集屬性,才可以識別到同叢集)
```yaml
userservice:
ribbon:
NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規則
```
## 3.3 加權負載均衡
1. Nacos控制檯可以設定例項的權重值0~1之間
2. 同叢集內的多個例項,權重越高被訪問的頻率越高
3. 權重設定為0則完全不會被訪問
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/f600f71ecbf94a73933757169a1c7298.png)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/2df82c3389ad4359b695e92d246fc2f0.png)
# 4. Nacos環境隔離-namespace
## 4.1 概念
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/a97023ab12d348509c8a926a13c4c1d1.png)
namespace(名稱空間)--》 group(分組)---》 service/Data (服務儲存或者資料儲存)--》 叢集---》 例項
## 4.2 新建名稱空間
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/f7f0458bb47346ae838ba6889db2c149.png)![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/797dbff88c2849f79f5e7a21ce88c218.png)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/613c3cb05c484bc58f144492c27826a9.png)
將服務調整到新的名稱空間

```yaml
spring:
cloud:
nacos:
discovery:
namespace: 4d6ce343-9e1b-44df-a90f-2cf2b6b3d177 # dev環境,填寫的是id,不是空間名稱
ephemeral: false # 是否是臨時例項
```
## 4.3 例項
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/2a0b8ea510d54b129c9eb6bb7c629f22.png)
### 4.3.1 臨時例項
主動發起心跳資料給Nacos,與Eureka一致,預設30s一次,心跳異常則移除例項
### 4.3.2 非臨時例項
Nacos主動發起心跳檢查,出現問題不移除例項,標記為不健康例項,等待例項回覆
# 5. Nacos與Eureka區別
## 5.1 Nacos與eureka的共同點
1. 都支援服務註冊和服務拉取
2. 都支援服務提供者心跳方式做健康檢測
## 5.2 Nacos與Eureka的區別
3. Nacos支援服務端主動檢測提供者狀態:臨時例項採用心跳模式,非臨時例項採用主動檢測模式
4. 臨時例項心跳不正常會被剔除,非臨時例項則不會被剔除
5. Nacos支援服務列表變更的訊息推送模式,服務列表更新更及時
6. Nacos叢集預設採用AP方式,當叢集中存在非臨時例項時,採用CP模式;Eureka採用AP方式
# 6. Nacos配置中心
## 6.1 統一配置管理
1. 配置更改熱更新
2. 多環境配置共享
### 6.1.1 nacos統一配置新增方式
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/cc81cbb49e1041b4bcd3452c2d90c282.png)
### 6.1.2 專案獲取配置檔案流程
bootstrap.yml讀取順序在application.yml前面,所以,nacos的配置資訊應該在bootstrap.yml
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/9ebc075a0d6a4e17a4436eb94c9fc0c7.png)
### 6.1.3 專案配置nacos統一配置中心
1. 在Nacos中新增配置檔案
2. 在微服務中引入nacos的config依賴
3. 在微服務中新增bootstrap.yml,配置nacos地址、當前環境、服務名稱、檔案字尾名。這些決定了程式啟動時去nacos讀取哪個檔案
#### 6.1.3.1 引入Nacos的配置管理客戶端依賴

```xml
<!--nacos配置管理依賴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>
spring-cloud-starter-alibaba-nacos-config
</artifactId>
</dependency>
```
#### 6.1.3.2 在userservice中的resource目錄新增一個bootstrap.yml檔案,這個檔案是引導檔案,優先順序高於application.yml

```yaml
spring:
application:
name: userservice
profiles:
active: dev # 環境
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
config:
file-extension: yaml # 檔案字尾名
```
#### 6.1.3.2 在user-service中將pattern.dateformat這個屬性注入到UserController中做測試

```java
@NacosValue("${pattern.dateformat}")
private String dateformat;

@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}
```
### 6.1.4 專案配置熱更新
Nacos中的配置檔案變更後,微服務無需重啟就可以感知。
#### 6.1.4.1 方式一:在@Value注入的變數所在類上新增註解@RefreshScope
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/076d7e1969f24577bd60fd0d67ef3ed9.png)
#### 6.1.4.2 方式二:使用@ConfigurationProperties註解

```java
package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
//Component指定了這個類會被Spring容器託管,並且會建立一個bean物件,物件名就是類名首字母小寫,能被其他物件發現使用
@ConfigurationProperties(prefix = "pattern")
//prefix屬性指定了配置檔案中哪個下面的所有屬性都能對映到該類中,對映方式為prefix拼接名稱,如 pattern.dateformat
public class PatternProperties {
private String dateformat;
private String envSharedValue;
private String name;
}
```
### 6.1.5 總結
熱更新的兩個方式
- 透過@Value註解注入,結合@RefreshScope來重新整理
- 透過@ConfigurationProperties注入,自動重新整理
注意事項:
- 不是所有的配置都適合放到配置中心,維護起來比較麻煩
- 建議將一些關鍵引數,需要執行時調整的引數放到nacos配置中心,一般都是自定義配置
## 6.2 多環境配置共享
微服務啟動時會從nacos讀取多個配置檔案:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
無論profile如何變化,[spring.application.name].yaml這個檔案一定會載入,因此多環境共享配置可以寫入這個檔案
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/7d7eef3eb51b4173a41cc9f10f808569.png)
### 6.2.1 多種配置的優先順序
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/5a66925b8f0843fa8aa73115bb09f3be.png)
### 6.2.2 總結
微服務會從nacos讀取的配置檔案:
- [服務名]-[spring.profile.active].yaml,環境配置
- [服務名].yaml,預設配置,多環境共享
優先順序:
[服務名]-[環境].yaml >[服務名].yaml > 本地配置
## 6.2 Nacos叢集
### 6.2.1 官方叢集案例圖
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/d32cbe1ecfb54dd4bcedba3dd7c1cb13.png)
其中包含3個nacos節點,然後一個負載均衡器代理3個Nacos。這裡負載均衡器可以使用nginx。
所以叢集結構可以調整為:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/aa6d2ed967ce4a839bfe2f8d49e3b531.png)
### 6.2.2 搭建叢集
搭建叢集的基本步驟:
- 搭建資料庫,初始化資料庫表結構
- 下載nacos安裝包
- 配置nacos
- 啟動nacos叢集
- nginx反向代理
#### 6.2.2.1 初始化資料庫
Nacos預設資料儲存在內嵌資料庫Derby中,不屬於生產可用的資料庫。
官方推薦的最佳實踐是使用帶有主從的高可用資料庫叢集,主從模式的高可用資料庫可以參考**傳智教育**的後續高手課程。
這裡以單點的資料庫為例。
首先新建一個資料庫,命名為nacos,而後匯入下面的SQL:

```sql
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶欄位',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = config_info_aggr */
/******************************************/
CREATE TABLE `config_info_aggr` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) NOT NULL COMMENT 'group_id',
`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',
`content` longtext NOT NULL COMMENT '內容',
`gmt_modified` datetime NOT NULL COMMENT '修改時間',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶欄位',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum` (`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租戶欄位';


/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = config_info_beta */
/******************************************/
CREATE TABLE `config_info_beta` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶欄位',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfobeta_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_beta';

/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = config_info_tag */
/******************************************/
CREATE TABLE `config_info_tag` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
`src_user` text COMMENT 'source user',
`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_configinfotag_datagrouptenanttag` (`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info_tag';

/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = config_tags_relation */
/******************************************/
CREATE TABLE `config_tags_relation` (
`id` bigint(20) NOT NULL COMMENT 'id',
`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',
`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(128) NOT NULL COMMENT 'group_id',
`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',
`nid` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`nid`),
UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation';

/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = group_capacity */
/******************************************/
CREATE TABLE `group_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字元表示整個叢集',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用預設值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為位元組,0表示使用預設值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數,,0表示使用預設值',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合資料的子配置大小上限,單位為位元組,0表示使用預設值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='叢集、各Group容量資訊表';

/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = his_config_info */
/******************************************/
CREATE TABLE `his_config_info` (
`id` bigint(64) unsigned NOT NULL,
`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL,
`group_id` varchar(128) NOT NULL,
`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',
`content` longtext NOT NULL,
`md5` varchar(32) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`src_user` text,
`src_ip` varchar(50) DEFAULT NULL,
`op_type` char(10) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租戶欄位',
PRIMARY KEY (`nid`),
KEY `idx_gmt_create` (`gmt_create`),
KEY `idx_gmt_modified` (`gmt_modified`),
KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租戶改造';


/******************************************/
/* 資料庫全名 = nacos_config */
/* 表名稱 = tenant_capacity */
/******************************************/
CREATE TABLE `tenant_capacity` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',
`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配額,0表示使用預設值',
`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量',
`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個配置大小上限,單位為位元組,0表示使用預設值',
`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大個數',
`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '單個聚合資料的子配置大小上限,單位為位元組,0表示使用預設值',
`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大變更歷史數量',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租戶容量資訊表';


CREATE TABLE `tenant_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`kp` varchar(128) NOT NULL COMMENT 'kp',
`tenant_id` varchar(128) default '' COMMENT 'tenant_id',
`tenant_name` varchar(128) default '' COMMENT 'tenant_name',
`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',
`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',
`gmt_create` bigint(20) NOT NULL COMMENT '建立時間',
`gmt_modified` bigint(20) NOT NULL COMMENT '修改時間',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),
KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';

CREATE TABLE `users` (
`username` varchar(50) NOT NULL PRIMARY KEY,
`password` varchar(500) NOT NULL,
`enabled` boolean NOT NULL
);

CREATE TABLE `roles` (
`username` varchar(50) NOT NULL,
`role` varchar(50) NOT NULL,
UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);

CREATE TABLE `permissions` (
`role` varchar(50) NOT NULL,
`resource` varchar(255) NOT NULL,
`action` varchar(8) NOT NULL,
UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);

INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);

INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
```
#### 6.2.2.2 下載nacos
nacos在GitHub上有下載地址:[nacos](https://github.com/alibaba/nacos/tags),可以選擇任意版本下載。
#### 6.2.2.3 配置nacos
將這個包解壓到任意非中文目錄下,如圖:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/2cd33ac9afa84c608a79448777391a99.png)
目錄說明:

- bin:啟動指令碼
- conf:配置檔案

進入nacos的conf目錄,修改配置檔案cluster.conf.example,重新命名為cluster.conf:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/direct/2f3582126c7b48da96358a45faccfabf.png)
然後新增內容:

```
127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847
```
然後修改application.properties檔案,新增資料庫配置

```properties
spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123
```
#### 6.2.2.4 啟動nacos
將nacos資料夾複製三份,分別命名為:nacos1、nacos2、nacos3
然後分別修改三個資料夾中的application.properties,

nacos1:

```properties
server.port=8845
```

nacos2:

```properties
server.port=8846
```

nacos3:

```properties
server.port=8847
```

然後分別啟動三個nacos節點:

```
startup.cmd
```
#### 6.2.2.5 nginx反向代理
修改conf/nginx.conf檔案,配置如下:

```nginx
upstream nacos-cluster {
server 127.0.0.1:8845;
server 127.0.0.1:8846;
server 127.0.0.1:8847;
}

server {
listen 80;
server_name localhost;

location /nacos {
proxy_pass http://nacos-cluster;
}
}
```

而後在瀏覽器訪問:http://localhost/nacos即可。
程式碼中application.yml檔案配置如下:

```yaml
spring:
cloud:
nacos:
server-addr: localhost:80 # Nacos地址
```
#### 6.2.2.6 最佳化
- 實際部署時,需要給做反向代理的nginx伺服器設定一個域名,這樣後續如果有伺服器遷移nacos的客戶端也無需更改配置.

- Nacos的各個節點應該部署到多個不同伺服器,做好容災和隔離

相關文章