Nacos 2.x 系列【20】集群部署
文章目录
- 1. 前言
- 2. 部署服务端
- 2.1 准备工作
- 2.2 集群节点配置
- 2.3 鉴权配置
- 2.4 配置数据源
- 2.5 配置 IP
- 2.6 配置端口
- 2.7 启动集群
- 3. 部署模式
- 3.1 直连模式
- 3.2 地址服务器模式
- 3.2.1 地址服务器
- 3.2.2 配置
- 3.3 VIP 模式(推荐)
- 3.3.1 Nginx
- 3.3.1 域名
1. 前言
官方文档
在实际生产环境中,必须保证 Nacos
高可用,所以需要使用集群模式部署。
2. 部署服务端
2.1 准备工作
由于是演示,所以直接选择在本机进行集群部署,环境说明:
JDK 1.8+
Windows 10
企业版(生产环境推荐使用Linux
)Mysql 5.7
(本地单机模式,生产环境推荐主从、集群)- 下载最新版的
Nacos
(下载地址)
2.2 集群节点配置
解压安装包,将 /nacos/cluster.conf.example
集群配置文件重命名为 cluster.conf
:
cluster.conf
添加集群节点 IP
,3
个或 3
个以上 Nacos
节点才能构成集群,这里只是演示,所以在本地安装三个不同端口的节点:
#it is ip
#example
127.0.0.1:8848
127.0.0.1:8850
127.0.0.1:8852
2.3 鉴权配置
生产环境中,安全性也是很重要的,需要添加相关鉴权配置,参考Nacos 2.x 系列【5】开启鉴权文档,\nacos\conf\application.properties
配置文件中添加鉴权:
### If turn on auth system:
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
# 实际使用时请务必更换为自定义的其他有效值
nacos.core.auth.server.identity.key=cluster
nacos.core.auth.server.identity.value=89012345678901234567890123456789
### worked when
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 String):
# 实际使用时请务必更换为自定义的其他有效值
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
2.4 配置数据源
Nacos
集群模式和单机模式一样,默认也只支持Derby
(内嵌数据库)、MySQL
数据库,生产环境建议使用 MySQL
或其他类型数据库,并搭建高可用。
参考 Nacos 2.x 系列【6】持久化 ,\nacos\conf\application.properties
配置文件中添加数据源:
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
# spring.datasource.platform=mysql
spring.sql.init.platform=mysql### Count of DB:
db.num=1### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/pearl_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
2.5 配置 IP
application.properties
配置节点 IP
,防止多网卡环境读取 IP
不正确问题:
### Specify local server's IP:
nacos.inetutils.ip-address=127.0.0.1
2.6 配置端口
服务端和客户端之间需要进行通信,集群节点之间也需要通信,会涉及到一些通信端口,需要确保这些端口未被占用,并在防火墙中放行。
涉及的端口:
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
8848 | 主端口,客户端、控制台及 OpenAPI 所使用的 HTTP 端口 | |
9848 | 1000 | 客户端 gRPC 请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端 gRPC 请求服务端端口,用于服务间同步等 |
7848 | -1000 | Jraft 请求服务端端口,用于处理服务端间的 Raft 相关请求 |
由于是本机环境安装集群,所以将上面修改过配置的安装包,复制为三份:
修改 nacos-8850
启动端口:
### Default web server port:
server.port=8850
修改 nacos-8852
启动端口:
### Default web server port:
server.port=8852
注意:集群节点需要确保 cluster.conf
、数据库配置是一样的
2.7 启动集群
点击启动脚本 startup.cmd
,查看启动控制台:
访问任意一个节点控制台,可以查看到使用的是集群模式,在节点列表可以查看到节点信息:
3. 部署模式
Nacos
常用的部署模式有以下几种:
- 直连:直接连真实
IP
- 地址服务器:查询地址进行连接
VIP
模式:使用虚拟IP
3.1 直连模式
直连模式中,客户端直接连接所有集群节点,是最简单的模式:
在 Spring Cloud
客户端中,spring.cloud.nacos.discovery.server-addr
配置所有集群节点:
spring:application:name: order-democloud:nacos:# 服务端用户名密码username: nacospassword: nacos# 服务发现discovery:# 命名空间namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec# 服务端地址,默认:127.0.0.1:8848server-addr: 127.0.0.1:8848,127.0.0.1:8850,127.0.0.1:8852# 配置中心config:namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ecserver-addr: 127.0.0.1:8848,127.0.0.1:8850,127.0.0.1:8852
这种方式,简单却不够灵活,一旦 IP
发生变化,需要修改配置重启应用,生产环境不推荐。
3.2 地址服务器模式
地址服务器即查询地址的服务器,发送一个请求,返回一串地址列表。在阿里内部比较普及,也是阿里中间件使用最广的一种寻址模式。
地址服务器模式,只需要配置一个地址即可,该地址可以使用 DNS
域名,而且可以轮询感知地址的变化。相较于直连模式来说,可靠性、可伸缩性更好,如果生产环境有地址服务器,可以选择该模式。
3.2.1 地址服务器
在 com.alibaba.nacos.client.naming.core.ServerListManager
服务列表管理器类中,可以看到在初始化服务器地址列表时,会优先根据 endpoint
参数查询从地址服务器查询地址列表,并开启线程轮询查询最新的地址并更新:
private void initServerAddr(NacosClientProperties properties) {// 获取 endpoint 参数this.endpoint = InitUtils.initEndpoint(properties);// endpoint 不为空if (StringUtils.isNotEmpty(this.endpoint)) {// this.serversFromEndpoint = this.getServerListFromEndpoint();// 多线程轮询感知地址变化,及时更新地址列表this.refreshServerListExecutor = new ScheduledThreadPoolExecutor(1, new NameThreadFactory("com.alibaba.nacos.client.naming.server.list.refresher"));this.refreshServerListExecutor.scheduleWithFixedDelay(this::refreshServerListIfNeed, 0L, this.refreshServerListInternal, TimeUnit.MILLISECONDS);} else {// endpoint 为空, serverAddr 参数获取服务器地址列表,多个使用逗号分割String serverListFromProps = properties.getProperty("serverAddr");if (StringUtils.isNotEmpty(serverListFromProps)) {this.serverList.addAll(Arrays.asList(serverListFromProps.split(",")));if (this.serverList.size() == 1) {this.nacosDomain = serverListFromProps;}}}}
getServerListFromEndpoint
获取服务器地址列表方法:
endpoint
参数只需要配置 IP
和端口即可,请求接口的固定格式为:
String urlString = "http://" + this.endpoint + "/nacos/serverlist";
这里直接创建一个 Spring Boot
工程,添加一个访问接口(请求路径必须为/nacos/serverlist
),直接返回多个集群节点地址:
@Controller
public class AddressController {@RequestMapping("/nacos/serverlist")public ResponseEntity<String> serverlist() {return ResponseEntity.ok().header("Content-Type", "text/plain").body("127.0.0.1:8848\r\n" +"127.0.0.1:8850\r\n" +"127.0.0.1:8852\r\n");}
}
3.2.2 配置
spring.cloud.nacos.discovery.endpoint
参数用于配置地址服务器,示例:
spring:cloud:nacos:# 服务端用户名密码username: nacospassword: nacos# 服务发现discovery:# 命名空间namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ecendpoint: 127.0.0.1:8080# 配置中心config:namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ecendpoint: 127.0.0.1:8080
3.3 VIP 模式(推荐)
VIP
即 Virtual IP
,虚拟 IP
作为客户端请求的目标 IP
地址。该模式下帮助 Nacos Client
屏蔽了后端真实 IP
,主需要关注 VIP
即可, VIP
很少会发生变化,扩容时,只需要让 VIP
感知到即可。
Nacos
官网也推荐将所有服务列表放到一个 VIP
下面,然后挂到一个域名下:
VIP
模式又可以分为以下两种:
SLB
(负载均衡)模式:使用内网SLB
(不可暴露到公网,以免带来安全风险),下面挂真实的集群节点IP
,客户端直连SLB
即可,地址为SLB
的IP
:port
- 域名 +
SLB
模式(推荐):使用内网SLB
,并将其IP
映射为域名,客户端直连域名即可,地址为nacos.com:port
,可读性好,而且换IP
方便
3.3.1 Nginx
SLB
这里使用开源的 Nginx
,在官网下载解压,nginx.conf
中使用 upstream
配置节点地址:
# Nacos 集群节点upstream nacos {server 127.0.0.1:8848;server 127.0.0.1:8850;server 127.0.0.1:8850;}
location
中配置转发:
location / {proxy_pass http://nacos;}
注意:使用VIP/nginx
请求时,需要配置成TCP
转发,不能配置http2
转发,否则连接会被nginx
断开。
3.3.1 域名
这里直接在 hosts
中配置一个本机域名:
127.0.0.1 nacos.com
启动 Nginx
访问http://nacos.com/nacos/
:
客户端服务地址直接填写域名即可:
spring:cloud:nacos:# 服务端用户名密码username: nacospassword: nacos# 服务发现discovery:# 命名空间namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ec# 服务端地址,默认:127.0.0.1:8848server-addr: nacos.com# 配置中心config:namespace: 0faa0970-1179-4143-8aa2-cac3ee6b42ecserver-addr: nacos.com