Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1、动态配置服务:支持以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。
2、服务发现及管理:支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现,同时提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,可以更容易地为服务实现断路器。 3、动态DNS服务:通过支持权重路由,轻松实现中间层负载均衡、更灵活的路由策略、流量控制及简单数据中心内网的简单DNS解析服务。更加容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险。
Nacos的环境安装非常简单,首先从 GitHub 上 checkout 源码,编译获取安装包,命令如下:
mvn -Prelease-nacos clean install -U
在Windows系统下,可以取target下的nacos-server-0.8.0.zip包(当然也可以从Github上直接下载安装包),将其解压到任意目录下。
注意:所解压目录的文件路径不能包含空格,例如:D:/Program Files/Nacos,否则在启动Nacos Server时,会提示错误:找不到或无法加载主类 Files/Nacos/bin/Files/Nacos/plugins/cmdb
解压后,进入bin目录,双击startup.cmd,此时,Nacos Server就开始启动了。
在启动界面中,可以看到Nacos的版本、运行模式、端口号、进程号、Console等信息,其中Console:http://xxx:xx/nacos/index.html的地址就是Nacos的控制台,可以直接在浏览器访问:
Nacos控制台的默认账号密码为:nacos/nacos
登录后可以看到如下界面,在控制台可以进行配置和服务的管理。
为了帮大家快速理解其概念,这里用一个通俗的案例:
小明和小新住在同一家沃尔玛超市附近,他俩都办了会员,经常关注超市的一些优惠活动,元宵节快到了,沃尔玛准备搞一个元宵节特惠活动,需要通知到附近的住户。对于沃尔玛来说,可以安排工作人员电话通知到小明和小新;而对于小明和小新来说,可以去超市咨询相关信息。
那么问题来了,住在超市附近的,不只有小明和小新两个消费者,如果每个人都打电话去通知就显得太麻烦了,小明和小新提前在超市了解了相关信息,可是不巧的是,由于各种原因,沃尔玛元宵特惠活动要从上午改到下午才开始,他们又该从何得知呢?
其实,沃尔玛关心的是通知能不能传达到附近的住户,小明和小新关心的是沃尔玛优惠活动的详情动态。沃尔玛不必给每个住户挨个电话通知,它只需要在它的微信公众号上推送一条消息即可,小明和小新也不用去超市咨询,只要随时关注沃尔玛公众号的推送消息即可。
在上面这个例子中,沃尔玛就是服务提供者,小明和小新是服务消费者,微信公众号类似于注册中心,沃尔玛将“服务”发布到注册中心,小明和小新作为消费者,订阅注册中心上沃尔玛提供的“服务”,通过微信公众号,沃尔玛(服务方)和小明、小新(消费方)就“解耦”了。
在现有的技术方案中,注册中心主要分为两类,一类是CP类注册中心,另一类是AP类注册中心,Nacos属于后者,为什么会有 CP 和 AP 两种不同类型的注册中心呢?这就不得不提到分布式的一个理论:CAP理论。它是由加州大学的计算机科学家 Eric Brewer 提出,在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性)无法同时满足,正所谓“鱼和熊掌与虾不可兼得也”。
CP类注册中心更强调一致性,而AP类注册中心更强调可用性,它们之间的区别,推荐阅读阿里中间件博客的文章:《阿里巴巴为什么不用 ZooKeeper 做服务发现?》。如果你看完文章后,得到的结论是以后再也不把 Dubbo 和 Zookeeper 结合起来使用了,那么你便错了。因为,对于绝大多数公司的绝大多数系统,无论是 Dubbo + Zookeeper,还是 Dubbo + Nacos,都能够满足需求,有的公司甚至都不需要使用Dubbo,所以,一定要结合实际的业务场景来分析判断。
引入SpringcloudAlibaba依赖
<!-- 注册中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config-jasypt</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
创建一个bootstrap.yaml文件
在配置文件中填写nacos信息
spring:
application:
name: xx-xxx-service # 应用名称
profiles:
active: local
cloud:
nacos:
server-addr: 127.0.0.1:8008 #这里填写注册服务地址
config:
# prefix
file-extension: yaml
prefix: common
# ext配置 refresh: true支持动态刷新,各专业分别增加需要的xxx.
ext-config:
- data-id: xx.yaml # 配置名称
refresh: false # 是否实时刷新
- data-id: xx.yaml
refresh: false
- data-id: xx.yaml
refresh: true
- data-id: xx.yaml
refresh: true
- data-id: xx.yaml
refresh: true
- data-id: xx.yaml
refresh: true
- data-id: xx.yaml
refresh: true
enabled: true # 是否使用
在配置文件
在bootstrap.yaml中读取所配置的值
在自己的项目文件中如下注解
我们在开发当中,经常会有开发,生产,测试不同的环境,那么我们命名空间新建命名空间,分别取prod,dev,test就可以了。
再在bootstrap.yaml文件中设置
spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
其中的Id为配置空间
其中的每一个配置可以用在不同的空间,相当于空间是一个数据集,只是用在不同的服务中,也可以分组区别。
这样可以做到每个微服务,每个环境下的配置文件,还可以把不同配置类型的文件分开,比如数据库配置,mybatis配置,其他配置