前言
回想之前的项目,尤其是项目分多模块的时候,一般就会有一个公共包大多是相关工具类,因为比较独立使得其他模块调用方便,现在出来个需求为工具类参数进行动态控制,比如Redis
工具类动态设定过期时间,除了这类在项目运行过程中需要动态修改,还有一类是在项目启动时候需要动态加载,一个常见的例子就是在项目启动时候读取数据源信息…还要很多尤其是分布式的大环境下,使用微服务的公共配置中心组件来进行配置和管理。
配置选型
微服务中配置中心有很多,但是 Spring Cloud Config
业界标配是以下三个组件:
Spring Cloud Config | Spring Cloud Consul | Cloud Alibaba Nacos | |
---|---|---|---|
组织/活跃度 | Spring社区/活跃 | Consul/活跃 | Alibaba/活跃 |
是否 | 开源 | 开源 | 开源 |
实现方式 | git | 开源 | 开源 |
性能 | 开源 | 开源 | 开源 |
刷新频率 | 开源 | 开源 | 开源 |
易用程度 | 开源 | 开源 | 开源 |
支持图形界面 | 开源 | 开源 | 开源 |
维护成本 | 开源 | 开源 | 开源 |
容灾机制 | 开源 | 开源 | 开源 |
(欢迎补充) | 开源 | 开源 | 开源 |
前面两种其实Spring
社区推的一套,由于
Spring Cloud Config
是Spring
开源社区的默认集成方式,由于下面的组件闭源的闭源像Eureka
,不活跃的不活跃,渐渐别Alibaba
的服务组件所取代,成为新的主流微服务框架Spring-Cloud-Alibaba
,不仅仅活跃度高并且阿里还提供了很多丰富的云产品像ACM
可以与云原生应用无缝集成,非常方便。
因为所有微服务系列基于Spring-Cloud-Alibaba
,所以这里选用Nacos
。
下载安装
Nacos
和其他服务比如Redis
一样,需要安装Nacos Server
提供服务,然后再使用客户端进行连接.
第一步:
去Github的进行Nacos Server 下载 ,这里下载发布版1.2.1
同样可以去Github下载Nacos源码,通过Maven进行编译打包成jar,然后运行即可,Nacos其实就是Springboot项目基于Tomcat包装起来的。
第二步:
启动Nacos服务,查看bin
目录可以知道不通系统平台均有启动停止脚本,然后进行启动即可。
$ ls -lt bin/
-rwxr-xr-x 1 terry 1049089 4730 May 16 14:12 startup.sh
-rw-r--r-- 1 terry 1049089 954 May 15 18:35 shutdown.cmd
-rwxr-xr-x 1 terry 1049089 949 May 15 18:35 shutdown.sh
-rw-r--r-- 1 terry 1049089 2836 May 15 18:35 startup.cmd
$ bin/startup.sh
,--.
,--.'|
,--,: : | Nacos 1.2.1
,`--.'`| ' : ,---. Running in stand alone mode, All function modules
| : : | | ' ,'\ .--.--. Port: 8848
: | \ | : ,--.--. ,---. / / | / / ' Pid: 25516
| : ' '; | / \ / \. ; ,. :| : /`./ Console: http://192.168.3.35:8848/nacos/index.html
' ' ;. ;.--. .-. | / / '' | |: :| : ;_
| | | \ | \__\/: . .. ' / ' | .; : \ \ `. https://nacos.io
' : | ; .' ," .--.; |' ; :__| : | `----. \
| | '`--' / / ,. |' | '.'|\ \ / / /`--' /
' : | ; : .' \ : : `----' '--'. /
; |.' | , .-./\ \ / `--'---'
'---' `--`---' `----'
...
2020-06-05 17:08:07,895 INFO Nacos started successfully in stand alone mode.
2020-06-05 17:08:08,319 INFO Initializing Servlet 'dispatcherServlet'
2020-06-05 17:08:08,349 INFO Completed initialization in 28 ms
此时Nacos
已经启动成功默认单例模式,默认端口:8848
基本使用
添加依赖
在Maven
项目的pom
文件中添加Nacos
客户端依赖包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置Nacos
-
在微服务配置文件
bootstrap.properties
中添加Nacos Server
服务地址spring.application.name=nacos-config-example spring.cloud.nacos.config.server-addr=127.0.0.1:8848
-
动态监听
由于监需要启动一个线程,所以在Spring
中实现接口ApplicationRunner
的run
方法,监听配置Nacos Serve
中的文件nacos-config-example.properties
@Autowired private NacosConfigManager nacosConfigManager; @Override public void run(ApplicationArguments args) throws Exception { System.out.println( String.format("Initial username=%s, userAge=%d", userName, userAge)); nacosConfigManager.getConfigService().addListener( "nacos-config-example.properties", "DEFAULT_GROUP", new Listener() { @Override public void receiveConfigInfo(String configInfo) { Properties properties = new Properties(); try { properties.load(new StringReader(configInfo)); } catch (IOException e) { e.printStackTrace(); } System.out.println("config changed: " + properties); } @Override public Executor getExecutor() { return null; } }); }
-
动态刷新
添加基本变量如下:
@RestController @RefreshScope class SampleController { @Autowired UserConfig userConfig; @Autowired private NacosConfigManager nacosConfigManager; @Value("${name}") String userName; @Value("${age:25}") Integer age; @RequestMapping("/user") public String simple() { return "Hello Nacos Config!" + "Hello " + userName + " " + age + " [UserConfig]: " + userConfig + "!" + nacosConfigManager.getConfigService(); } }
name
,age
是需要动态改变的变量,注意在类SampleController
上有个注解@RefreshScope
,动态刷新配置。
测试
打开终端:
$ curl http://localhost:18084/user
Hello Nacos Config!Hello null 18
# 修改name,age
$ curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-config-example.properties&group=DEFAULT_GROUP&content=user.id=1%0Auser.name=terry%0Auser.age=20"
true
$ curl http://localhost:18084/user
Hello Nacos Config!Hello terry 20
通过Nacos
的API调用,即可实现动态配置,除此以外它也提供了界面来进行管理,这里就不多说了。
后记
所以微服务,动态配置和统一管理配置是一个必须要解决的问题,因为随着项目的横向纵向扩展,项目数也会越来越多,随之而来得就是各个服务的配置统一配置和管理,就像一个工厂生产工件的型号,都有一个统一管理的地方,这样才能更灵活,更轻松地构建,交付和管理分布式环境下微服务平台。
Nacos
不一定非的是微服务项目才能用的,普通的项目比如:SSH
,SSM
,甚至Servlet
都是可以用来做动态配置中心的,完全可以独立出来。
在微服务中除了做配置中心,还能做注册中心等等,其实自该组件从阿里巴巴诞生而来,一直受到社区的强烈关注,在一定程度上成为了微服务的标准。