配置
- 统一管理所有微服务的一个服务
- 众多的微服务配置文件需要配置很麻烦,使用Spring Cloud Config配置中心解决配置问题()
- 配置中心本身也是一个微服务,需要注册到配置中心
- 将配置文件放到码云(访问国内的服务器比github快)
实现过程
在码云新建仓库
- 将user-service的application.yml文件内容上传
- 配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties
- application为应用名称
- profile用于区分开发环境dev,测试环境test,生产环境pro等
- 开发环境 user-dev.yml
- 测试环境 user-test.yml
- 生产环境 user-pro.yml
-
创建配置中心SpringBoot项目config_server
-
勾选Starter坐标依赖:配置中心starter,Eureka客户端starter
-
启动类:创建配置中心工程config_server的启动类ConfigServerApplication
-
@SpringBootApplication @EnableDiscoveryClient//开启Eureka客户端发现功能 @EnableConfigServer //开启配置服务支持 public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class,args); } }
-
-
配置文件:创建配置中心工程config_server的配置文件application.yml
# 端口 server.port: 12000 # 应用名称 spring.application.name: config-server # git仓库地址 spring.cloud.config.server.git.uri: https://gitee.com/liuyaxiong01/ahu-spring-cloud-config.git # 注册中心地址 eureka.client.service-url.defaultZone: http://127.0.0.1:10086/eureka
- 注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址
-
启动测试:启动eureka注册中心和配置中心;
-
访问http://localhost:12000/user-dev.yml查看能否输出码云存储管理的user-dev.yml文件
-
并且可以在gitee上修改user-dev.yml,然后刷新上述测试地址也能及时更新数据
-
从配置中心获取配置
关于application.yml和bootstrap.yml文件的说明:
- bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
- bootstrap.yml和application.yml都是默认配置文件,但定位不同
- bootstrap.yml相当于项目启动的引导文件
- application.yml文件是微服务的常规配置参数,变化比较频繁
- 搭配spring-cloud-config使application.yml的配置可以动态替换。
目标:改造user_service工程,配置文件不再由微服务项目提供,而是从配置中心获取。
实现步骤:
- 在user_service服务中,添加Config的starter依赖
- 删除application.yml配置文件,新增bootstrap.yml配置文件
- 配置bootstrap.yml配置文件:
- 配置中心相关配置(配置文件前缀、后缀,仓库分支,是否开启配置中心)
- 注册中心地址
- 启动服务,测试效果
实现过程:
-
添加依赖
<!--spring cloud 配置中心--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
修改配置
-
删除user_service工程的application.yml文件
-
创建user_service工程bootstrap.yml配置文件,配置内容如下
-
# 注册中心地址
eureka.client.service-url.defaultZone: http://127.0.0.1:10086/eureka
# 配置中心相关配置
spring:
cloud:
config:
discovery:
enabled: true
# 配置服务中心的名称
service-id: config-server
# 与远程仓库中的配置文件的application和profile保持一致,{application}-{profile}.yml user-dev.yml
# 配置文件的名称
name: user
# 配置文件的环境{dev test pro}
profile: dev
# 所在的分支
label: master
启动项目可以看到从码云抓取配置文件
启动多个项目的的时候发现端口冲突,user-service只能启动一个
猜想是从码云抓取的配置文件在-Dserver.port之后,无法通过VM options改变端口,导致端口无法改变
解决方案:
将server.port: 9091放在bootstrap.yml中并将其从码云的user-dev.yml中删除
测试结果:
顺利启动了多个项目
配置中心存在的问题
- 只有在服务启动的时候获取配置文件,服务启动之后就配置文件更改是不能获取到改动的
实现步骤
-
更改码云的配置文件
-
获取配置文件,在user-service中获取配置
-
测试
-
改变码云中的配置文件
-
再次测试,获取的参数并没有变化
消息总线
如何解决上面的那个问题呢?
消息总线可以广播配置文件的更改
需要借助rabbitmq,windows环境下安装可能会失败,选择使用linux中使用docker安装:安装教程
改造配置中心
改造步骤:
- 在config_server中,加入Bus和RabbitMQ的依赖
- 修改配置文件:RabbitMQ服务地址,触发配置文件更改接口
实现过程:
-
在config_server项目中加入Bus相关依赖
<!--消息总线依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <!--RabbitMQ依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency>
-
在config_server项目中修改application.yml
# RabbitMQ的服务地址 spring.rabbitmq.host: 192.168.200.128 spring.rabbitmq.port: 5672 spring.rabbitmq.username: guest spring.rabbitmq.password: guest # 触发配置文件广播的地址actuator的endpoint management.endpoints.web.exposure.include: bus-refresh
改造用户服务
需要启动rabbitmq
改造步骤:
- 在user-service中,加入Bus和RabbitMQ的依赖
- 修改配置文件:RabbitMQ服务地址
- 在需要刷新配置的类上加@RefreshScope注解
- 测试效果
实现过程:
-
在用户微服务user_service项目中加入Bus相关依赖
<!--消息总线依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-bus</artifactId> </dependency> <!--RabbitMQ依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency>
-
修改user_service项目的bootstrap.yml
# RabbitMQ的服务地址 spring.rabbitmq.host: 192.168.200.128 spring.rabbitmq.port: 5672 spring.rabbitmq.username: guest spring.rabbitmq.password: guest
-
改造用户微服务user_service项目的UserController
@RestController @RequestMapping("/user") @RefreshScope //刷新配置 public class UserController { @Value("${server.port}") private String port; @Value("${test.hello}") private String name; @Autowired UserService userService; //查询所有 @RequestMapping("/findAll") public List<User> findAll() { return userService.findAll(); } //根据id查询 @RequestMapping("/findById") public User findById(Integer id) { System.out.println("服务【"+port+"】被调用"); User user = userService.findById(id); user.setNote("服务【"+port+"】被调用"); user.setName(name); return user; } }
需要先启动配置中心再启动服务提供者,否则服务提供者无法启动: 这里的测试没有启动网关和消费者,直接访问服务
改变码云的配置文件
此时调用服务,并没有获取的参数并没有改变
需要发送post请求触发
再次测试
服务提供者中显示刷新了
但是浏览器中访问还是没有刷新
因为犯了一个很sb的错误,这个注解给加到启动类上面了,改回来后可以正常运行