Nacos 支持如下核心特性:
1)服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。
2)动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
3)服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
4)动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。
5)服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据
常见的注册-配置中心
活跃情况 | 配置 | 注册 | |
---|---|---|---|
Eureka | 原生,2.0遇到瓶颈,停止维护 | X | O |
Spring Cloud Confifig | 只支持git基础上的配置 | O | X |
Zookeeper | 专业的独立产品。例如:dubbo | O | O |
Consul | 原生,GO语言开发 | X | O |
Nacos | 国内比较活跃,已经取代Eureka和Confifig | O | O |
Apollo | 在Nacos之前动态配置最活跃和完善的组件 | O | O |
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,
Spring Cloud Confifig依赖Git场景不适合开 放的大规模自动化运维API,而Spring Cloud Confifig不带运维管理界面,需要自行开发
功能方面Apollo最为完善,nacos具有Apollo大部分配置管理功能。Nacos的一大优势是整合了注册中心、配置中心功能,部署和操作相比 Apollo都要直观简单,因此它简化了架构复杂度,并减轻运维及部署工作
在K8S中服务注册功能已经不再依赖于Nacos等注册服务,以上组件只剩下配置中心的作用,服务发现和心跳检测已经完全由K8S承担。
从nacos官网 https://nacos.io/zh-cn/index.html 下载安装包
1.创建数据库nacos,并设置字符集utf8
2.执行/nacos/conf/nacos-mysql.sql中的语句,创建表,并插入数据
3.修改/nacos/conf/application.properties文件,如下
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
centos
cd /nacos/bin
sh startup.sh -m standalone
windows
cd /nacos/bin
startup -m standalone
如果直接双击,非如上命令模式启动,会报如下异常
nacos Caused by: java.net.UnknownHostException: jmenv.tbsite.net
cp conf/cluster.conf.example conf/cluster.conf
需要配置3个或3个以上节点,生产环境建议分布在多台服务器上,目前咱们仅在一台机器上测试。
vi conf/cluster.conf
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
因此启动脚本和关闭脚本需要做一点修改
cp bin/startup.sh bin/startup-port.sh
vi bin/startup-port.sh
## 修改sh脚本
export MODE="cluster"
export FUNCTION_MODE="all"
export SERVER_PORT="8848"
while getopts ":m:f:p:" opt
do
case $opt in
m)
MODE=$OPTARG;;
f)
FUNCTION_MODE=$OPTARG;;
p)
SERVER_PORT=$OPTARG;;
?)
echo "Unknown parameter"
exit 1;;
esac
done
JAVA_OPT="${JAVA_OPT} -Dserver.port=${SERVER_PORT}"
修改关闭服务脚本
cp bin/shutdown.sh bin/shutdown-port.sh
vi bin/shutdown-port.sh
PORT=$1
if [ ! $PORT ]; then
echo "please select stop port!" >&2
exit 1
fi
pid=`ps ax | grep -i 'nacos.nacos' |grep java |grep ${PORT} | grep -v grep | awk '{print $1}'`
默认方式启动是集群模式
sh bin/startup-port.sh ##默认集群模式
sh bin/startup.sh -m standalone #单机模式
单机多节点下-启动方式如下:
sh bin/startup-port.sh -p 8848
单机多节点下-关闭方式如下:
sh bin/shutdown-port.sh 8848
启动后就可以在浏览器打开 http://127.0.0.1:8848/nacos/
即可看到控制台,默认用户名/密码为nacos/nacos。
附1: 可通过Nginx配置只访问一个地址负载均衡到三个节点上:
upstream nacos-cluster{
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
附:集群模式下控制台的用户名密码都存在了数据库的users表,用户名直接修改就行,密码需要用org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder加密
Nacos 引入命名空间 Namespace 的概念来进行多环境配置和服务的管理及隔离。例如,你可能存在本地开发环境dev、测试环境test、生产环境prod 三个不同的环境,那么可以创建三个不同的 Namespace 区分不同的环境
# 对应创建的命名空间的ID,此处对应的是dev命名空间
spring.cloud.nacos.config.namespace=483bb765-a42d-4112-90bc-50b8dff768b3
Group 也可以实现环境隔离的功能,但 Group 设计的目的主要是做同一个环境中的不同服务分组,把不同的微服务的配置文件划分到同一个分组里面去,Nacos 如果不指定 Group,则默认的分组是 DEFAULT_GROUP。
如果没有 Group,试想一下这个场景:
在DEV环境中有两个微服务,一个是订单系统,一个是用户系统,但是他们有着相同Msql依赖但是使用不同的数据库地址的配置,比如 datasource-url,那么如何区分呢?
这时候 Group 就派上用场了。上述场景中订单系统、用户系统可以单独分为一个组,比如 ORDER_GROUP、USER_GROUP,当然这是比较细粒度的分组,根据企业的业务也可以多个微服务分为一组。
没个不同服务配置不同的分组
spring.cloud.nacos.config.group=ORDER_GROUP
新建一个 DataID 为 cloud-producer-server-dev.yaml 的数据集
那么 Data ID 怎么取值呢?格式通俗一点就是 “前缀-环境-扩展名”,如下所示:
${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
在项目中一般也由这些配置来动态确定唯一的配置文件
prefix:前缀,默认是 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
# 若不指定,默认采用应用名的方案
spring.application.name=cloud-producer-server
# 手动指定配置的dataID前缀标识
# spring.cloud.nacos.config.prefix=cloud-producer-server-config
active:配置运行环境,即为当前环境对应的 profile。
注意:当 spring.profiles.active 为空时,对应的连接符 ”-“ 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
# dev表示开发环境
spring.profiles.active=dev
file-exetension:配置文件的类型,默认是 properties,也可以通过配置项 spring.cloud.nacos.config.file-extension 来配置,目前支持的类型有 TEXT、JSON、XML、YAML、HTML、Properties
# 指定配置文件类型为yaml文件
spring.cloud.nacos.config.file-extension=yaml
spring:
profiles:
active: test
application:
name: @project.name@
cloud:
nacos:
#nacos服务地址
addr: @nacos.url@
discovery:
server-addr: ${spring.cloud.nacos.addr} #和nacos的地址一样
namespace: ${nacos.group.id}
group: DEFAULT_GROUP
service: ${project.name}${_use-local:}
config:
prefix: ${project.name}
namespace: ${nacos.group.id}
group: DEFAULT_GROUP
server-addr: ${spring.cloud.nacos.addr}
file-extension: yaml
enabled: true
#配置多个配置文件可以使用[0],[1]
shared-configs[0]:
data-id: redis.yml #共用配置
# 默认为DEFAULT_GROUP
group: PUBLIC
## 是否动态刷新,默认为false
refresh: true
shared-configs[1]:
data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 默认为DEFAULT_GROUP
group: DEFAULT_GROUP
## 是否动态刷新,默认为false
refresh: true