本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现,以及分布式配置管理。关于Nacos,右侧点击:Nacos官网传送门
系列上一篇文章:《【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)》
1)下载
当前环境:win11
版本:2.2.3,官方介绍说这是当前推荐的稳定版本
下载地址:Nacos2.2.3下载
2)解压运行
解压,然后进入nacos/bin
目录,以单机模式运行startup.cmd -m standalone
当看到下面这个界面的时候就表示启动成功了:
接着,访问Nacos自带的客户端验证一下:http://localhost:8848/nacos
Nacos在项目模块上,大概会分为两个,分别是:nacos-config
和nacos-discovery
,即:【分布式配置】和【服务注册与发现】。下面我们就分开两步来整合。
1)首先是现在pom中添加【服务注册与发现】的jar包依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
2)添加项目yml配置
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
3)最后就是在启动类上添加@EnableDiscoveryClient
启用【服务注册与发现】相关功能
4)启动服务。我则是添加到了shen-product
服务上,效果如下:
可以在nacso
的服务列表中,看到shen-product
注册到了nacos
上。我们也可以尝试启动其他服务去验证哦。比如,我这里再启动一个shen-product
和shen-order
服务。
点击shen-product
服务集群的的详情可以看到如下画面:
OK,非常强大。注意刀上面的权重了吗?你会想到啥?对嘛,负载均衡
呀xdm。
对了,想要在IDEA
里面启动多个服务实例其实也不难,就是右上角新增一个SpringBootApplication
实例就好,当然注意修改端口
5)调用shen-product
我们在上面启动了两个shen-product
实例,我们来试试效果。先来试试http://localhost:9001/product/list
,再来试试http://localhost:9002/product/list
说到动态配置这个东西,有个前置内容需要先跟大家说说。Nacos提供的这个动态配置,是用于存储配置和其他元数据的 key/value,为分布式系统中的外部化配置提供服务器端和客户端支持。比如:同一组服务集群里面共享一些配置application.yml
。
那你们,还记得SpringBoot项目得application.yml
加载顺序吗?包括其他所有配置。正常来说包括但不限于以下:
上面的内容不是重点,重点是,这里体现了一种配置思想:高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 (覆盖 + 并级)。
那么问题就来了,既然SpringBoot配置文件需要遵循以上原则,那么,我在Nacos中的配置文件如何获取?有同学会说:我们不是有Nacos的地址嘛,通过地址去下载获取咯。确实是的,但是Nacos的地址你配置在哪里?我们上面的示例是把它配置在application.yml
文件吧?但是application.yml
文件要互补,然而想要获取最全的配置文件一定要先去nacos下载!所以在引入nacos-config
配置中心的时候,就出现了逻辑矛盾。
为了解决这个问题,SpringCloud标准约定,引入一个全新的配置文件bootstrap.yml
。它跟application.yml
差不多,只不过优先级大于后者。bootstrap
直译:引导。
1)首先是现在pom中添加【配置中心】的jar包依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
另外我们不是在上面说要引入新的配置文件bootstrap.yml
嘛,似乎2.x版本之后需要额外引入另一个包才行,不然会报错找不到bootstrap
配置文件,如下:(下面这个包来自spring-cloud-dependencies
,所以需要自己添加这个项目的管理依赖哦)
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>
2)在bootstrap.yml
文件配置nacos配置中心地址(spring.cloud.nacos.config
)
server:
port: 9001
spring:
application:
name: shen-product
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
3)在nacos中新建两张配置表
说到配置文件,首先需要向大家解释。SpringCloud应用会首先向Nacos查找${prefix}-${spring.profiles.active}.${file-extension}
的配置文件。
比如我上面的配置中,会默认先查找shen-product.properties
文件。
但是通常我们在配置中心里面,还会自定义很多通用的配置文件,比如我这么配置:
application-conf.yaml
:用来配置所有微服务的数据库配置。毕竟我是在试验阶段,共用一个数据库很合理吧… 甚至redis,mq等等。这些配置往往不需要支持动态更新config-info.yaml
:用来存放一些需要动态更新的业务配置。例如我在里面存放了一个config.author
来存放作者名字如下图:
4)修改bootstrap.yml
文件,支持yaml
格式配置文件,支持拓展配置文件
server:
port: 9001
spring:
application:
name: shen-product
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
extension-configs:
- data-id: application-conf.yaml
- data-id: config-info.yaml
refresh: true
5)商品服务新增测试接口
注意上面@RefreshScope
注解,用来开启类的动态配置刷新
6)访问http://localhost:9001/product/getMyMan测试接口;修改配置继续测试
官方还有一些其他的东西,比如:
这里就不试了,感觉Nacos比较重要的应该就是以上两点。另外还有Nacos集群搭建等等,也不在这里实验咯。
前面我的很多接口示例都是在单个服务上发生的,在我们的实际使用场景中,肯定会存在跨服务之间的调用。目前正在学习Dubbo
和OpenFeign
,看看整合哪一种。
不过考虑到Alibaba的微服务体系,我应该会选择整合Dubbo。理由如下:
http
协议。http
在我的刻板印象里面就是性能很拉跨,当然,http
还有http1.1
跟http2
,Dubbo框架可以支持http2
,而前者默认不支持,不过也可以切换客户端的方式来支持其实我还有一点疑问,Dubbo看官网介绍,总感觉跟Nacos有很多功能是重叠的,咋回事呢
感谢本站大佬【作者:不凉帅】的文章《Nacos使用详解》)