1.Nacos簡介
Nacos命名的前四個字母分別取自Naming(服務註冊,即服務命名管理)和Configuration(服務配置)的前兩個字母,s取自Service,也就是服務的意思。它是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺。
簡單一句話:Nacos=註冊中心+配置中心=Eureka+Config+Bus。
Nacos官網地址:https://nacos.io/zh-cn/,可以在這裏下載和查閱官方文檔。
服務註冊與服務發現框架 | CAP模型 | 控制檯管理 | 社區活躍度 |
Eureka | AP | 支持 | 低(2.x版本閉源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
2.安裝並運行Nacos
1.Windows安裝
通過Nacos下載地址選擇合適的版本(最好選穩定版本)下載zip包,需要本地配置好了Java8和Maven環境,解壓縮後,運行startup.cmd啓動Nacos,瀏覽器訪問http://localhost:8848/nacos查看管理後臺,輸入用戶名密碼(都是nacos)進入。
2.Linux安裝
這裏還是採用Docker的安裝和啓動方式,命令如下。
[root@bogon ~]# docker search nacos # 搜索Nacos鏡像,這裏只列出了第一個,我們等下也要用這個
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/nacos/nacos-server This project contains a Docker image meant... 73 [OK]
[root@bogon ~]# docker pull docker.io/nacos/nacos-server:1.3.0 # 拉取1.3.0版本鏡像,稍等片刻,如果不帶tag時候,默認下載的最新版本
[root@bogon ~]# docker run --env MODE=standalone -d -p 8848:8848 nacos/nacos-server:1.3.0 # 後臺運行Nacos,以單機模式運行
[root@bogon ~]# docker ps # 查看當前運行中的docker容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
563aac734e9e nacos/nacos-server:1.3.0 "bin/docker-startu..." 26 seconds ago Up 24 seconds 0.0.0.0:8848->8848/tcp practical_mcnulty
[root@bogon ~]# docker ps -a # 查看所有容器(不管是運行的還是沒運行的)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
563aac734e9e nacos/nacos-server:1.3.0 "bin/docker-startu..." About a minute ago Up About a minute 0.0.0.0:8848->8848/tcp practical_mcnulty
4d6cb9734993 nacos/nacos-server:1.3.0 "bin/docker-startu..." 3 minutes ago Exited (1) 2 minutes ago amazing_liskov
e4622b9228e7 rabbitmq:management "docker-entrypoint..." 7 days ago Exited (255) 23 hours ago 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp dreamy_cray
262532b32087 consul:1.6.1 "docker-entrypoint..." 2 weeks ago Exited (255) 7 days ago 8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp condescending_bartik
12121ee7ccdf zookeeper:3.4.9 "/docker-entrypoin..." 3 weeks ago Exited (143) 4 hours ago focused_mclean
3a4738e5d496 elasticsearch:6.8.7 "/usr/local/bin/do..." 7 weeks ago Exited (255) 7 weeks ago 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp xenodochial_banach
5eb892279b83 docker.io/rabbitmq:3.7.26-management "docker-entrypoint..." 7 weeks ago Exited (255) 7 weeks ago 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp nifty_visvesvaraya
9478537d54f6 redis "docker-entrypoint..." 7 weeks ago Exited (255) 7 weeks ago 0.0.0.0:6379->6379/tcp frosty_easley
0c492ce51767 mysql "docker-entrypoint..." 2 months ago Up 51 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp jolly_sammet
73f3714f4798 tomcat:8.5.34 "catalina.sh run" 2 months ago Exited (143) 2 months ago myTomcat
[root@bogon ~]# docker start 563aac734e9e # 如果已經有了容器,但是容器是關閉狀態的,只需要使用docker start 容器id啓動即可
安裝完成,啓動成功後,訪問http://192.168.0.123:8848/nacos,輸入用戶名密碼(都是nacos)查看管理後臺。
3.Nacos作爲服務註冊中心演示
這裏,我們需要創建一個服務提供者和一個服務消費者,把他們都註冊進Nacos裏。
基於Nacos的服務提供者
新建cloudalibaba-provider-payment9001模塊,在父pom.xml的dependencyManagement座標的dependencies中加入spring-cloud-alibaba-dependencies座標。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
修改子模塊的pom.xml,加入spring-cloud-starter-alibaba-nacos-discovery座標。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<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-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>
添加application.yml配置文件。
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.0.123:8848 # 指明Nacos的地址
management:
endpoints:
web:
exposure:
include: '*'
添加主啓動類,帶上@EnableDiscoveryClient用於開啓服務發現功能。
package com.atguigu.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
添加業務類便於測試。
package com.atguigu.springcloud.alibaba.controller;
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 PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id) {
return "Hello Nacos Discovery: " + serverPort + "\t id: " + id;
}
}
啓動Nacos,啓動Provider9001模塊訪問http://192.168.0.123:8848/nacos,點擊左側“服務管理”-“服務列表”即可看到Provider9001服務已經註冊進來了。
Nacos自帶負載均衡,爲了演示負載均衡,仿照cloudalibaba-provider-payment9001模塊創建cloudalibaba-provider-payment9002模塊,端口號做相應的修改即可,其他大致相同。
創建完成後,啓動Provider9002,查看Nacos管理後臺,nacos-payment-provider服務名對應的實例數由1變成了2。
基於Nacos的服務消費者
新建cloudalibaba-consumer-nacos-order83模塊,pom.xml和cloudalibaba-provider-payment9001一樣。添加application.yml。
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 192.168.0.123:8848 # 配置Nacos地址
# 消費者將去訪問的微服務地址,這裏採用服務名稱查找服務(成功註冊進nacos的微服務提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
主啓動類和cloudalibaba-provider-payment9001一樣,需要帶上@EnableDiscoveryClient註解。添加業務類。
package com.atuguigu.springcloud.alibaba.controller;
import lombok.extern.slf4j.Slf4j;
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;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")// 讀取application.yml裏的值
private String serverURL;
@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
添加配置類,注意,這裏一定要帶上@LoadBalance註解,因爲我們是通過服務名訪問生產者的,即使只有一個生產者,通過服務名訪問,也要帶上@LoadBalance註解,否則會報錯。
package com.atuguigu.springcloud.alibaba.config;
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();
}
}
啓動兩個生產者和一個消費者,通過瀏覽器訪問http://localhost:83/consumer/payment/nacos/1,根據請求返回值,可以看到負載均衡生效了,實際上,Nacos有負載均衡能力,是因爲它包含了Ribbon的jar包。
服務註冊中心對比
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
一致性檢查 | CP+AP | AP | CP | / | CP |
健康檢查 | TCP/HTTP/MySQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
負載均衡 | 權重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
雪崩保護 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自動註銷實例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
訪問協議 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
監聽支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多數據中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨註冊中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
Spring Cloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
Kubernetes集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Nacos支持AP和CP的切換,命令如下。
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
如果不需要存儲服務界別的信息且服務實例是通過nacos-client註冊的,並且能夠保持心跳上報,那麼就可以選擇AP模式,當前主流服務如Spring Cloud和Dubbo服務,都適用於AP模式,AP模式爲了服務的可用性減弱了一致性,因此AP模式下只支持註冊臨時實例。
如果需要在服務級別編輯或存儲配置信息,必須使用CP,Kubernetes服務和DNS服務都適用於CP模式,CP模式下支持註冊持久化實例,此時以Raft協議爲集羣運行,該模式下注冊實例前必須先註冊服務,如果服務不存在,會報錯。
4.Nacos作爲服務配置中心演示
1.基礎配置
新建cloudalibaba-config-nacos-client3377模塊,修改pom.xml,加入spring-cloud-starter-alibaba-nacos-config和spring-cloud-starter-alibaba-nacos-discovery座標。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-config-nacos-client3377</artifactId>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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-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>
添加bootstrap.yml和application.yml配置文件。這裏的bootstrap.yml和application.yml和之前的Spring Cloud Config裏的意思是一樣的,在項目初始化的時候,會先讀取bootstrap.yml,後讀取application.yml,其中bootstrap.yml屬於系統層面,application.yml屬於應用層面。
bootstrap.yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 192.168.0.123:8848 # Nacos服務註冊中心地址
config:
server-addr: 192.168.0.123:8848 # Nacos作爲配置中心地址
file-extension: yml #指定yml格式配置
application.yml
spring:
profiles:
active: dev # 表示開發環境
添加主啓動類,帶上@EnableDiscoveryClient註解。
package com.atguigu.springcloud.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
添加業務類,用於測試
package com.atguigu.springcloud.alibaba.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope // 通過Spring Cloud原生註解@RefreshScope實現配置自動刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
我們配置bootstrap.yml的目的,就是讓模塊啓動的時候,讀取bootstrap.yml的內容,去Nacos上查找配置文件的,那麼查找配置文件的規則是怎樣的呢?
從官方文檔可以看到一個公式:${prefix}-${spring.profile.active}.${file-extension}。下面也對這裏的參數做了解釋:
- ${prefix}:默認爲spring.application.name的值,也可以通過配置項spring.cloud.nacos.config.prefix來配置
- ${spring.profile.active}:爲當前環境對應的profile,當spring.profile.active爲空時,對應的連接符-也將不存在,dataId的拼接格式變成${prefix}.${file-extension}
- ${file-extension}:爲配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension來配置,目前只支持 properties和yaml類型
根據bootstrap.yml和application.yml可知,這個公式對應的值是:nacos-config-client-dev.yml,有了這個值,就可以在Nacos管理後臺做配置了,這個值對應管理後臺的Data Id。
進入Nacos管理後臺,點擊“配置管理”-“配置列表”,點擊右側的“+”,將剛纔的值輸入到Data Id裏。Group保持DEFAULT_GROUP默認即可,配置格式選擇YAML,在配置內容裏輸入如下內容,也就是要對應測試類Controller中的@Value("${config.info}"),最後點擊“發佈”即可。
config:
info: "this is nacos-config-client-dev.yml version=1"
啓動nacos-client3377模塊,訪問http://localhost:3377/config/info,可以讀取到剛纔的配置文件,接下來,我們在Nacos上修改配置文件,再次發佈,訪問http://localhost:3377/config/info,發現讀取到的配置信息立刻就變化了。
2.分組配置
在前面,我們往Nacos裏添加配置文件的時候,可以發現有Data Id,Group,命名空間(NameSpace)這些參數,通過這些參數,我們可以把配置文件做分組,便於查找和歸類。
其中NameSpace用於區分部署環境,Group和Data Id在邏輯上區分兩個目標對象。
根據官方文檔的說明,我們可以知道:
- NameSpace:用於進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的Group或Data ID的配置。Namespace的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
- Group:Nacos中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串對配置集進行分組,從而區分Data ID相同的配置集。當您在Nacos上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認採用DEFAULT_GROUP。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如database_url配置和MQ_topic配置。
- Data Id:Nacos中的某個配置集的ID。配置集ID是組織劃分配置的維度之一。Data ID通常用於組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。
Data Id配置方案:使用默認的NameSpace和默認的Group,在Nacos管理後臺創建兩個不同Data Id的配置文件,通過修改application.yml裏的spring.profile.active的值,即可實現讀取不同配置文件。
Group配置方案:在Nacos管理後臺創建一個Group,創建幾個配置文件,在Group裏輸入剛纔創建的Group的名稱。要想讀取指定Group下的配置文件,需要在spring.cloud.nacos.config下添加一個group屬性,指定要訪問哪個Group取配置文件。
NameSpace配置方案:在Nacos管理後臺創建一個NameSpace,在它下面創建幾個配置文件,要想讀取自定義NameSpace下的配置文件,需要在spring.cloud.nacos.config下添加一個namespace屬性,值爲命名空間的ID。
如果把Data Id、Group、NameSpace類比成一個Java項目的話,那麼NameSpace可以類比爲一個模塊,Group可以類比爲某個模塊裏的一個包,Data Id可以類比爲一個類。目的就是爲了不同粒度的配置隔離。
5.Nacos集羣和持久化配置(重要)
1.官網說明
Nacos單機部署手冊官方文檔地址:https://nacos.io/zh-cn/docs/deployment.html
Nacos集羣搭建手冊官方文檔地址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
在重啓Nacos後,我們可以看到,之前的配置還是存在的,這是因爲Nacos裏內置了Derby數據庫,但是,因爲我們不方便操作Derby數據庫,所以,改用MySQL和Nacos進行整合。
另外,正式環境,不可能只有一臺Nacos服務,需要Nacos服務集羣模式。如果啓動了多個Nacos結點,數據存儲存在一致性問題,爲了解決這個問題,Nacos採用集中式存儲來支持集羣化部署,目前只支持MySQL存儲。
我們先對單機支持MySQL數據庫,具體操作步驟:
- 安裝MySQL數據庫,版本:5.6.5+
- 使用數據庫初始化文件初始化MySQL數據庫,配置文件的內容不要修改
- 修改Nacos的conf/application.properties配置文件,增加MySQL數據源配置支持
2.Nacos持久化配置解釋
docker下載安裝MySQL鏡像,這裏我的Nacos使用的是1.3.0版本,MySQL使用的是8.0.19版本(踩坑了,後面說)。
首先創建nacos_config數據庫,然後在這個數據庫下,使用數據庫初始化文件初始化MySQL數據庫,這個用Navicat連接上MySQL執行即可。
使用如下命令,進入Docker容器中Nacos目錄,並修改application.properties。
[root@bogon ~]# docker ps # 查看當前運行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
563aac734e9e nacos/nacos-server:1.3.0 "bin/docker-startu..." 9 minutes ago Up 9 minutes 0.0.0.0:8848->8848/tcp practical_mcnulty
0c492ce51767 mysql "docker-entrypoint..." 2 months ago Up 58 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp jolly_sammet
[root@bogon ~]# docker exec -it practical_mcnulty bash # 進入Nacos裏,這裏的practical_mcnulty是docker ps命令中,Nacos的NAMES字段值,因爲我沒有取別名
[root@563aac734e9e nacos]# cd conf/ # 進入conf目錄下,就能找到application.properties了
[root@563aac734e9e conf]# ll
total 40
-rw-r--r--. 1 root root 2180 Jun 5 18:47 application.properties
-rw-r--r--. 1 501 games 25080 Jun 5 16:33 nacos-logback.xml
-rw-r--r--. 1 501 games 7456 May 15 18:35 schema.sql
[root@563aac734e9e conf]# exit # 使用exit命令退出Docker容器
exit
可以看到如下內容:
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:""}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=${MYSQL_SERVICE_USER}
db.password=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
這個裏面有許多${key:value}形式的東西,代表的意思是在Nacos啓動的時候,讀取啓動參數裏的key,如果讀取不到就使用冒號後面的值,我們的啓動參數裏並沒有帶這些值,所以,我們就直接修改配置文件好了。修改後的內容:
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
spring.datasource.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=1
db.url.0=jdbc:mysql://192.168.0.123:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
### The auth system to use, currently only 'nacos' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### The token expiration in seconds:
nacos.core.auth.default.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.default.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
重啓Nacos查看效果。然後崩了,訪問http://192.168.0.123:8848/nacos/進不去了,可是查找原因:Nacos還不支持MySQL8。
於是,我到Nacos的GitHub上查看,找到了這個:https://github.com/alibaba/nacos/pull/3060,裏面說已經支持MySQL8數據庫驅動了,再看一眼更新日期:12天前,也就是2020-06-15,回看Docker Hub上的Nacos:1.3.0信息的更新時間:19天前,也就是2020-06-08。好吧,1.3.0版本的還沒有更新MySQL8驅動,白高興了,或許使用latest(更新時間8天前,也就是2020-06-19)就支持了(這個我沒有測試,只是猜測),後續正式版本應該就支持了吧。
好吧,這裏把MySQL版本換成5.7的,繼續走上面的步驟,重啓Nacos查看效果,又崩了,查看日誌,大致意思是沒有找到數據源,仔細對比了一些MySQL連接,找到錯了,創建的數據庫是nacos_config,可是數據庫連接寫成了nacos-config,修改後,重啓,一切正常了。
3.Linux版Nacos+MySQL生產環境配置
Linux的下載安裝啓動,和Windows上類似,去官網下載即可,Linux需要下在*.tar.gz文件,下載後解壓,在bin文件夾下可以看到startup.sh,啓動即可。這裏,我繼續使用Docker進行操作,也是複習一下Docker。
爲了演示集羣搭建,我們需要一個Nginx,三個Nacos,一個MySQL。使用Docker安裝Nginx並啓動。
[root@bogon ~]# docker pull nginx:stable
Trying to pull repository docker.io/library/nginx ...
stable: Pulling from docker.io/library/nginx
8559a31e96f4: Already exists
9a38be3aab21: Pull complete
522e5edd83fa: Pull complete
2ccf5a90baa6: Pull complete
Digest: sha256:159aedcc6acb8147c524ec2d11f02112bc21f9e8eb33e328fb7c04b05fc44e1c
Status: Downloaded newer image for docker.io/nginx:stable
[root@bogon ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rabbitmq management 95bc78c8d15d 10 days ago 187 MB
docker.io/nginx stable 9fc56f7e4c11 2 weeks ago 132 MB
docker.io/mysql 5.7 9cfcce23593a 2 weeks ago 448 MB
docker.io/nacos/nacos-server 1.3.0 d1f1facebfbc 3 weeks ago 756 MB
docker.io/rabbitmq 3.7.26-management d2d45254c99b 7 weeks ago 180 MB
docker.io/redis latest f9b990972689 8 weeks ago 104 MB
docker.io/mysql latest 0c27e8e5fcfa 2 months ago 546 MB
docker.io/elasticsearch 6.8.7 9cdc9986c313 4 months ago 880 MB
docker.io/consul 1.6.1 48b314e920d6 9 months ago 116 MB
docker.io/tomcat 8.5.34 ca9e2fccef98 20 months ago 463 MB
docker.io/zookeeper 3.4.9 3b83d9104a4c 3 years ago 129 MB
[root@bogon ~]# docker run -d -p 80:80 nginx:stable
e950da524e2aa17716f435fe5e745978b4ea36e7fd53a6506efcbed2f7946c7a
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e950da524e2a nginx:stable "nginx -g 'daemon ..." 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp festive_booth
fe0f363d0c89 mysql:5.7 "docker-entrypoint..." About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, 33060/tcp hungry_colden
563aac734e9e nacos/nacos-server:1.3.0 "bin/docker-startu..." 2 hours ago Up 52 minutes 0.0.0.0:8848->8848/tcp practical_mcnulty
[root@bogon ~]#
通過瀏覽器訪問http://192.168.0.123:80,如果能看到Welcome to nginx!說明Nginx啓動成功。Nginx先放到一邊過會再做配置,先搭建Nacos集羣。
經歷了2天的折騰,終於把Nacos集羣搞好了,差點放棄,因爲官方文檔更新不及時,我踩坑了……後文會說。
先說一下我的集羣環境,我這裏使用的是nacos/nacos-server:1.3.0的鏡像,在一臺機器上通過Docker鏡像的方式,部署了3臺Nacos,通過端口號作爲區分,虛擬機分配了4G內存(勉強夠用,小了恐怕啓動不起來),下面開始吧。
docker pull nacos/nacos-server:1.3.0 # 拉取nacos/nacos-server:1.3.0鏡像,靜靜等待即可
# 輸入以下命令,搭建集羣
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=3333 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 3333:3333 \
--name nacos3333 \
nacos/nacos-server:1.3.0
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=4444 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 4444:4444 \
--name nacos4444 \
nacos/nacos-server:1.3.0
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=5555 \
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.0.123 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=192.168.0.123 \
-p 5555:5555 \
--name nacos5555 \
nacos/nacos-server:1.3.0
拿一個出來簡單說說配置吧。
docker run -d \ # -d表示是後臺運行
-e MODE=cluster \ # 以集羣模式運行
-e NACOS_APPLICATION_PORT=3333 \ # 這臺Nacos服務的port是3333
-e NACOS_SERVERS=192.168.0.123:3333,192.168.0.123:4444,192.168.0.123:5555 \ # Nacos集羣的所有機器的信息
-e SPRING_DATASOURCE_PLATFORM=mysql \ # 使用外置MySQL存儲配置信息
-e MYSQL_SERVICE_HOST=192.168.0.123 \ # 外置MySQL的IP
-e MYSQL_SERVICE_PORT=3306 \ # 外置MySQL的port
-e MYSQL_SERVICE_USER=root \ # 外置MySQL的用戶名
-e MYSQL_SERVICE_PASSWORD=root \ # 外置MySQL的密碼
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # 外置MySQL的數據庫,也就是Nacos的配置文件要存儲得到哪個數據庫,這個在單機版Nacos使用外置數據庫時候介紹過
-e NACOS_SERVER_IP=192.168.0.123 \ # 這臺Nacos服務的IP
-p 3333:3333 \ # 容器外部端口映射
--name nacos3333 \ # 給容器起個名字吧
nacos/nacos-server:1.3.0 # 運行哪個鏡像
先說下我碰到的坑,從官方文檔找參數,Nacos的port對應的是NACOS_SERVER_PORT,那就照着寫唄,寫上之後,3臺啓動唄,啓動後,使用命令docker logs -f 容器id查看啓動日誌,3臺Nacos看到的都是Nacos started successfully in cluster mode. use external storage,表示啓動成功了,那就訪問訪問唄,結果,提示“無法訪問此網站,拒絕了我們的連接請求”,這就很尷尬,肯定是哪裏還有問題。進入其中某一臺機器,查看conf/naming-raft.log日誌,提示的是no leader is available now!,也就是這個集羣沒有leader,奇了怪了,3臺機器都正常啓動,正常情況下,要選出一個leader呀。
反反覆覆檢查了幾遍參數,並對照着文檔看了下,沒寫錯呀,刪掉容器重建,折騰了5,6次,還是不行,關於報錯,也是沒有查到什麼有幫助的解釋。
這時候,我突然發現了文檔上的一個問題,MYSQL_DATABASE_NUM給的默認值是2,和之前conf/application.properties裏的${MYSQL_DATABASE_NUM:1}默認值是1不符呀?哪裏錯了?翻了翻GitHub,找到了答案:移除數據庫主從鏡像配置。再看官方文檔,裏面還有MYSQL_MASTER_SERVICE_HOST、MYSQL_SLAVE_SERVICE_HOST等字眼。突然意識到了一個問題:文檔很可能沒有更新。
查看bin/docker-startup.sh和conf/application.properties這兩個文件,因爲我們通過-e指定的參數,大多數都用在這裏了,很快我發現了conf/application.properties裏的{NACOS_APPLICATION_PORT:8848},似曾相識啊!和NACOS_SERVER_PORT確實有點像,坑點就在這裏:對於nacos/nacos-server:1.3.0鏡像,自定義Nacos端口號的時候,不要使用NACOS_SERVER_PORT,要使用NACOS_APPLICATION_PORT!因爲conf/application.properties裏寫了。
在看bin/docker-startup.sh的時候,我發現了這麼一段,不懂Bash,但是大致能看懂一些,就是遍歷${NACOS_SERVERS}的值,把它們輸出到$CLUSTER_CONF文件裏。
function print_servers(){
if [[ ! -d "${PLUGINS_DIR}" ]]; then
echo "" > "$CLUSTER_CONF"
for server in ${NACOS_SERVERS}; do
echo "$server" >> "$CLUSTER_CONF"
done
else
bash $PLUGINS_DIR/plugin.sh
sleep 30
fi
}
看看這個配置文件裏寫了什麼,這就有意思了,打開配置文件cluster.conf一看,裏面竟然有4行ip:port值,除了我定義的3333,4444,5555端口之外,還有一個8848端口,這是怎麼冒出來的?又一次驗證了我對端口配置的懷疑,自定義端口可能沒生效,有的服務可能走了默認端口。
抱着試一試的想法,把-e參數裏的NACOS_SERVER_PORT改成了NACOS_APPLICATION_PORT,啓動3臺機器容器,訪問http://192.168.0.123:3333/nacos/、http://192.168.0.123:4444/nacos/、http://192.168.0.123:5555/nacos/都可以正常訪問了,和剛纔相比,向成功邁進了一步。再點擊“集羣管理”-“結點列表”查看結點,集羣搭建成功了!
現在是2020-06-29,文檔還沒有更新,貼一下吧,踩過的坑……
這種方式搭建Nacos集羣有點麻煩,另外介紹一種簡單點的方式:使用docker-compose運行Nacos集羣,下面開始操作。
使用命令“docker-compose -v”查看本機是否安裝過docker-compose,如果沒有安裝,可以參考這裏進行安裝。
[root@localhost ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 下載docker-compose
……
[root@localhost ~]# sudo chmod +x /usr/local/bin/docker-compose # 給docker-compose加運行權限
[root@localhost ~]# docker-compose -v # 驗證docker-compose是否安裝成功
docker-compose version 1.26.0, build d4451659
這裏還要用到git,如果沒有git的還要安裝下git纔行。
[root@localhost ~]# git --version # 驗證是否安裝git
git version 1.8.3.1
[root@localhost ~]# yum install -y git # 如果沒有安裝git,使用這個命令安裝git
……
[root@localhost ~]# git clone https://github.com/nacos-group/nacos-docker.git # 下載nacos-docker
很快,nacos-docker下載完成了,主要關注env和example文件夾。env裏是一些環境變量,example是運行實例的例子,先把相關的命令列出來,在運行(在nacos-docker文件夾下執行命令)之前,需要查看下*.yaml裏到底寫的什麼,是否需要根據自己的情況做修改呢?
[root@localhost ~]# docker-compose -f example/standalone-derby.yaml up # 使用Derby作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/standalone-mysql-5.7.yaml up # 使用mysql-5.7作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/standalone-mysql-8.yaml up # 使用mysql-8作爲數據源,單機模式啓動
[root@localhost ~]# docker-compose -f example/cluster-hostname.yaml up # 使用mysql5.7作爲數據源,集羣模式啓動
這裏只說集羣模式了(cluster-hostname.yaml),集羣模式看懂了,單機就不在話下了。
version: "3"
services:
nacos1:
hostname: nacos1
container_name: nacos1 # 容器名稱
image: nacos/nacos-server:latest # 容器使用的鏡像
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports: # 端口映射
- "8848:8848"
- "9555:9555"
env_file: # nacos環境變量
- ../env/nacos-hostname.env
restart: always # 開機自啓
depends_on: # 數據源使用的是mysql
- mysql
nacos2:
hostname: nacos2
image: nacos/nacos-server:latest
container_name: nacos2
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
env_file:
- ../env/nacos-hostname.env
restart: always
depends_on:
- mysql
nacos3:
hostname: nacos3
image: nacos/nacos-server:latest
container_name: nacos3
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8850:8848"
env_file:
- ../env/nacos-hostname.env
restart: always
depends_on:
- mysql
mysql:
container_name: mysql
image: nacos/nacos-mysql:5.7 # 使用的mysql版本號
env_file:
- ../env/mysql.env # mysql環境變量
volumes:
- ./mysql:/var/lib/mysql
ports: # 端口映射
- "3306:3306"
如果虛擬機內存足夠大(大於等於4G),那麼可以直接運行上面的命令,否則,需要在nacos-hostname.env裏添加jvm參數後,再使用上面的命令啓動(配置完參數後實測,3臺Nacos+1臺mysql剛剛跑起來已經2.25G內存了,如果不配參數,4G內存接近喫滿)。
#jvm
JVM_XMS=256m
JVM_XMX=256m
JVM_XMN=256m
啓動的時候,報了一個錯:chown: cannot read directory '/var/lib/mysql/': Permission denied,這是因爲CentOS7默認開啓了selinux安全模塊,使用命令:su -c "setenforce 0"臨時關閉selinux模塊再啓動,等待拉取鏡像以及初始化之後,通過瀏覽器就可以訪問了,放一個效果圖。
既然Nacos集羣搭建好了,下面看一下Nginx的配置。
[root@bogon ~]# docker exec -it festive_booth bash # 進入Nginx容器,festive_booth是docker ps命令中nginx的NAMES字段值
root@e950da524e2a:/# cd /etc/nginx/ # 進入/etc/nginx目錄
root@e950da524e2a:/etc/nginx# ls -l # 查看目錄下的文件
total 36
drwxr-xr-x. 1 root root 26 Jun 9 16:58 conf.d
-rw-r--r--. 1 root root 1007 Apr 21 12:43 fastcgi_params
-rw-r--r--. 1 root root 2837 Apr 21 12:43 koi-utf
-rw-r--r--. 1 root root 2223 Apr 21 12:43 koi-win
-rw-r--r--. 1 root root 5231 Apr 21 12:43 mime.types
lrwxrwxrwx. 1 root root 22 Apr 21 12:43 modules -> /usr/lib/nginx/modules
-rw-r--r--. 1 root root 643 Apr 21 12:43 nginx.conf
-rw-r--r--. 1 root root 636 Apr 21 12:43 scgi_params
-rw-r--r--. 1 root root 664 Apr 21 12:43 uwsgi_params
-rw-r--r--. 1 root root 3610 Apr 21 12:43 win-utf
root@e950da524e2a:/etc/nginx# cat nginx.conf # 查看nginx.conf的內容
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
nginx.conf就是nginx的主配置文件,注意最後一行有一個include /etc/nginx/conf.d/*.conf;的語句,它的意思是:加載配置文件的時候,把/etc/nginx/conf.d下的*.conf文件包括進來,我們看看/etc/nginx/conf.d下有什麼文件,發現另一個default.conf。
root@e950da524e2a:/etc/nginx# cd /etc/nginx/conf.d/
root@e950da524e2a:/etc/nginx/conf.d# ls -l
total 4
-rw-r--r--. 1 root root 1114 Jun 9 16:58 default.conf
root@e950da524e2a:/etc/nginx/conf.d# cat default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
當我嘗試修改這個配置文件的時候,發現vi和vim命令無法使用,只能採用別的方法:掛載外部配置文件以替代docker容器內的配置文件。
在/usr/下創建一個docker-nginx的文件夾,在裏面添加一個nginx.conf配置文件,主要關注點在upstream結點上,內容如下:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream cluster {
server 192.168.0.123:3333;
server 192.168.0.123:4444;
server 192.168.0.123:5555;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://cluster;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
使用docker stop 容器id命令,把之前的容器停掉,docker rm 容器id把之前的容器刪除,以掛載外置配置文件方式重新運行一個容器,啓動命令:docker run -d -p 80:80 -v /usr/docker-nginx/nginx.conf:/etc/nginx/nginx.conf nginx:stable。
瀏覽器訪問:http://192.168.0.123/nacos,根據Nginx的負載均衡規則, 可以正常訪問到某臺Nacos,登陸進去即可,一切順利!
最後一步,我們將cloud-alibaba-provider-payment9002服務註冊進Nacos集羣。修改application.yml配置文件的server-addr的值,讓其指向Nginx。
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 192.168.0.123:80 # 指向Nginx,由Nginx進行轉發(nginx下部署了3臺Nacos集羣)
# server-addr: 192.168.0.123:8848 # 指明Nacos的地址
management:
endpoints:
web:
exposure:
include: '*'
Nginx下有3臺Nacos部署的集羣環境,由Nginx進行轉發,啓動Payment9002,訪問http://192.168.0.123/nacos,查看“服務管理”-“服務列表”,可以看到服務成功註冊進來了。