Spring cloud config
当微服务的服务过多,以及服务集群的存在,每个微服务的配置很难集中管理。但是我们可以通过SpringCloud Config通过git/svn代码托管来实现配置的集中管理。实现配置中心客户端获取远程的配置文件,并可以动态刷新,即时生效。
5.1、开发configServer
-
新建springboot项目,引入configserver、consul、健康检查依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> </dependencies>
-
配置属性配置文件,指定git的用户名、密码、以及仓库地址
# 应用名称
spring.application.name=configserver
# 应用服务 WEB 访问端口
server.port=8989
spring.cloud.consul.port=8500
spring.cloud.config.server.git.username=
spring.cloud.config.server.git.password=
spring.cloud.config.server.git.uri=
3、登录github或者gitee,新建仓库,添加两个文件commodity.properties 、commodity-dev.properties
5、启动项目,访问验证
6、当然也可指定分支和本地仓库位置
# 注意本地仓库位置一定要是一个空目录,因为首次运行时会清空该目录的所有内容
spring.cloud.config.server.git.basedir=/localdata
spring.cloud.config.server.git.default-label=master #指定使用远程仓库中那个分支中内容
5.2、开发configClient
-
新建springboot项目,configClient即为一个一个的微服务,所以引入微服务的相关依赖,如consul、hystrix等
另外还需引入configclient依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
由于我们应该在项目启动时先等待拉取远程配置,拉取远程配置成功之后再根据远程配置信息启动即可,为了完成上述要求springboot官方提供了一种解决方案,就是在使用统一配置中心时应该将微服务的配置文件名修改为
bootstrap
.(properties|yml),bootstrap.properties
作为配置启动项目时,会优先拉取远程配置,远程配置拉取成功之后根据远程配置启动当前应用。所以修改application的文件名为bootstrap。并添加如下内容
# 应用名称 spring.application.name=commodity #配置文件名 spring.cloud.config.name=commodity #配置的策略pro-生产 test-测试 dev-开发 spring.cloud.config.profile=pro #指定分支 spring.cloud.config.label=master #开启配置信息发现 spring.cloud.config.discovery.enabled=true #指定配置中心的service-id spring.cloud.config.discovery.service-id=configserver
-
更新远程配置文件。注意commodity.properties用来存放公共配置,dev用来存放开发配置。pro用来存放生产配置
-
新增控制器方法
package com.laodai.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * @作者 老代 * @微信 laodai6_6 * @时间 2021/3/13 23:45 * @Version 1.0 */ @RestController @RefreshScope//开启刷新 public class CommodityController { @Value("${server.port}") private int port; @Value("${name}") private String name; @GetMapping("/commodity/test") public Map<String,Object> test(){ Map<String,Object> map = new HashMap<>(); map.put("status",200); map.put("msg","测试从远程仓库获取配置信息"); map.put("name",name); map.put("port",port); return map; } }
-
启动项目,通过控制台可以看到当前服务的端口号为8888,正式生产配置的端口。访问接口可以接受到信息
5.3、手动刷新配置
实际中,无论是生产环境还是开发环境我们都会经常修改配置文件,如果每次修改配置后都需要重新启动微服务集群,那么运维成本是巨大的,所以我们需要设置为更改了远程配置文件就可刷新
-
修改bootstrap.properties文件,添加这个配置
management.endpoints.web.exposure.include=* #开启所有web端点暴露
-
在需要刷新参数的代码类上添加 @RefreshScope注解。注意如果在业务方法中也引用了配置文件中的内容也需要添加注解才可刷新
-
启动项目,访问测试
-
手动调用刷新配置接口 curl -X POST http://localhost:8888/actuator/refresh。访问测试
-