微服务组件 - 配置中心 一、什么是配置中心(Config) 1、配置中心简述 对于传统的单体应用而言, 我们使用的配置文件可以管理整个系统。比如,SpringBoot中的application.yml文件可以管理整个SpringBoot项目。
但是在微服务架构中,我们将整个应用分成多个微小的服务,每一个服务可以看成一个单体应用,就可以通过配置文件来管理。这样如果系统拥有几十个服务,那么配置文件太多了,甚至为了使系统变的高可用,会大规模集群部署服务应用,如果要手动修改是非常麻烦,而且还不易维护。
2、配置中心的好处
集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。
不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。
运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等
配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置
3、简述配置中心开发 配置中心分成服务端和客户端两个部分。
二、配置中心开发 1、Config 服务端开发 1.1、引入依赖 1 2 3 4 5 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-config-server</artifactId > </dependency >
1.2、创建仓库 在Gitee上创建一个仓库–configserver。
新建文件
1.3、拉取远端配置 1 http:// localhost:7878 /master/u sers-xxx.properties
规则:label/name-profiles.properties
1 2 3 1. label: 仓库的分支,如果不写,则是默认是master分支。2. name: 代表读取那个具体的配置文件的文件名称3. profiles: 读取配置文件环境,比如dev
1.4、通过配置文件指定分支和本地仓库 1 2 3 4 spring.cloud.config.server.git.basedir =/localresp #一定要是一个空目录,在首次会将该目录清空 spring.cloud.config.server.git.default-label =master #指定使用远程仓库中那个分支中内容
2、Config 客户端开发 2.1、引入依赖 1 2 3 4 5 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-config</artifactId > </dependency >
2.2、编写配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 spring.application.name =configclient spring.cloud.config.discovery.enabled =true spring.cloud.config.discovery.service-id =configserver spring.cloud.config.label =master spring.cloud.config.name =users spring.cloud.config.profile =dev
在远端仓库中:
1 2 3 4 5 6 7 8 9 10 spring.application.name =configclient spring.cloud.consul.host =localhost spring.cloud.consul.port =8500 server.port =9099 server.port =9098
2.3、启动出现问题
需要指定服务名称
1 Consul service ids must not be empty, must start with a letter, end with a letter or digit, and have as interior characters only letters, digits, and hyphen: 8988
解决方法:我们需要在配置文件中指定服务名称
1 spring.application.name =configclient
修改配置文件名称
项目中目前使用的是application.properties
启动项目,使用这个配置文件在SpringBoot项目启动过程中不会等待远程配置拉取,直接根据配置文件中内容启动,因此当需要注册中心,服务端口等信息时,远程配置还没有拉取到,所以直接报错。
解决方法:修改配置文件名称
使用统一配置中心时应该将微服务的配置文件名修改为bootstrap.(properties|yml)
2.4、测试 1 2 3 4 5 6 7 8 9 10 11 12 13 14 @RestController public class TestController { @Value("${server.port}") private int port; @Value("${spring.cloud.config.profile}") private String prod; @RequestMapping("/user/port") public String Test () { return "此时的环境是" + prod + ",端口号为" + port; } }
1 2 spring.cloud.config.profile =prod
证明此时拉取的是users-prod.properties
。
三、手动刷新配置信息 在生产环境中,微服务可能非常多,每次修改完远端配置之后,不可能对所有服务进行重新启动。
这个时候需要让修改配置的服务能够刷新远端修改之后的配置,从而不要每次重启服务才能生效,进一步提高微服务系统的维护效率。
在springcloud中也为我们提供了手动刷新配置和自动刷新配置两种策略,这里我们先试用手动配置文件刷新。自动配置需要和BUS一起使用。
1、添加配置 1 management.endpoints.web.exposure.include =*
2、添加注解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @RestController @RefreshScope public class TestController { @Value("${server.port}") private int port; @Value("${name}") private String name; @RequestMapping("/user/port") public String Test () { return "name" + name + ",port" + port; } }
3、测试 1 2 3 server.port =9098 name =jzw
修改配置文件
1 2 3 server.port =9098 name =jzw1
发送post请求:curl -X POST http://localhost:9098/actuator/refresh
1 2 C:\Users\JiangZW>curl -X POST http://localhost:9098/actuator/refresh ["config.client.version","server.port"]
弊端:
需要手动发送POST请求才能刷新,并且一次只更新一个配置。
四、自动刷新 使用Spring Cloud Bus
实现配置的自动刷新。
Bus称之为Spring Cloud Bus
中消息总线,主要用来在微服务系统中实现远端配置更新时通过广播形式通知所有客户端刷新配置信息,避免手动重启服务的工作
Spring Cloud Bus
使用轻量级消息代理将分布式系统的节点连接起来。然后,可以使用它来广播状态更改(例如配置更改)或其他管理指令。AMQP
和Kafka broker
实现包含在项目中。或者,在类路径上找到的任何SpringCloudStream
绑定器都可以作为传输使用。
1、引入依赖 1 2 3 4 5 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-bus-amqp</artifactId > </dependency >
2、安装RabbitMQ 3、 服务端配置 – 配置统一配置中心连接到MQ 1 2 3 4 spring.rabbitmq.port =5672 spring.rabbitmq.host =192.168.111.128 spring.rabbitmq.username =guest spring.rabbitmq.password =guest #连接mq密码
4、客户端配置 添加配置
1 2 spring.cloud.config.fail-fast =true
5、刷新 配置统一刷新:
1 curl -X POST http://localhost:7878/actuator/bus-refresh
我们还可以指定服务进行刷新配置:
指定一个服务集群刷新:
1 curl -X POST http://localhost:7878/actuator/bus-refresh/configclient
指定一个具体服务节点刷新:
1 curl -X POST http://localhost:7878/actuator/bus-refresh/configclient:9090
此时,我们可以实现统一刷新,但依然需要发送POST请求才能刷新配置。