spring cloud config、bus动态刷新配置
-
依赖版本
spring cloud <Greenwich.SR1>
spring boot <2.1.3.RELEASE> -
config_server配置
2.1 pom.xml添加依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-monitor</artifactId> </dependency>
2.2 application.yml 添加配置
server: port: 7071 spring: application: name: config_server cloud: config: server: git: uri: ******** #git项目链接 username: ******** #git账号 password: ******** #git密码 security: user: password: 123456 name: admin rabbitmq: host: localhost port: 5672 username: guest password: guest management: endpoints: web: exposure: include: "*" eureka: client: service-url: defaultZone: http://127.0.0.1:7070/eureka/ instance: hostname: 127.0.0.1 ip-address: ${eureka.instance.hostname} instance-id: ${eureka.instance.hostname}:${server.port} prefer-ip-address: true
2.3 启动类添加注解
@EnableConfigServer @EnableEurekaClient @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
-
config_client配置
3.1 pom.xml<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
3.2 bootstrap.yml 配置
spring: application: name: hotel cloud: config: username: admin password: 123456 discovery: service-id: config_server enabled: true label: dev #从git仓库拉取配置的分支,默认为master profile: dev #从指定分支下拉取的配置的环境 rabbitmq: host: localhost username: guest password: guest port: 5672 eureka: client: service-url: defaultZone: http://127.0.0.1:7070/eureka/ instance: hostname: 127.0.0.1 ip-address: ${eureka.instance.hostname} instance-id: ${eureka.instance.hostname}:${server.port} server: port: 7081
3.3 启动类上添加注解
@SpringBootApplication @EnableEurekaClient public class HotelApplication { public static void main(String[] args) { SpringApplication.run(HotelApplication.class, args); } }
3.4 创建测试controller
@RestController @RequestMapping("/env") @RefreshScope #bus刷新必须在controller上添加此注解 public class TestBus { @Value("${env}") private String env; @GetMapping("/print") public String print() { JSONObject object = new JSONObject(); object.put("env",env); return object.toJSONString(); } }
-
在git上添加测试配置文件
如上图在git上建立分支(master/dev),在dev分支下新建文件application.yml和hotel-dev.yml文件,application.yml为默认加载的文件(可以把数据库连接或者公共配置放在此文件中),hotel-dev.yml根据应用配置环境加载的配置文件.在hotel-dev.yml 添加env: test4
-
在git中为本项目配置WebHooks
url配置上config_server_ip:port/actuator/bus-refresh(这里需要配置外网环境的地址,因为是本地测试,我这里使用natapp内网穿透) -
需在config_server添加filter
@Component public class UrlFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest)request; HttpServletResponse httpServletResponse = (HttpServletResponse)response; String url = new String(httpServletRequest.getRequestURI()); //只过滤/actuator/bus-refresh请求 if (!url.endsWith("/bus-refresh")) { chain.doFilter(request, response); return; } //获取原始的body readAsChars(httpServletRequest); //使用HttpServletRequest包装原始请求达到修改post请求中body内容的目的 CustometRequestWrapper requestWrapper = new CustometRequestWrapper(httpServletRequest); chain.doFilter(requestWrapper, response); } @Override public void destroy() { } private class CustometRequestWrapper extends HttpServletRequestWrapper { public CustometRequestWrapper(HttpServletRequest request) { super(request); } @Override public ServletInputStream getInputStream() throws IOException { byte[] bytes = new byte[0]; ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); return new ServletInputStream() { @Override public boolean isFinished() { return byteArrayInputStream.read() == -1 ? true:false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; } } public static String readAsChars(HttpServletRequest request) { BufferedReader br = null; StringBuilder sb = new StringBuilder(""); try { br = request.getReader(); String str; while ((str = br.readLine()) != null) { sb.append(str); } br.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); } }
-
启动config_server/config_client,访问localhost:7081/env/print
-
更改hotel-dev.yml 配置后,触发webhook,再访问localhost:7081/env/print