# 手动部署

2024年01月04日 星期四 18:00

Nacos 是Dynamic Naming and Configuration Service的首字母简称,它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 是阿里开放的一款中间件,主要提供三种功能: 持久化节点注册,即将节点信息注册到 Nacos 服务器,并保证节点在运行时状态能够实时更新。 非持久化节点注册,即将节点信息临时存储在 Nacos 服务器,当节点关闭或异常时,该节点信息将自动删除。 配置管理,即通过 Nacos 服务器集中管理配置文件,使得不同的服务能够共享统一的配置中心,提高配置效率。

# 所需端口

1739991942286.png

# 单机部署

安装配置

# 创建安装目录
mkdir -p /apps

# 安装 jdk
tar -xf jdk-8u381-linux-x64.tar.gz -C /apps/
mv /apps/jdk1.8.0_381 /apps/jdk
echo 'export JAVA_HOME=/apps/jdk' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
java -version

# 安装 maven - 非必需
tar -xf apache-maven-3.9.5-bin.tar.gz -C /apps/
mv /apps/apache-maven-3.9.5 /apps/maven
echo 'export PATH=/apps/maven/bin:$PATH' >> /etc/profile
source /etc/profile
mvn --version
# mvn help:system -Dexec.executable="echo" -Dexec.args='${user.home}'

# 安装 nacos
tar -xf nacos-server-2.2.3.tar.gz -C /apps/
# 修改启动文件中的jdk
sed -i '/cygwin=false/i\JAVA_HOME=/apps/jdk\n' /apps/nacos/bin/startup.sh
# 修改配置文件
# 官方说明: https://nacos.io/zh-cn/docs

# 查看是否开启鉴权
# 官方说明: https://nacos.io/zh-cn/docs/auth.html
grep -n 'nacos.core.auth.enabled' /apps/nacos/conf/application.properties

# 生成一个 32 位以上的密钥并使用 Base64 进行加密
KEY=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32) && echo -n "$KEY" | base64
# a2NIU2NtOHB5WTM2ZjJXUTROcUZvTWdyY0EyZ3oyaVI=
vim /apps/nacos/conf/application.properties
# 服务端口
server.port=8848
# 本机IP地址
nacos.inetutils.ip-address=192.168.100.157
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.100.160:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=i4Seeyon

# 是否开启鉴权功能 默认无鉴权 现开启鉴权
# 开启鉴权功能后,由于鉴权过程增加了额外的验证和权限检查的开销,可能会导致接口访问速度变慢
nacos.core.auth.enabled=true
# 关闭使用 user-agent 判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 自定义身份识别的key
nacos.core.auth.server.identity.key=seeyon
# 自定义身份识别的value
nacos.core.auth.server.identity.value=i4Seeyon
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥
nacos.core.auth.plugin.nacos.token.secret.key=a2NIU2NtOHB5WTM2ZjJXUTROcUZvTWdyY0EyZ3oyaVI=

服务管理

# 创建服务控制文件
# startup.sh -m standalone 单机模式
cat > /etc/systemd/system/nacos.service << 'EOF'
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/apps/nacos/bin/startup.sh -m standalone
ExecStop=/apps/nacos/bin/shutdown.sh
PrivateTmp=false

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start nacos
systemctl stop nacos

systemctl restart nacos
systemctl status nacos

systemctl enable nacos
systemctl disable nacos

建库语句 在数据库中创建用于nacos的库及用户。当前环境使用 mysql 数据库。

-- 使用 mysql 8.0.35 的版本

-- 创建数据库
create database if not exists nacos_config character set 'utf8mb4' collate 'utf8mb4_unicode_ci';

-- 创建用户
create user 'nacos'@'%' identified by 'i4Seeyon';
grant all privileges on nacos_config.* to 'nacos'@'%';
show grants for 'nacos'@'%';
flush privileges;

-- 查询用户
select user, host from mysql.user;

# 集群部署

# 拓扑架构

1739990662132.png

# 下载和安装

# 官方网址
# https://nacos.io
# https://github.com/alibaba/nacos/releases

# https://github.com/nacos-group/nacos-k8s/blob/master/operator/README-CN.md

# apache-maven-3.9.5-bin.tar.gz
# https://maven.apache.org/download.cgi

# https://www.oracle.com/java/technologies/downloads/#java8
# jdk-8u381-linux-x64.tar.gz

# nacos-server-2.2.3.tar.gz
# https://nacos.io/zh-cn/

# wget https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql

mkdir -p /apps

# 安装 jdk
tar -xf jdk-8u381-linux-x64.tar.gz -C /apps/
mv /apps/jdk1.8.0_381 /apps/jdk
# echo 'export PATH=/apps/jdk/bin:$PATH' >> /etc/profile
echo 'export JAVA_HOME=/apps/jdk' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
java -version

