笔者在本地使用 VMware 创建了 3 台虚拟机,这里要注意,虚拟机的内存不能太小,如果内存较小的话,Nacos 集群启动 logs/start.out
会一直报 INFO Nacos is starting...
虚拟机环境准备好后,从 github 上下载 Nacos 服务,可以从 https://github.com/alibaba/nacos/tags 下载你需要的版本。
这里我选择的是 2.3.0 版本,使用如下命令下载 Nacos 服务,并解压。
wget https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.gz
tar -zxvf nacos-server-2.3.0.tar.gz
配置使用外部 MySQL 数据源
进入到 nacos 目录中,目录结构如下所示:
搭建 Nacos 集群,这里推荐使用外部 MySQL 作为其数据源,初始化的 SQL 文件为 conf/mysql-schema.sql
,在 MySQL 中创建 database,并执行该 SQL 脚本文件进行初始化操作。
之后复制 conf/application.properties.example
并重命名文件为 conf/application.properties
修改配置内容如下:
spring.sql.init.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.2.11:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=12345678
上面的配置主要就是 MySQL 的配置,这里可以指定多数据源,db.num=1
既表示只使用一个数据源。
配置鉴权
修改配置文件 conf/application.properties
,内容如下:
# 开启鉴权功能
nacos.core.auth.enabled=true
# 用于替换useragent白名单的身份识别key,使用默认值有安全风险,这里可以自己随意指定
nacos.core.auth.server.identity.key=test_xxx
# 用于替换useragent白名单的身份识别value,使用默认值有安全风险,这里可以自己随意指定
nacos.core.auth.server.identity.value=test_ooo
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥,使用默认值有安全风险
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=dsfjjsaofljslsfjhsklfhsk187979790o9879sfsfhjsafklhsaf898s7f=
官方文档地址:https://nacos.io/docs/latest/guide/user/auth/
配置集群模式并启动服务
复制 conf/cluster.conf.example
并重命名文件为 conf/cluster.conf
,修改 cluster.conf
文件内容:
centos7-001:8848
centos7-002:8848
centos7-003:8848
上面的配置是指定 Nacos 服务的地址,这里 centos7-001
,centos7-002
,centos7-003
表示服务的 IP 地址或域名。之后保存配置文件,将 nacos 服务目录复制到其他两个虚拟机上,之后分别在 3 台虚拟机上启动 Nacos 服务,启动命令为:bin/startup.sh
如果要停止服务,运行 bin/shutdown.sh
使用 Nginx 配置负载均衡
在其中一台虚拟机上我们安装 Nginx 服务,之后进行负载均衡配置。
修改 Nginx 配置文件,我的配置文件在 /usr/local/nginx/conf/nginx.conf
目录下,增加如下配置内容:
# HTTP 负载均衡配置
http {
# 负载均衡配置
upstream nacos-cluster {
# 第一个服务的地址
server centos7-001:8848;
# 第二个服务的地址
server centos7-002:8848;
# 第三个服务的地址
server centos7-003:8848;
}
# nacos服务配置
server {
listen 18848;
server_name localhost;
location / {
# 反向代理
proxy_pass http://nacos-cluster;
}
}
}
# gRPC(TCP长连接)负载均衡配置
stream {
# 负载均衡配置(TCP长连接配置)
upstream nacos-cluster-tcp {
server centos7-001:9848;
server centos7-002:9848;
server centos7-003:9848;
}
# 监听端口号
server {
listen 19848;
proxy_pass nacos-cluster-tcp;
}
}
Nacos 2.0 版本相比 1.x 新增了 gRPC 的通信方式,如下所示:
如果存在防火墙或者nginx端口转发问题,需要进行相应的端口暴露配置。如在nginx中,在已经暴露8848(x)的基础上,需要额外暴露9848(x+1000)。注意,如果要使用集群方式部署的话,需要防火墙放开 9849 端口,否则会导致集群下各nacos节点注册服务不一致问题。
在上面的配置中,我们使用 18848 端口进行服务的转发,所以需要额外暴漏 19848 端口,并设置负载均衡,这样服务注册就不会报错了。
需要注意 3 台虚拟机的防火墙端口的设置。
本地访问 http://centos7-001:18848/nacos/#/login 可以看到如下页面:
用户名和密码默认都是 nacos
在项目中可以如下配置进行服务的注册:
其他问题
Q1: nginx: [emerg] unknown directive “stream” 错误
如果 Nginx 配置完报错,如:User nginx: [emerg] unknown directive “stream” in /usr/local/nginx/conf/nginx.conf:138
遇到 nginx: [emerg] unknown directive "stream" in /usr/local/nginx/conf/nginx.conf:138
错误,通常意味着 Nginx 不支持 stream
指令。这个问题可能由以下几个原因导致:
1. Nginx 版本过低
stream
模块在 Nginx 1.9.0(2015年发布的一个主要版本)及以后的版本中引入。如果你使用的 Nginx 版本低于 1.9.0,那么它将不支持 stream
指令。可以通过执行 nginx -v
命令来检查你当前的 Nginx 版本。
解决方案
- 如果你的 Nginx 版本低于 1.9.0,建议升级到最新的稳定版本。可以访问 Nginx 官网 或使用系统的包管理器来进行升级。
2. 编译时未包含 stream
模块
在某些情况下,即使 Nginx 版本支持 stream
模块,如果在编译时没有包含该模块,也会导致这个错误。stream
模块不是默认编译进 Nginx 的,需要在编译时通过 --with-stream
选项显式指定。
解决方案
-
你可能需要重新编译 Nginx,并在配置阶段加入
--with-stream
参数。以下是一个编译 Nginx 的示例命令:./configure --with-stream ... make sudo make install
确保替换
...
为你的其他配置选项。
Q2. 如何知晓请求被分发到了哪个服务上?
在 Nginx 配置文件中,你可以定制 access_log 指令来记录每个请求的详细信息,包括它被转发到的后端服务器。通过添加自定义日志格式,你可以包含代理到的后端服务器地址。
- 定义日志格式:首先,在
http
块中定义一个自定义的日志格式,加入$upstream_addr
变量来记录后端服务器地址。
http {
log_format upstreamlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'-> $upstream_addr';
}
- 应用自定义日志格式:然后,在你的
server
块或location
块中使用这个自定义的日志格式。
access_log /var/log/nginx/access.log upstreamlog;
这样在 /var/log/nginx/access.log
就可以知道请求转发到哪个后端服务器的地址了。