SpringCloud Alibaba01-Nacos
- 2020 年 4 月 13 日
- 筆記
- SpringCloud Alibaba
整個父POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.huangzhen.springcloud</groupId>
<artifactId>springcloud2020</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloudalibaba-provider-payment9001</module>
<module>cloudalibaba-provider-payment9002</module>
<module>cloudalibaba-consumer-order83</module>
<module>cloudalibaba-config-nacos-client3377</module>
<module>cloudalibaba-sentinel-service8401</module>
<module>cloudalibaba-provider-payment9003</module>
<module>cloudalibaba-provider-payment9004</module>
<module>cloudalibaba-consumer-nacos-order84</module>
<module>seata-order-service2001</module>
<module>seata-account-service2003</module>
<module>seata-storage-service2002</module>
</modules>
<packaging>pom</packaging>
<!-- 統一管理jar包版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
<mysql.version>8.0.19</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<!-- 子模塊繼承之後,提供作用:鎖定版本+子modlue不用寫groupId和version -->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--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>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
1.Nacos:服務註冊與配置中心
Nacos:Dynamic Naming and Configuration Service
Nacos = Eureka + Bus + Config
即Nacos是註冊中心+配置中心。
官網: //nacos.io/zh-cn
1.1 邏輯架構及其組件介紹
- 服務管理:實現服務CRUD,域名CRUD,服務健康狀態檢查,服務權重管理等功能
- 配置管理:實現配置管CRUD,版本管理,灰度管理,監聽管理,推送軌跡,聚合數據等功能
- 元數據管理:提供元數據CURD 和打標能力
- 插件機制:實現三個模塊可分可合能力,實現擴展點SPI機制
- 事件機制:實現異步化事件通知,sdk數據變化異步通知等邏輯
- 日誌模塊:管理日誌分類,日誌級別,日誌可移植性(尤其避免衝突),日誌格式,異常碼+幫助文檔
- 回調機制:sdk通知數據,通過統一的模式回調用戶處理。接口和數據結構需要具備可擴展性
- 尋址模式:解決ip,域名,nameserver、廣播等多種尋址模式,需要可擴展
- 推送通道:解決server與存儲、server間、server與sdk間推送性能問題
- 容量管理:管理每個租戶,分組下的容量,防止存儲被寫爆,影響服務可用性
- 流量管理:按照租戶,分組等多個維度對請求頻率,長鏈接個數,報文大小,請求流控進行控制
- 緩存機制:容災目錄,本地緩存,server緩存機制。容災目錄使用需要工具
- 啟動模式:按照單機模式,配置模式,服務模式,dns模式,或者all模式,啟動不同的程序+UI
- 一致性協議:解決不同數據,不同一致性要求情況下,不同一致性機制
- 存儲模塊:解決數據持久化、非持久化存儲,解決數據分片問題
- Nameserver:解決namespace到clusterid的路由問題,解決用戶環境與nacos物理環境映射問題
- CMDB:解決元數據存儲,與三方cmdb系統對接問題,解決應用,人,資源關係
- Metrics:暴露標準metrics數據,方便與三方監控系統打通
- Trace:暴露標準trace,方便與SLA系統打通,日誌白平化,推送軌跡等能力,並且可以和計量計費系統打通
- 接入管理:相當於阿里雲開通服務,分配身份、容量、權限過程
- 用戶管理:解決用戶管理,登錄,sso等問題
- 權限管理:解決身份識別,訪問控制,角色管理等問題
- 審計系統:擴展接口方便與不同公司審計系統打通
- 通知系統:核心數據變更,或者操作,方便通過SMS系統打通,通知到對應人數據變更
- OpenAPI:暴露標準Rest風格HTTP接口,簡單易用,方便多語言集成
- Console:易用控制台,做服務管理、配置管理等操作
- SDK:多語言sdk
- Agent:dns-f類似模式,或者與mesh等方案集成
- CLI:命令行對產品進行輕量化管理,像git一樣好用
1.2 數據模型
Nacos 數據模型 Key 由三元組唯一確定, Namespace默認是空串,公共命名空間(public),分組默認是 DEFAULT_GROUP。
1.3 安裝與運行Nacos
1.3.1 下載
//github.com/alibaba/nacos/releases/tag/1.1.4
1.3.2 運行
解壓安裝包,直接運行bin目錄下的startup.cmd
命令運行成功後直接訪問//localhost:8848/nacos
默認賬戶和密碼都是nacos
1.4 Nacos作為服務註冊中心
1.4.1 服務提供者
1.新建模塊:cloudalibaba-provider-payment9001
2.POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.huangzhen.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<!--SpringCloud ailibaba 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>
</dependencies>
</project>
3.yaml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4.主啟動類
@SpringBootApplication
@EnableDiscoveryClient //發現服務
public class ProviderMain9001 {
public static void main(String[] args){
SpringApplication.run(ProviderMain9001.class, args);
}
}
5.測試Controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String port;
@GetMapping("/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return "這裡是服務提供者: " + port + " \t 編號:" + id + "\t很高興為您服務!";
}
}
6.為了負載均衡的演示,參照9001,新建9002.
1.4.2 服務消費者
1.新建模塊:cloudalibaba-consumer-nacos-order83
2.POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.huangzhen.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-order83</artifactId>
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定義的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.huangzhen.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</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>
</dependencies>
</project>
3.yaml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消費者將要去訪問的微服務名稱(註冊成功進nacos的微服務提供者)
service-url:
nacos-user-service: //nacos-payment-provider
4.主啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderMain83.class, args);
}
}
5.config:配置負載均衡
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //必須加
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
6.Controller
@RestController
public class OrderController {
@Value("${service-url.nacos-user-service}")//從yaml中取
private String serverURL;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
7.測試:
啟動nacos,9001,9002,83
//localhost:83/consumer/payment/nacos/31
1.5 服務註冊中心對比
CAP: 一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。
CAP原則指的是,這三個要素最多只能同時實現兩點,不可能三者兼顧。
Nacos:支持AP和CP模式的切換。
1.6 Nacos作為服務配置中心
1.新建模塊
cloudalibaba-config-nacos-client3377
2.POM
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="//maven.apache.org/POM/4.0.0"
xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.huangzhen.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-config-nacos-client3377</artifactId>
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>
<!--一般基礎配置-->
<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>
</dependencies>
</project>
3.yml
3.1 bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服務註冊中心地址
config:
server-addr: localhost:8848 #Nacos作為配置中心地址
file-extension: yaml #指定yaml格式的配置
3.2 application.yml
spring:
profiles:
active: dev # 表示開發環境
4.主啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class NacosClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosClientMain3377.class, args);
}
}
5.Controller
@RestController
@RefreshScope //動態刷新配置文件
public class ClientController {
@Value("${config.info}")
private String config_info;
@GetMapping("/config/info")
public String getConfig_info() {
return config_info;
}
}
6.Nacos配置規則
nacos控制台中Data ID配置規則:
${prefix}-${spring.profile.active}.${file-exetension}
${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- prefix默認為spring.application.name的值
- spring.profile.active 即為當前環境對應的profile,可以通過配置項 spring.profile.active來配置
- file-exetension為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension來配置
注意, boostrap.yml中配置的 文件名為yaml時,Nacos的配置文件名也必須為yaml
7.在Nacos中添加配置
這裡是已經配置好的,安裝此去新建即可。
8.測試
- 啟動前需要在nacos客戶端-配置管理-配置管理欄目下有對應的yaml配置文件
- 運行cloud-config-nacos-client3377的主啟動類
- //localhost:3377/config/info
會看到nacos中的配置文件的信息會顯示在頁面上。
9.自帶動態刷新
修改下Nacos中的yaml配置文件,再次調用查看配置的接口,就會發現配置已經刷新。
不需要向Config和Bus中還要分發和廣播。
1.7 配置中心詳解
按照Namespace + Group + DataID設計配置,以適應多環境多項目管理。
類似Java裏面的package名和類名,最外層的namespace是可以用於區分部署環境的,Group和DataID邏輯上區分兩個目標對象。
三者情況:
默認情況:
- Namespace=public
- Group=DEFAULT_GROUP
- Cluster=DEFAULT
Namespace:主要用來實現環境之間的隔離。
Group:可以把不同的微服務劃分到同一個分組裏面。
Service:就是微服務,一個Service可以包含多個Cluster(集群),Nacos默認Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬劃分。
Instance:微服務的實例。
1.8 三種配置案例
1.8.1 DataID方案
指定spring.profile.active和配置文件的DataID來使不同環境下讀取不同的配置:
-
默認空間+默認分組+新建dev和test兩個DataID
-
-
通過spring.profile.active屬性就能進行多環境下配置文件的讀取
-
spring: profiles: active: dev # 表示開發環境 #active: test # 表示測試環境
1.8.2 Group方案
-
在創建配置時候,新建Group
-
-
在bootstrap.yml中新加Group
-
config: server-addr: localhost:8848 #Nacos作為配置中心地址 file-extension: yaml #指定yaml格式的配置 group: H1_GROUP
1.8.3 Namespace方案
-
新建dev的Namespace
-
-
回服務列表查看
-
-
新加三條配置
-
-
在bootstrap.yml中添加namespace
-
cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服務註冊中心地址 config: server-addr: localhost:8848 #Nacos作為配置中心地址 file-extension: yaml #指定yaml格式的配置 group: TEST_GROUP namespace: a8ddac2c-68f8-4b3c-8c65-b31e0327ebbc #此為命名空間ID
1.9 Nacos集群
1.9.1 Nacos持久化說明
1.Nacos默認自帶的是嵌入式數據庫derby
2.derby到mysql切換配置步驟想·
-
nacos-server-1.1.4\nacos\conf目錄下找到sql腳本:nacos-mysql.sql,提前新建庫nacos_config
-
nacos-server-1.1.4\nacos\conf目錄下找到application.properties,新增如下
-
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456 #這就代表後續我們新建的各種配置列表都會存入你設定的mysql數據庫中,而不是存入自帶的derby
-
再次啟動nacos,會發現前面的配置都消失了。
1.9.2 集群配置
1個Nginx+3個Nacos+1個MySQL(實際應該是MySQL集群,至少為一主一從)
為了減少端口的開放步驟,我提前將防火牆關閉。
1.通過Yum安裝Nginx
-
在/etc/yum.repo.d目錄下面創建一個nginx的yum源,然後就可以直接用yum install nginx安裝
-
cd /etc/yum.repo.d #切換到yum安裝源文件目錄
-
vim nginx.repo #創建一個安裝包源,把以下內容複製進去,保存退出
[nginx-stable]
name=nginx stable repo
baseurl=//nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=//nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=//nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=//nginx.org/keys/nginx_signing.key
-
yum repolist #查看是否成功加載了此數據源
-
-
yum install nginx systemctl enable nginx #設置nginx為開機啟動 systemctl start nginx #啟動nginx服務
-
2.配置MySQL5.7
安裝MySQL5.7教程: //blog.csdn.net/WYA1993/article/details/88890883
- 新建庫nacos_config,將sql腳本:nacos-mysql.sql執行。
- 修改application.properties配置,與window下操作一樣
3.安裝和配置Nacos
-
通過WinSCP將nacos-server-1.1.4.tar.gz複製到/Software/mynacos中
-
tar -zxvf nacos-server-1.1.4.tar.gz解壓縮
-
選定啟動方式
-
-
修改cluster.conf ——-在nacos/config 目錄下
-
cp cluster.conf.example cluster.conf
-
vim cluster.conf ,修改成如下:
-
-
這個ip不寫127.0.0.1 必須是Linux命令hostname -i能識別的IP
-
-
修改startup.sh,使其能夠接受不同的啟動端—–在nacos/bin目錄下
-
cp startup.sh startup.sh.bak
-
vim startup.sh
-
-
-
注意要有java1.8環境。參照: //blog.csdn.net/pang_ping/article/details/80570011
-
啟動方式:./startup.sh -p 3333/4444/5555
-
-
4.配置Nginx
-
由於是通過Yum安裝的Nginx,Nginx的配置文件位於/etc/nginx
-
vim nginx.conf
-
-
upstream cluster{ server 127.0.0.1:3333; server 127.0.0.1:4444; server 127.0.0.1:5555; } server{ listen 1111; server_name localhost; location / { proxy_pass //cluster; } }
-
重啟Nginx:systemctl restart nginx
5.測試
-
啟動三個nacos
- ./startup.sh -p 3333/4444/5555 這裡是三條命令(簡寫,別直接複製執行)
-
由於Nginx是開機自動啟動,這裡不再啟動。
-
訪問192.168.11.114:1111/nacos 這裡192.168.11.114是我自己的ip地址
-
顯示如下則成功
-
-
上面配置是我添加的,再到數據庫中查看是否存在。
-
顯示如下則成功
-
-
-
圖沒截完整,先縮小後放大,可以看到我在nacos上配置的一條記錄。