文中涉及到了一些模塊代碼沒有給出,我一並上傳到github了,可以整個項目clone下來進行調試。
地址:https://github.com/stronglxp/springcloud-test
1、SpringCloud Alibaba介紹
1.1 為什么會出現SpringCloud Alibaba
Spring Cloud Netflix項目進入維護模式。https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now
將模塊置於維護模式,意味着Spring Cloud團隊將不會再向模塊添加新功能。他們將修復block級別的 bug 以及安全問題,他們也會考慮並審查社區的小型pull request。
1.2 SpringCloud Alibaba是什么
文檔:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
Spring Cloud Alibaba 致力於提供微服務開發的一站式解決方案。此項目包含開發分布式應用微服務的必需組件,方便開發者通過 Spring Cloud 編程模型輕松使用這些組件來開發分布式應用服務。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以將 Spring Cloud 應用接入阿里微服務解決方案,通過阿里中間件來迅速搭建分布式應用系統。
誕生:2018.10.31,Spring Cloud Alibaba 正式入駐了Spring Cloud官方孵化器,並在Maven 中央庫發布了第一個版本。
1.3 SpringCloud Alibaba能干嘛
- 服務限流降級:默認支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降級功能的接入,可以在運行時通過控制台實時修改限流降級規則,還支持查看限流降級 Metrics 監控。
- 服務注冊與發現:適配 Spring Cloud 服務注冊與發現標准,默認集成了 Ribbon 的支持。
- 分布式配置管理:支持分布式系統中的外部化配置,配置更改時自動刷新。
- 消息驅動能力:基於 Spring Cloud Stream 為微服務應用構建消息驅動能力。
- 分布式事務:使用 @GlobalTransactional 注解, 高效並且對業務零侵入地解決分布式事務問題。
- 阿里雲對象存儲:阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。支持在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
- 分布式任務調度:提供秒級、精准、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。同時提供分布式的任務執行模型,如網格任務。網格任務支持海量子任務均勻分配到所有 Worker(schedulerx-client)上執行。
- 阿里雲短信服務:覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
1.4 如何使用
如果需要使用已發布的版本,在 dependencyManagement
中添加如下配置。
<dependencyManagement>
<dependencies>
<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>
</dependencies>
</dependencyManagement>
然后在 dependencies
中添加自己所需使用的依賴即可使用。
1.5 組件
Sentinel:把流量作為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
Nacos:一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
RocketMQ:一款開源的分布式消息系統,基於高可用分布式集群技術,提供低延時的、高可靠的消息發布與訂閱服務。
Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
Seata:阿里巴巴開源產品,一個易於使用的高性能微服務分布式事務解決方案。
Alibaba Cloud OSS: 阿里雲對象存儲服務(Object Storage Service,簡稱 OSS),是阿里雲提供的海量、安全、低成本、高可靠的雲存儲服務。您可以在任何應用、任何時間、任何地點存儲和訪問任意類型的數據。
Alibaba Cloud SchedulerX: 阿里中間件團隊開發的一款分布式任務調度產品,提供秒級、精准、高可靠、高可用的定時(基於 Cron 表達式)任務調度服務。
Alibaba Cloud SMS: 覆蓋全球的短信服務,友好、高效、智能的互聯化通訊能力,幫助企業迅速搭建客戶觸達通道。
1.6 學習資料
2、nacos介紹及下載安裝
2.1 nacos介紹
Nacos(Dynamic Naming and Configuration Service),一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平台。
通過上面的SpringCloud組件圖可知,nacos這個玩意在服務注冊和服務配置、服務總線都有應用,直接把Eureka、Config和Bus給替換了,一箭三雕。
總結一下nacos的作用:注冊中心+配置中心的組合 -> Nacos = Eureka+Config+Bus
2.2 各種注冊中心比較
CAP定理:https://zh.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86
Nacos服務發現實例模型
Nacos支持AP和CP模式的切換
C是所有節點在同一時間看到的數據是一致的;而A的定義是所有的請求都會收到響應。
何時選擇使用何種模式?
—般來說,如果不需要存儲服務級別的信息且服務實例是通過nacos-client注冊,並能夠保持心跳上報,那么就可以選擇AP模式。當前主流的服務如Spring cloud和Dubbo服務,都適用於AP模式,AP模式為了服務的可能性而減弱了一致性,因此AP模式下只支持注冊臨時實例。
如果需要在服務級別編輯或者存儲配置信息,那么CP是必須,K8S服務和DNS服務則適用於CP模式。CP模式下則支持注冊持久化實例,此時則是以Raft協議為集群運行模式,該模式下注冊實例之前必須先注冊服務,如果服務不存在,則會返回錯誤。
切換命令:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
2.3 學習文檔
- https://nacos.io/zh-cn/docs/what-is-nacos.html
- https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
2.4 nacos服務器下載安裝
下載前確保有jdk環境和maven環境
選擇合適的版本,點擊下載
下載完成后解壓,然后以單機模式啟動bin/startup.cmd
startup.cmd -m standalone
3、nacos的服務注冊功能
3.1 創建服務提供者模塊
如何創建分布式項目可參考:SpringCloud入門及創建分布式項目一文。
我們新建module:cloud-nacos-provider
pom.xml文件如下
<?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>
<parent>
<groupId>com.codeliu</groupId>
<artifactId>springcloud-test</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloud-nacos-provider</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>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml文件如下
server:
port: 10001
spring:
application:
name: cloud-nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置本地的Nacos服務器地址
主啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(CloudNacosProviderApplication.class, args);
}
}
編寫一個控制器
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "nacos registry, serverPort: " + port + "\t id" + id;
}
}
然后啟動該模塊,在nacos控制台就能看到該實例已經注冊到nacos。
3.2 創建服務消費者模塊
新建module:cloud-nacos-consumer
pom.xml文件如下
<?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>
<parent>
<groupId>com.codeliu</groupId>
<artifactId>springcloud-test</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloud-nacos-consumer</artifactId>
<dependencies>
<!--SpringCloud ailibaba nacos -->
<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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml文件如下
server:
port: 10083
spring:
application:
name: cloud-nacos-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 消費者將要去訪問的微服務名稱(注冊成功進nacos的微服務提供者)
service-url:
nacos-user-service: http://cloud-nacos-provider
主啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class CloudNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(CloudNacosConsumerApplication.class, args);
}
}
配置類
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
控制器
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@Slf4j
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serviceUrl;
@GetMapping(value = "/consumer/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id) {
return restTemplate.getForObject(serviceUrl + "/payment/nacos/" + id, String.class);
}
}
然后啟動消費者模塊,在nacos控制台可以看到服務列表
我們通過consumer去訪問provider的接口
3.3 Nacos的負載均衡
nacos支持負載均衡是因為spring-cloud-starter-alibaba-nacos-discovery內含netflix-ribbon包。
為了省事,我們可以直接copy一個provider進行啟動
copy完成后,啟動
然后通過consumer付訪問provider提高的接口,通過打印可以知道是輪詢訪問10001/10002
4、nacos作為配置中心
4.1 創建配置模塊
新建module:cloud-nacos-config
pom.xml文件如下
<?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>
<parent>
<groupId>com.codeliu</groupId>
<artifactId>springcloud-test</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>cloud-nacos-config</artifactId>
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
nacos和springcloud-config一樣,在項目初始化時,要保證先從配置中心進行配置拉取,拉取配置之后,才能保證項目的正常啟動。
springboot中配置文件的加載是存在優先級順序的,bootstrap優先級高於application。所以我們拉取配置需要寫在bootstrap.yml文件中,啟動完bootstrap.yml把相關配置拉取下來后才能正常啟動項目。
配置bootstrap.yml文件
server:
port: 3377
spring:
application:
name: cloud-nacos-config
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos本地服務器地址
file-extension: yaml # 配置文件的格式,默認properties
group: DEFAULT_GROUP # 分組,默認DEFAULT_GROUP
配置application.yml文件
spring:
profiles:
active: dev
4.2 在nacos控制台增加配置信息
前面我們在bootstrap.yml文件中配置了spring.application.name
,是因為它是構成 Nacos 配置管理 dataId
字段的一部分。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默認為spring.application.name
的值,也可以通過配置項spring.cloud.nacos.config.prefix
來配置。spring.profiles.active
即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當spring.profiles.active
為空時,對應的連接符-
也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}
file-exetension
為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension
來配置。目前只支持properties
和yaml
類型。
最后公式:
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
接下來在nacos控制台新增配置
保存后,再修改啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class CloudNacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudNacosConfigApplication.class, args);
// 讀取啟用配置文件中的屬性
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" +userName+"; age: "+userAge);
}
}
啟動項目,控制台打印
4.3 動態更新配置
nacos支持動態更新配置信息。我們修改啟動類代碼如下
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class CloudNacosConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudNacosConfigApplication.class, args);
while (true) {
// 讀取啟用配置文件中的屬性
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" +userName+"; age: "+userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
while條件永遠為真,每隔一秒就是獲取配置文件的值。然后我們在nacos控制台修改對應配置文件中user.age的值,發現控制台打印的user.age的值也更新了。
如果要禁用自動更新,在bootstrap.yml中進行配置
spring:
cloud:
nacos:
config:
refresh:
enabled: false
4.4 namespace和group和dataId三者的關系
三個東西是為了解多項目多環境的問題。
實際開發中,通常一個系統會准備
- dev開發環境
- test測試環境
- prod生產環境
如何保證指定環境啟動時服務能正確讀取到Nacos上相應環境的配置文件呢?
一個大型分布式微服務系統會有很多微服務子項目,每個微服務項目又都會有相應的開發環境、測試環境、預發環境、正式環境…那怎么對這些微服務配置進行管理呢?
nacos默認的namespace是public,默認的group是DEFAULT_GROUP
類似Java里面的package名和類名,最外層的namespace是可以用於區分部署環境的,Group和DatalD邏輯上區分兩個目標對象。
-
Nacos默認的Namespace是public,Namespace主要用來實現隔離。
比方說我們現在有三個環境:開發、測試、生產環境,我們就可以創建三個Namespace,不同的Namespace之間是隔離的。
-
Group默認是DEFAULT_GROUP,Group可以把不同的微服務划分到同一個分組里面去
-
Service就是微服務:一個Service可以包含多個Cluster (集群),Nacos默認Cluster是DEFAULT,Cluster是對指定微服務的一個虛擬划分。
比方說為了容災,將Service微服務分別部署在了杭州機房和廣州機房,這時就可以給杭州機房的Service微服務起一個集群名稱(HZ) ,給廣州機房的Service微服務起一個集群名稱(GZ),還可以盡量讓同一個機房的微服務互相調用,以提升性能。 -
最后是Instance,就是微服務的實例
我們可以在nacos控制台創建namespace和group。
創建dev和test的namespace
回到配置列表,就能看到我們創建的namespace
分別在test和dev的namespace里新建配置文件
在bootstrap.yml中指定group和namespace就可以獲取不同的配置文件了。(記住dataId的生成規則)
spring:
application:
name: cloud-nacos-config
cloud:
nacos:
config:
server-addr: localhost:8848 # nacos本地服務器地址
file-extension: yaml # 配置文件的格式,默認properties
group: TEST_GROUP # 分組,默認DEFAULT_GROUP
# group: DEV_GROUP
namespace: 155a7fd7-6834-4787-80f7-35f56dd9f8fb
# namespace: 2f42a525-6d50-45dc-8ed1-d474fff7ce42
5、nacos集群和持久化
參考文檔:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
https://nacos.io/zh-cn/docs/deployment.html
5.1 集群部署架構圖
因此開源的時候推薦用戶把所有服務列表放到一個vip下面,然后掛到一個域名下面
-
http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。
-
http://SLB:port/openAPI 掛載SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),直連SLB即可,下面掛server真實ip,可讀性不好。
-
http://nacos.com:port/openAPI 域名 + SLB模式(內網SLB,不可暴露到公網,以免帶來安全風險),可讀性好,而且換ip方便,推薦模式
一般在實際部署時,架構圖如下
默認Nacos使用嵌入式數據庫實現數據的存儲。所以,如果啟動多個默認配置下的Nacos節點,數據存儲是存在一致性問題的。為了解決這個問題,Nacos采用了集中式存儲的方式來支持集群化部署,目前只支持MySQL的存儲。
在0.7版本之前,在單機模式時nacos使用嵌入式數據庫實現數據的存儲,不方便觀察數據存儲的基本情況。0.7版本增加了支持mysql數據源能力,具體的操作步驟:
(1)安裝數據庫,版本要求:5.6.5+
(2)初始化mysql數據庫,數據庫初始化文件:nacos-mysql.sql
(3)修改conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql),添加mysql數據源的url、用戶名和密碼。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
再以單機模式啟動nacos,nacos所有寫嵌入式數據庫的數據都寫到了mysql。
5.2 切換持久化配置
根據nacos的源碼,Nacos默認自帶的是嵌入式數據庫derby
所以每個nacos的數據都是存放在內置的數據庫里,如果要做集群部署,肯定會出現數據一致性問題的。根據官方文檔,我們可以把數據源切換成MySQL,這樣就能做到數據一致性。
(1)安裝數據庫,版本要求:5.6.5+
(2)初始化mysql數據庫nacos_config,數據庫初始化文件:nacos/conf/nacos-mysql.sql
(3)修改nacos/conf/application.properties文件,增加支持mysql數據源配置(目前只支持mysql),添加mysql數據源的url、用戶名和密碼。
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=1311664842
保存后重新啟動,你在nacos控制台進行數據操作都會記錄在本地的MySQL數據庫了。
5.3 集群搭建
5.3.1 基本環境准備
根據官網
請確保是在環境中安裝使用:
環境准備:centos7系統、64 bit JDK 1.8+、Maven 3.2.x+、1個Nginx+3個nacos注冊中心+1個mysql
我是用虛擬機安裝的centos7,其他的就不說了,都可以百度到。安裝MySQL5.7的教程
下載Nacos的Linux版本:https://github.com/alibaba/nacos/releases/tag/2.0.2
下載完成后放到centos中解壓。
5.3.2 持久化配置
導入數據庫文件
# 登錄MySQL新建數據庫
create database nacos_config;
# 導入sql文件
mysql -uroot -p1311664842 nacos_config < /usr/local/nacos/nacos/conf/nacos-mysql.sql
修改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&serverTimezone=UTC
db.user=root
db.password=1311664842
注意:官網文檔沒有加上&serverTimezone=UTC
,建議在后面加上,不然有的MySQL版本可能啟動會報錯。
5.3.3 nacos集群配置
(1)配置cluster.conf
先復制一個出來
配置三個不同的端口,注意這里不能寫出127.0.0.1
(2)修改startup.sh,通過端口啟動不同的nacos
復制一個備份
修改startup.sh
后面啟動nacos的話,就使用startup.sh -P 端口號
的方式。
(3)配置nginx負載均衡
upstream cluster {
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
proxy_pass http://cluster;
(4)啟動相關的服務
# 啟動三個nacos服務
./startup.sh -P 3333
./startup.sh -P 4444
./startup.sh -P 5555
# 查看nacos是否正常啟動
ps -ef | grep nacos | grep -v grep | wc -l
# 指定配置文件啟動nginx服務
./nginx -c /usr/local/nginx/conf/nginx.conf
# 查看nginx是否正常啟動
ps -ef | grep nginx
(5)測試
測試之前需要關閉防火牆或者開啟1111端口,不然無法訪問。我這里是選擇關閉防火牆,因為是在虛擬機上,隨便搞
# 查看防火牆狀態
firewall-cmd --state
# 停止防火牆
systemctl stop firewalld.service
之后訪問http://192.168.73.128:1111/nacos,會發現可以打開nacos的登錄頁面,說明nginx進行了請求轉發
登錄后我們可以新建一個配置
然后我們在虛擬機上查看數據,發現數據已經保存進了MySQL數據庫。
(6)本地的微服務模塊注冊進nacos集群
之前我們有一個cloud-nacos-provider
模塊,我們可以嘗試把它注冊到虛擬機的nacos集群
修改application.yml文件
server:
port: 10001
spring:
application:
name: cloud-nacos-provider
cloud:
nacos:
discovery:
# server-addr: localhost:8848
server-addr: 192.168.73.128:1111
接着啟動該模塊,然后查看虛擬機的nacos控制台,可以發現服務成功注冊