首先我们来看看微服务架构下配置文件的一些问题:
配置文件的相对哈希。在微服务架构下,配置文件会随着微服务的增加越来越多,会分散在各个微服务中,统一配置和管理。配置文件无法区分环境。微服务项目可能有多个环境,如测试环境、预发布环境和生产环境。每个环境使用不同的配置。一旦需要修改,我们需要手动维护每个微服务,难度很大。配置文件不能实时更新。我们修改配置文件后,必须重启微服务才能使配置生效,这对于正在运行的项目来说是非常陌生的。基于这些问题,除了解决这些问题,我们还需要配置中心。配置的思想是:
首先,在一个集中的位置管理项目中的所有配置,并提供一组标准接口。当需要配置每项服务时,配置*接口以获取配置。在配置中心更新各种参数时,也会通知各服务同步的最新信息,以便动态更新。添加服务配置中心后,我们的系统架构图如下所示:
业内有几种类型的服务配置中心:
Apollo阿波罗是携程开源的分布式配置中心。功能很多,比如:配置更新后可以实时生效,支持灰度发布功能,可以使用所有配置进行管理、操作和审计等。并提供开放平台API。信息也写得很详细。Disconf Disconf是Pali的一个开源分发中心。它基于ZooKeeper实现了实时通知,并在配置改变后生效。这是Spring cloud中的配置中心组件。它与Spring无缝集成,使用起来非常方便,其配置存储支持Git。但是它没有可视化的操作界面,配置的有效性不是实时的,需要重启或者刷新。这是SpingCloud阿里巴巴技术栈中的一个组件。我们用它在前面有一个服务注册中心。其实它还集成了服务配置的功能,我们可以直接把它作为服务配置中心。
使用Nacos作为配置中心。实际上,它以NacoS为服务器,以每个微控制器为客户端。我们会在Nacos上统一每个微服务的配置文件,然后每个微服务会从Nacos上拉配置。
1介绍产品的微服务
com . Alibaba . cloud . groupid spring-cloud-start-Alibaba-Nacos-Config神器id依赖复制代码在微服务中添加Nacos Config配置。
您不能使用原始应用程序。YML作为配置文件,但是创建一个新的BootStrap.yml作为配置文件。
配置文件优先级(从高到低):bootstrap . properties-bootstrap . yml-application . properties-application . yml
我注意到原始的YML配置文件保留了下来,只留下了惟一的配置,比如端口和服务名。
spring:application:name:product Service cloud:Nacass:configuration:server-addr:127 . 0 . 0 . 1:8848 # Nacos中心地址文件扩展名:yaml# # Profile格式介绍:activity: dev# #环境ID复制代码在Nacos中添加配置,然后将order Micro Service application . yml配置复制到配置内容中。
它是本地应用程序中的内容,启动程序经过测试。
我们已经实现了远程存储,但是如果修改配置,我们的程序就无法读取,所以需要开启配置的动态刷新功能。
Nacos中Order-service-dev.yaml配置键中的此配置(它必须位于远程配置文件中,而不是本地)
配置:AppName:Order# #不代表只要测试动态刷新,当你更改参数时,请参考是否可以动态刷新复制代码,在订单微服务中添加NacosconFigControlller。
@ restcontroller。@ refresh scope//动态刷新公共类nacosconfigcontroller { @ value(" $ { appconfig . name })私有字符串AppConfigname的说明;@ requestmapping ("/nacosconfig1 ")公共字符串nacosconfig(){ returns " remote information:app configname;}}复杂
制代码当配置越来越多时,我们发现有许多配置要重复。此时,我们需要考虑提取公共1个配置文件,然后实现需要直接导入的配置文件共享。
如果要在同一微服务的不同环境之间配置共享,则只需提取由Spring.Application.name(Spring.Service Name)命名的配置文件,然后将公共配置放入其所有环境中。
创建新订单服务.YAML配置文件
此配置文件用于存储公共配置文件。
服务器: 港口:8080 Tomcat: 线程: 最多:10#Tomcat的最大并发值修改为10,春天: 紫皮金: Base-URL:http://127.0.0.1:9411/ #zzipkin服务器请求地址 DiscoveryClientEnabled:False#让Nacos作为URL,不是服务名称 雪松: 取样器: 概率:1.0#百分比 应用: 名称:订单服务 数据源: 驱动程序类 - 名称:com.mysql.jdbc.driver URL:JDBC:MySQL:///商店 - 产品? ServerTimeZone = UTC&UnderUnicode = True&CharmentEncoding = UTF-8和USESSL = TRUE 用户名:root. 密码:1101121833 云: 纳卡斯: 发现: Server-addr:localhost:8848 哨兵: 运输: 端口:9999#与控制台的端口,您将自由指定未使用的端口。 仪表板:localhost:8080#指定控制台服务的地址 网络上下文统一:FALSE JPA: 特性: 休眠: HBM2DDL: 自动更新 DIALECT:org.hibernate.dialect.mysql5innodbdalect.产品 - 服务:#提供的提供商的名称 丝带: nfloadbalancerreClassName:com.netflix.loadbalancer.randomrule.假装: 客户: 配置: 默认: ConnectTimeout:3000. 读取时间:3000.复制代码
为订单服务-Test.yaml创建配置文件
此配置文件用于存储测试环境的配置。
AppConfig: 名称:订单服务env:dev.服务器: 应用: 名称:订单服务春天: 应用: 名称:订单服务#名称 云: 纳卡斯: 配置: server-addr:127.0.0.1:8848 #Nacos中心地址 文件扩展名:yaml#配置文件格式复制代码
控制器中的新测试方法
@RestController.@refreshscope.公共类NacosconFigController { @Value(“$ {appconfig.name}) 私有字符串AppConfigname; @Value(“$ {env}”) 私有字符串env; @requestmapping(“/ nacosconfig1”) public string nacosconfig(){ 返回“远程信息:+ AppConfigname; } @requestmapping(“/ nacosconfig2”) public string nacosconfig2(){ 返回“公共配置:”+ appconfigname +“,环境配置信息:”+ env; }}复制代码
在服务之间实现配置的原则类似于文件简介,即定义公共配置,然后在当前配置中引入。
在Nacos中定义Global-config.yaml配置文件
此配置文件用于存储所有微型服务共享配置。为方便起见,写一个属性。
GlobalConfig:Global.复制代码
修改bootstrap.yaml.
春天: 应用: 名称:订单服务#名称 云: 纳卡斯: 配置: server-addr:127.0.0.1:8848 #Nacos中心地址 文件扩展名:yaml#配置文件格式 共享 - 配置: - data-id:global-config.yaml#配置要介绍的配置 刷新:真实 简介: 活动:测试#环境ID复制代码
修改1Controller的侧面方法
@RestController.@refreshscope.公共类NacosconFigController { @Value(“$ {appconfig.name}) 私有字符串AppConfigname; @Value(“$ {env}”) 私有字符串env; @Value(“$ {globalconfig}) 私有字符串GlobalConfig; @requestmapping(“/ nacosconfig1”) public string nacosconfig(){ 返回“远程信息:+ AppConfigname; } @requestmapping(“/ nacosconfig2”) public string nacosconfig2(){ 返回“公共配置:”+ appconfigname +“,环境配置信息:”+ env; } @requestmapping(“/ nacosconfig3)) public string nacosconfig3(){ 返回“全局配置:”+ GlobalConfig +“,公共配置:”+ appconfigname +“,环境配置信息:”+ ENV; }}复制代码
测试