# 安装 maven - 非必需
tar -xf apache-maven-3.9.5-bin.tar.gz -C /apps/
mv /apps/apache-maven-3.9.5 /apps/maven
echo 'export PATH=/apps/maven/bin:$PATH' >> /etc/profile
source /etc/profile
mvn --version
# mvn help:system -Dexec.executable="echo" -Dexec.args='${user.home}'

# 安装 nacos
tar -xf nacos-server-2.2.3.tar.gz -C /apps/
cp /apps/nacos/conf/cluster.conf.example /apps/nacos/conf/cluster.conf
sed -i '/^192.168/d' /apps/nacos/conf/cluster.conf
sed -i '/^#it is ip/d' /apps/nacos/conf/cluster.conf
sed -i '/^#example/d' /apps/nacos/conf/cluster.conf

# 添加集群节点
cat >> /apps/nacos/conf/cluster.conf << 'EOF'
192.168.100.157:8848
192.168.100.158:8848
192.168.100.159:8848
EOF

# 如果数据库使用 mysql 8.0.x 则把数据库驱动 mysql-connector-j-8.2.0.jar 或 mysql-connector-j-8.0.33.jar 上传到以下目录下
mkdir -p /apps/nacos/plugins/mysql

# 使用内置数据库

不建议。如有需要可参考官方文档。

# 使用外置数据库

生产使用建议至少主备模式,或者采用高可用数据库。当前环境使用主主互备单写部署模式的 MySQL 数据库。

# 建库授权

-- 创建数据库
create database if not exists nacos_config character set 'utf8mb4' collate 'utf8mb4_unicode_ci';

-- 创建用户
create user 'nacos'@'%' identified by 'i4Seeyon';
grant all privileges on nacos_config.* to 'nacos'@'%';
show grants for 'nacos'@'%';
flush privileges;

-- 查看用户
select user, host from mysql.user;

-- 设置用户登录地址 - 在 mysql 8.2.0 起不支持 % 来开启远程连接
-- update mysql.user set host='%' where user='nacos' and host='%';

-- 权限回收
-- revoke all privileges on nacos_config.* from 'nacos'@'%';
-- grant select on database_name.table_name to 'nacos'@'%';数据初始化

以下两种方式二选一即可。当然,也可以通过 navicat 或 dbeaver 等其他图形化数据库管理软件执行。

# 使用 mysql client 时

通过 root 帐号在数据库上执行时

use nacos_config;
source /apps/nacos/conf/mysql-schema.sql

# 使用 usql 时

在任意主机上使用 usql 且通过 nacos 用户在 nacos_config 中执行时

usql --set SHOW_HOST_INFORMATION=false -t -A \
mysql://nacos:i4Seeyon@192.168.100.160:3306/nacos_config?tls=skip-verify -f "/apps/nacos/conf/mysql-schema.sql"

# 修改nacos配置文件

vim /apps/nacos/conf/application.properties
# 服务端口
server.port=8848
# 所在节点的本机IP地址
nacos.inetutils.ip-address=192.168.100.157
# 使用外置数据库
spring.sql.init.platform=mysql
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 使用单数据源
db.num=1
db.url.0=jdbc:mysql://192.168.100.160:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
db.user=nacos
db.password=i4Seeyon
1. jdbc:mysql://:这是JDBC URL的开始部分,表示使用MySQL数据库。
2. 192.168.100.160:3306:这是MySQL服务器的IP地址和端口号。
3. /nacos_config:这是要连接的数据库的名称。
4. characterEncoding=utf8:这设置了字符编码为UTF-8。
5. connectTimeout=1000:这设置了连接超时时间为1000毫秒。
6. socketTimeout=3000:这设置了套接字超时时间为3000毫秒。
7. autoReconnect=true:这允许在连接断开时自动重新连接。
8. useUnicode=true:这表示使用Unicode字符集。
9. allowPublicKeyRetrieval=true:这允许获取服务器的公钥。
10. useSSL=false:这表示不使用SSL连接。
11. serverTimezone=Asia/Shanghai:这设置了服务器时区为亚洲/上海。
# 默认无鉴权 若开启鉴权
# https://nacos.io/zh-cn/docs/auth.html
# grep -n 'nacos.core.auth.enabled' /apps/nacos/conf/application.properties

# 生成一个 32 位以上的密钥并使用 Base64 进行加密
# KEY=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32) && echo -n "$KEY" | base64
# a2NIU2NtOHB5WTM2ZjJXUTROcUZvTWdyY0EyZ3oyaVI=

