一、Nacos 概览
Nacos /nɑ:kəʊs/
是 Dynamic Naming and Configuration Service
的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos
致力于帮助您发现、配置和管理微服务。Nacos
提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos
帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos
是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
服务(Service
)是 Nacos
世界的一等公民。Nacos
支持几乎所有主流类型的“服务”的发现、配置和管理:
-
Kubernetes Service
-
gRPC & Dubbo RPC Service
-
Spring Cloud RESTful Service
Nacos
的关键特性包括:
- 服务发现和服务健康监测
Nacos
支持基于 DNS
和基于 RPC
的服务发现。服务提供者使用 原生SDK
、OpenAPI
、或一个独立的Agent
注册 Service
后,服务消费者可以使用DNS
或HTTP&API
查找和发现服务。
Nacos
提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos
支持传输层 (PING
或 TCP
)和应用层 (如 HTTP
、MySQL
、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC
、边缘网络等)服务的健康检查,Nacos
提供了 agent 上报模式
和服务端主动检测
2种健康检查模式。Nacos
还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
- 动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos
提供了一个简洁易用的UI
帮助您管理所有的服务和应用的配置。Nacos
还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
- 动态 DNS 服务
动态 DNS
服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS
解析服务。动态DNS
服务还能让您更容易地实现以 DNS
协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API
上的风险。
Nacos
提供了一些简单的 DNS APIs
帮助您管理服务的关联域名和可用的 IP:PORT
列表。
- 服务及其元数据管理
Nacos
能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA
以及最首要的 metrics
统计数据。
更多介绍请见官网:https://nacos.io/zh-cn/
二、环境准备
根据上篇文章,完成基础数据库的搭建,为保证其在生产环境下的高可用,数据库采用主从复制模式,nacos部署采用集群模式,数据库可详见:mysql8 数据库安装及主从配置 | Spring Cloud 2
关于mysql主库后的自动故障转移,在后续章节进行补充
特殊说明:本章节的全部环境搭建均基于docker进行
2.1 环境说明
服务器IP | 主定义域名 |
---|---|
172.30.1.31/192.168.0.31 | nacos1.kc |
172.30.1.41/192.168.0.41 | nacos2.kc |
172.30.1.42/192.168.0.42 | nacos3.kc |
三台服务器均是双网卡,关于已域名采用
dnsmasq
进行搭建,计划在下篇文章补充dnsmasq
的使用说明。
2.2 数据库初始化
请在https://github.com/alibaba/nacos/releases 选择安装的版本,下载解压后,文件nacos\nconf\mysql-schema.sql
为数据库初始语句。
在主库下执行:
三、单机模式搭建及常用配置
3.1 目录结构
.
└── init.d
│ ├── application.properties
└── env
│ ├── nacos-config.env
└── docker-compose.yml
└── mysql-schema.sql
3.2 数据库及常用配置
nacos-config.env
# 支持IP还是域名模式
PREFER_HOST_MODE=hostname
# 系统启动方式: 集群/单机
MODE=standalone
# 多网卡模式下可以指定IP
NACOS_SERVER_IP=nacos1.kc
# 单机模式下支持MYSQL数据库
SPRING_DATASOURCE_PLATFORM=mysql
# 数据库连接地址
MYSQL_SERVICE_HOST=mysql.kc
# 数据库库名
MYSQL_SERVICE_DB_NAME=nacos
# 数据库端口
MYSQL_SERVICE_PORT=3306
# 数据库用户名
MYSQL_SERVICE_USER=root
# 数据库用户密码
MYSQL_SERVICE_PASSWORD=1qaz@WSX
# 数据库连接参数
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 是否开启权限系统
NACOS_AUTH_ENABLE=true
更多环境配置请见:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start-docker.html
application.properties
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
# default current work dir
server.tomcat.basedir=file:.
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.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}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.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}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
## spring security config
### turn off security
nacos.security.ignore.urls=${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
management.endpoints.web.exposure.include=*
更多配置参数说明:https://nacos.io/zh-cn/docs/v2/guide/admin/system-configurations.html
3.3 docker-compose.yml
注意镜像版本必须与数据库初始语句版本一致
version: "3.8"
# 通用日志设置
x-logging:
&default-logging
# 日志大小和数量
options:
max-size: "100m"
max-file: "3"
# 文件存储类型
driver: json-file
services:
nacos:
image: nacos/nacos-server:v2.2.0
container_name: nacos
env_file:
- /root/apps/nacos-docker-deploy/env/nacos-config.env
volumes:
- /root/apps/nacos/logs/:/home/nacos/logs
- /root/apps/nacos-docker-deploy/init.d/application.properties:/home/nacos/conf/application.properties
ports:
- "7848:7848"
- "8848:8848"
- "9848:9848"
- "9555:9555"
restart: on-failure
logging: *default-logging
3.4 启动服务
docker-compose up -d
浏览器访问:http://192.168.0.31:8848/nacos
四、集群模式搭建及常用配置
4.1 集群配置
沿用单机模式的相关配置,只需修改每台服务器上的
/env/nacos-config.env
文件,注意NACOS_SERVER_IP
修改为集群中每台服务器对应的IP或域名,避免重复。
nacos-config.env
# 支持IP还是域名模式
PREFER_HOST_MODE=hostname
# 系统启动方式: 集群/单机
MODE=cluster
# 多网卡模式下可以指定IP
NACOS_SERVER_IP=nacos1.kc
# 集群地址
NACOS_SERVERS=nacos1.kc:8848 nacos2.kc:8848 nacos3.kc:8848
# 单机模式下支持MYSQL数据库
SPRING_DATASOURCE_PLATFORM=mysql
# 数据库连接地址
MYSQL_SERVICE_HOST=mysql.kc
# 数据库库名
MYSQL_SERVICE_DB_NAME=nacos
# 数据库端口
MYSQL_SERVICE_PORT=3306
# 数据库用户名
MYSQL_SERVICE_USER=root
# 数据库用户密码
MYSQL_SERVICE_PASSWORD=1qaz@WSX
# 数据库连接参数
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
# 是否开启权限系统
NACOS_AUTH_ENABLE=true
剩余其他服务器的配置请自行复制修改。
4.2 搭建SLB
根据官网提示,利用nginx
搭建SLB
进行集群访问,详见:https://nacos.io/zh-cn/docs/v2/guide/admin/cluster-mode-quick-start.html
4.2.1 目录结构
.
└── default.conf
└── docker-compose.yml
└── nginx.conf
4.2.2 docker-compose.yml
此处需注意在
nacos2.0
以上配置需开放8848
、9848
两个端口。
version: "3.8"
# 通用日志设置
x-logging:
&default-logging
# 日志大小和数量
options:
max-size: "100m"
max-file: "3"
# 文件存储类型
driver: json-file
services:
nginx:
image: nginx:1.20.2
container_name: nacos-nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./default.conf:/etc/nginx/conf.d/default.conf
ports:
- "8848:8848"
- "9848:9848"
restart: on-failure
logging: *default-logging
4.2.3 nginx.conf
用于配置
nacos2.0
中gRPC
所使用到的9848
端口,原nacos1.0
的使用文档中并无此处配置,需特别注意。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
# 提供给nacos集群的gRPC使用端口
stream {
upstream nacos-cluster-grpc {
server 192.168.0.31:9848;
server 192.168.0.31:9848;
server 192.168.0.31:9848;
}
server {
listen 9848;
proxy_pass nacos-cluster-grpc;
}
}
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;
}
4.2.4 default.conf
用于配置
nacos
的http
服务接口,实现反向代理和负载均衡。
upstream nacos-cluster {
server 192.168.0.31:8848;
server 192.168.0.41:8848;
server 192.168.0.42:8848;
}
server {
listen 8848;
listen [::]:8848;
server_name localhost;
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-icon;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
#access_log /var/log/nginx/host.access.log main;
charset utf-8;
resolver 192.168.3.25 valid=10s;
location / {
proxy_pass http://nacos-cluster;
}
#location /status {
# vhost_traffic_status_display;
# vhost_traffic_status_display_format html;
#}
#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;
#}
}
4.3 效果
五、下章预告
下章进行nacos
融合springcloud
,实现服务的注册与发现。