一、什么是配置中心
在微服务架构中,当系统从一个单体应用被拆分成分布式系统上的一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了。不仅配置会分散,分散中还会包含着冗余。
配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
二、Nacos简介
官网地址:https://nacos.io/zh-cn/docs/what-is-nacos.html
2. Nacos的特性
服务发现和服务健康监测
Nacos使服务器更容易注册,并通过DNS或HTTP接口发现其它服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。
动态配置服务
动态配置服务允许在所有环境中以集中和动态的方式管理所有的服务配置,Nacos消除了在更新配置时重新部署应用程序,使得配置更加高效和灵活。
动态 DNS 服务
Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端口,让三方应用方便的查阅和发现。
服务及其元数据管理
Nacos可以从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
三、安装Nacos
安装环境:
Windows10 64位
JDK1.8
Maven3.2以上
在这里我下载的是1.4.1版本的Nacos,解压后访问文件下的bin目录中的startup.cmd即可运行
四、运行Nacos
注意:在Nacos在1.3.2之后默认使用的cluster(集群方式启动),如果我们本地是单击模式的话,需要手动改回standalone(单机模式启动)
修改方法:
将startup.cmd使用编辑工具打开,修改cluster为standalone即可
2. 配置数据源
可以看到Nacos默认端口为8848,此时提示的网页是无法登录的,因为没有进行配置数据源,因此接下来要在conf文件加下的application.properties文件中进行数据源的配置。去掉前两行的注释,将参数设置为自己的数据库连接信息后再次点击startup.cmd启动Nacos,即可进入到登录页面。
初始用户名:nacos
初始密码:nacos
输入初始用户名和初始密码后登录即到主界面
总结
以上便是安装Nacos的过程,在安装运行时应该注意到的地方为在1.3.2之后的版本后启动方式默认为集群方式启动,因此要在本地上单点登录的话,需要编辑startup.cmd文件修改启动方式为单机模式。
五、集群部署
接下来配置集群,继续当前目录将cluster.conf.example改名为cluster.conf并打开,如果是部署在不同机器就要填写相应的IP地址加端口。
进入bin目录,右键编辑startup_cmd以记事本方式打开,这是nacos的启动文件。
接下来将nacos目录复制3份,必须停止nacos再复制,否则会报错。
分别进入conf下的application.properties配置文件,更改端口号,与配置cluster.conf 时相对应。
六、启动集群:
1.分别执行这三个nacos的/bin/startup.cmd文件
2.进入任意一个nacos可视化界面,http://nacos地址/nacos
修改springboot配置文件:写单个或者多个地址效果都一样
七、Nacos的服务分级存储模型
1、概念
一个服务可以有多个实例,例如我们的user-service,可以有:
127.0.0.1:8081
127.0.0.1:8082
127.0.0.1:8083
假如这些实例分布于全国各地的不同机房,例如:
127.0.0.1:8081,在上海机房
127.0.0.1:8082,在上海机房
127.0.0.1:8083,在杭州机房
Nacos就将同一机房内的实例 划分为一个集群。
也就是说,user-service是服务,一个服务可以包含多个集群,如杭州、上海,每个集群下可以有多个实例,形成分级模型,如图:
微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:
杭州机房内的order-service应该优先访问同机房的user-service。
2、给user-service配置集群
1、配置文件:application.properties
#配置当前服务的集群名称,名称自定义的 HZ代指杭州
spring.cloud.nacos.discovery.cluster-name=HZ
2、启动三个用户实列,看看效果
可以看见这里有两个集群,总共三个实列,点击详情可以看见:
存在两个集群,分别是HZ和SH。
选中实列,点击复制,就可以出现新的实列了,也可以在红框哪里给新的实列配置各种参数。
3、服务之间集群调用的使用
1、给订单服务添加集群配置和负载均衡配置:application.properties
#配置当前服务的集群名称,名称自定义的 HZ代指杭州
spring.cloud.nacos.discovery.cluster-name=HZ
#负载均衡策略为:优先访问本集群的服务,如果本集群有多个实列,那么对本集群实列的访问就是随机
#如果本集群没有实列,那么访问其他集群的实列时,采用的是随机策略。
userservice.ribbon.NFLoadBalancerRuleClassName=com.alibaba.cloud.nacos.ribbon.NacosRule
注意:需要把用户服务的权重设置为1。
注意:如果访问的不是本地集群,那么会出现下列的警告:跨集群访问警告
总结:com.alibaba.cloud.nacos.ribbon.NacosRule 负载均衡策略
优先选择同集群服务实例列表
本地集群找不到提供者,才去其它集群寻找,并且会报警告
确定了可用实例列表后,再采用随机负载均衡挑选实例
八、Nacos的权重配置
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承但更多的用户请求。Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。
总结:实例的权重控制
Nacos控制台可以设置实例的权重值,0~1之间
同集群内的多个实例,权重越高被访问的频率越高
权重设置为0则完全不会被访问
九、Nacos的环境隔离
Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离。
一般开发中,都会存在三个环境,dev-开发环境,uat-测试环境,master-生产环境,这里的环境隔离就是可以根据这个来划分,用来防止 开发环境的服务 访问到了 测试环境的服务。
1、Nacos控制台可以创建namespace,用来隔离不同环境
4、修改订单服务的配置文件:application.properties
spring.cloud.nacos.discovery.namespace=492a7d5d-237b-46a1-a99a-fa8e98e4b0f9
5、效果
6、此时通过订单服务访问用户服务会报错,因为它们不在同一个环境中。
总结:Nacos环境隔离
每个 namespace 都有唯一id
服务设置 namespace 时要写id而不是名称
不同 namespace下的服务互相不可见,即相互之间不能访问