# 是否开启鉴权功能 默认无鉴权 现开启鉴权 注意:如果开启默认鉴权插件,需要在Header中带上用户名密码。
# 开启鉴权功能后,由于鉴权过程增加了额外的验证和权限检查的开销,可能会导致接口访问速度变慢
nacos.core.auth.enabled=true
# 关闭使用 user-agent 判断服务端请求并放行鉴权的功能
nacos.core.auth.enable.userAgentAuthWhite=false
# 自定义身份识别的key
nacos.core.auth.server.identity.key=seeyon
# 自定义身份识别的value
nacos.core.auth.server.identity.value=i4Seeyon
# 默认鉴权插件用于生成用户登陆临时accessToken所使用的密钥
nacos.core.auth.plugin.nacos.token.secret.key=a2NIU2NtOHB5WTM2ZjJXUTROcUZvTWdyY0EyZ3oyaVI=

# 服务管理

# 修改启动文件中的jdk参数

sed -i '/cygwin=false/i\JAVA_HOME=/apps/jdk\n' /apps/nacos/bin/startup.sh使用自带脚本管理

# 启动服务

启动服务之前可以按需调整 startup.sh 中的 jvm 参数。

# Stand-alone mode
sh startup.sh -m standalone

# 集群模式-使用内置数据源
sh startup.sh -p embedded

# 集群模式-使用外置数据源
sh startup.sh

# 关闭服务

sh shutdown.sh

# 使用 systemd 进行服务管理

# 创建服务控制文件
cat > /etc/systemd/system/nacos.service << 'EOF'
[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/apps/nacos/bin/startup.sh
ExecStop=/apps/nacos/bin/shutdown.sh
PrivateTmp=false

[Install]
WantedBy=multi-user.target
EOF

# 服务管理命令

systemctl daemon-reload
systemctl start nacos
systemctl stop nacos

systemctl restart nacos
systemctl status nacos

systemctl enable nacos
systemctl disable nacos

# 查看服务启动日志

tail -f /apps/nacos/logs/start.out

服务正常启动则有如下提示信息:INFO Nacos started successfully in cluster mode. use external storage

# WebUI操作

浏览器访问 web ui 地址:http://任一节点IP地址:8848/nacos。配置了负载均衡的则使用 http://负载均衡地址:8848/nacos 进行访问。 初始帐号密码:nacos/nacos 依次选择左侧菜单中:权限控制-用户列表,此时右上角有个创建用户,按照提示创建用户:seeyon 和密码:i4Seeyon。 最后,记得修改初始帐号 nacos 的默认密码。

# 配置nginx负载均衡

在 nginx 代理服务器上操作。

注意事项:

1、如果代理服务器使用了主备模式,注意确保主备两个节点的配置要求一致。

2、不同版本的 nginx 或 tengine 支持的特性和编译时的功能模块,会影响相关的 nginx 配置。

# nacos.conf

cat > /apps/nginx/conf.d/http/nacos.conf << 'EOF'
upstream nacos-cluster {
    server 192.168.100.157:8848;
    server 192.168.100.158:8848;
    server 192.168.100.159:8848;
}

server {
    listen 8848;
    server_name cop.oso.plus;
    charset utf-8;

    location / {
        return 301 /nacos$request_uri;
    }

    location ~* ^/nacos(/.*)?$ {
        proxy_pass http://nacos-cluster;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
EOF

在 /apps/nginx/conf/nginx.conf 的 http 块添加下行

vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf.d/http/nacos.conf;

# nacos-grpc.conf

cat > /apps/nginx/conf.d/stream/nacos-grpc.conf << 'EOF'
# nacos-cluster-grpc
upstream nacos-cluster-grpc {
    server 192.168.100.157:9848;
    server 192.168.100.158:9848;
    server 192.168.100.159:9848;
}

server {
    resolver 192.168.100.254 [fe80::1]; # 注意按实际 DNS 地址调整

    listen 9848 ssl;
    server_name cop.oso.plus;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_certificate "/apps/nginx/certs/oso.plus.crt";
    ssl_certificate_key "/apps/nginx/certs/oso.plus.key";
    # ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;

    proxy_pass nacos-cluster-grpc;
}
EOF

在 /apps/nginx/conf/nginx.conf 的 stream 块添加下行

vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf.d/stream/nacos-grpc.conf;

# 重载nginx配置

为避免影响其他业务,请使用 reload 重载配置,而不是使用 restart 重启服务。

systemctl reload nginx
如果遇到类似以下报错:
v8-nginx-2 nginx[41359]: nginx: [emerg] invalid IPv6 address in resolver "[fe80::1%ens33]" in /apps/nginx/conf/nginx.conf:254
可在配置文件 /apps/nginx/conf.d/stream/nacos-grpc.conf 中的 server 块中添加下行:
resolver 192.168.100.254 [fe80::1]; # 注意按实际 DNS 地址调整

# 查看调整后的配置

cat /apps/nginx/conf.d/stream/nacos-grpc.conf
# nacos-cluster-grpc
upstream nacos-cluster-grpc {
    server 192.168.100.157:9848;
    server 192.168.100.158:9848;
    server 192.168.100.159:9848;
}

server {
    resolver 192.168.100.254 [fe80::1]; # 注意按实际 DNS 地址调整

    listen 9848 ssl;
    server_name cop.oso.plus;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_certificate "/apps/nginx/certs/oso.plus.crt";
    ssl_certificate_key "/apps/nginx/certs/oso.plus.key";
    # ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;

    proxy_pass nacos-cluster-grpc;
}

使用curl命令进行测试

# 这里使用V1的API接口 2.x的可参照官方文档使用V2的API。

# 1. 服务注册:
curl -X POST 'http://cop.oso.plus:8848/nacos/v1/ns/instance?serviceName=test-service&ip=127.0.0.1&port=8080'

# 2. 服务发现:
curl -X GET 'http://cop.oso.plus:8848/nacos/v1/ns/instance/list?serviceName=test-service'

# 3. 发布配置:
curl -X POST 'http://cop.oso.plus:8848/nacos/v1/cs/configs?dataId=test-data&group=DEFAULT_GROUP&content=hello,world!'

# 4. 获取配置:
curl -X GET 'http://cop.oso.plus:8848/nacos/v1/cs/configs?dataId=test-data&group=DEFAULT_GROUP'

# 在测试完成后,清理测试数据:
# 1. 删除实例:
curl -X DELETE 'http://cop.oso.plus:8848/nacos/v1/ns/instance?serviceName=test-service&ip=127.0.0.1&port=8080'

# 2. 删除配置:
curl -X DELETE 'http://cop.oso.plus:8848/nacos/v1/cs/configs?dataId=test-data&group=DEFAULT_GROUP'

# 配置prometheus监控

# nacos 集群所有节点

# https://nacos.io/zh-cn/docs/v2/guide/admin/monitor-guide.html

# nacos 集群所有节点 取消 #management.endpoints.web.exposure.include=.* 的注释
# vim /apps/nacos/conf/application.properties
sed -i 's%^#management.endpoints.web.exposure.include=.*%management.endpoints.web.exposure.include=*%' /apps/nacos/conf/application.properties

# 修改配置文件prometheus.yml采集Nacos metrics数据

# prometheus 服务器上修改配置文件 prometheus.yml 采集 Nacos metrics 数据
vim prometheus.yml
/.*:8848/
- job_name: "nacos-job"
    metrics_path: '/nacos/actuator/prometheus'
    static_configs:
      - targets: ['192.168.100.165:8848','192.168.100.166:8848','192.168.100.167:8848']

# 配置maven国内源

# 全局设置

文件位置:maven目录/conf/settings.xml

# 将以下配置写入<mirrors></mirrors>
nexus-aliyun * Nexus aliyun http://maven.aliyun.com/nexus/content/groups/public

# 项目设置

文件位置:maven项目中pom.xml

central aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ default true false

# 注意事项

当前v8不支持使用https协议的nacos。

# 达梦数据库支持

为了配置Nacos使用达梦数据库,我们可以依据以下步骤操作:

确认Nacos版本:确保您的Nacos版本是2.2或更高版本,因为从2.2版本开始,Nacos官方才开始支持包括达梦在内的多种数据库。

检查已有插件:访问Nacos插件仓库,在nacos-datasource-plugin-ext目录下查找是否有针对达梦数据库的现成插件。如果有,直接跳至步骤4。

自定义数据源插件:如果社区中没有提供达梦数据库的插件,您需要按照Nacos数据源插件开发指南自行开发。这通常涉及实现特定接口以适应达梦数据库的连接和操作。

下载或放置插件:将准备好的达梦数据库插件JAR文件放置在nacos-server路径/plugins目录下。

配置Nacos:修改nacos-server路径/conf/application.properties中的相关配置项,以适应达梦数据库。示例如下(请替换为实际的数据库连接信息):

spring.datasource.platform=dm // 假设dm代表达梦数据库的标识
db.url.0=jdbc:dm://localhost:5236/nacos
db.user=admin
db.password=admin123
db.pool.config.driverClassName=com.dameng.jdbc.Driver // 达梦数据库驱动类名

启动Nacos Server:完成配置后,启动Nacos Server,Nacos将会尝试使用配置的达梦数据库作为其数据存储。

请注意,虽然这里提供了配置的基本指导,但具体实现细节可能需要根据达梦数据库的实际驱动和配置需求调整。如果在配置过程中遇到问题,建议查阅达梦数据库的官方文档和Nacos的数据源插件开发指南以获取更详细的信息。
编撰人:yangfc