51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1894|回复: 0
打印 上一主题 下一主题

springCloud微服务系列——配置中心第四篇——手动刷新

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-11 17:02:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、简介
配置文件如果改变了,已经启动的服务如何获得最新的配置,当然可以重新启动服务,但是这样速度太慢了,还需要到服务器上去操作,增加了运维成本,spring cloud提供了一个手动刷新的解决方案。

二、客户端刷新
客户端刷新是调用单个客户端的端点刷新接口,这样只刷新被调用刷新接口的端点。

端点配置
spring cloud在actuator中提供了一个refresh端点,通过该端点可以进行刷新。

客户端引入actuator
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>
复制代码
客户端引入spring security
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-security</artifactId>
  4. </dependency>
复制代码
配置management并暴露端点
  1. management:
  2.   server:
  3.     port: 8101
  4.     servlet:
  5.       context-path: /demo/configClient/admin   
  6.   endpoints:
  7.     web:
  8.       exposure:
  9.         include: "*"
复制代码
在需要刷新的类上加上@RefreshScope注解
  1. @RefreshScope
  2. @RestController
  3. @RequestMapping("testApi")
  4. public class ConfigTestApi {
  5.        
  6.         @Value("${luminary.test}")
  7.         private String test;

  8.         @GetMapping("/config")
  9.         public String server(
  10.                         HttpServletRequest request,
  11.                         HttpServletResponse response) {
  12.                
  13.                 return test;
  14.                
  15.         }
  16.        
  17. }
复制代码

安全配置

对refresh端点不进行csrf防护

  1. @Configuration
  2. @EnableWebSecurity
  3. public class EurekaClientWebSecurityConfig extends WebSecurityConfigurerAdapter {

  4.         @Override
  5.         protected void configure(HttpSecurity http) throws Exception {
  6.                
  7.                  http
  8.          .authorizeRequests()
  9.          // 普通的接口不需要校验
  10.          .antMatchers("/*api/**").permitAll()
  11.          // swagger页面需要添加登录校验
  12.          .antMatchers("/swagger-ui.html").authenticated()
  13.          // 监控节点需要添加登录校验
  14.          .requestMatchers(EndpointRequest.toAnyEndpoint()).authenticated()
  15.          .and()
  16.          // 允许刷新服务
  17.          .csrf().ignoringAntMatchers("/actuator/refresh");
  18.                  
  19.                  super.configure(http);
  20.                  
  21.         }
  22.        
  23. }
复制代码

刷新

通过POST调用客户端的refresh端点,如果配置有改变,返回结果如下

需要注意的是refresh端点是actuator的端点,所以如果配置了management的话,要用management中配置的server.port和server.servlet.context-path


三、服务端刷新

客户端刷新需要每个客户端调用refresh接口,我们希望能在服务端调用刷新接口,然后通知每个客户端进行刷新。

我们需要借助消息总线spring-cloud-bus将刷新信息发送到客户端,目前spring-cloud-bus支持rabbitMq和kafka,这里以kafka做例子。

端点配置

服务端引入actuator,spring security,spring cloud bus,spring cloud config monitor

  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-config-server</artifactId>
  4. </dependency>
  5.    
  6. <dependency>
  7.         <groupId>org.springframework.cloud</groupId>
  8.         <artifactId>spring-cloud-starter-bus-kafka</artifactId>
  9. </dependency>
  10.   
  11. <dependency>
  12.     <groupId>org.springframework.cloud</groupId>
  13.     <artifactId>spring-cloud-config-monitor</artifactId>
  14. </dependency>
  15.   
  16. <dependency>
  17.     <groupId>org.springframework.boot</groupId>
  18.     <artifactId>spring-boot-starter-actuator</artifactId>
  19. </dependency>
复制代码

服务端配置management并暴露端点

  1. management:
  2.   server:
  3.     port: 8168
  4.     servlet:
  5.       context-path: /manage/serverConfig/admin   
  6.   endpoints:
  7.     web:
  8.       exposure:
  9.         include: "*"
复制代码

客户端在需要刷新的类上加上@RefreshScope注解

  1. @RefreshScope
  2. @RestController
  3. @RequestMapping("testApi")
  4. public class ConfigTestApi {
  5.        
  6.         @Value("${luminary.test}")
  7.         private String test;

  8.         @GetMapping("/config")
  9.         public String server(
  10.                         HttpServletRequest request,
  11.                         HttpServletResponse response) {
  12.                
  13.                 return test;
  14.                
  15.         }
  16.        
  17. }
复制代码

安全配置

对bus-refresh端点不进行csrf防护

  1. @EnableWebSecurity
  2. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  3.         @Override
  4.         protected void configure(HttpSecurity http) throws Exception {
  5.                
  6.                 http
  7.                 .authorizeRequests()
  8.                 .requestMatchers(EndpointRequest.toAnyEndpoint()).authenticated()
  9.                 .and()
  10.                 .csrf().ignoringAntMatchers("/encrypt", "/decrypt", "/actuator/bus-refresh");
  11.                
  12.                 super.configure(http);
  13.                
  14.         }
  15.        
  16. }
复制代码

KAFKA配置

spring cloud bus通过消息队列发送配置变更消息给客户端,目前只支持rabbitMq和kafka,这里选择使用kafka

服务端和客户端配置

  1. spring:
  2.   cloud:
  3.     stream:
  4.        kafka:
  5.          binder:
  6.            brokers: localhost:9092
  7.            #zk-nodes: localhost:2181 #spring cloud Finchley已弃用,zookeeper会被自动配置
  8.            auto-add-partitions: true
  9.            auto-create-topics: true
  10.            min-partition-count: 1
复制代码


刷新

通过POST调用服务端的bus-refresh端点

需要注意的是bus-refresh端点是actuator的端点,所以如果配置了management的话,要用management中配置的server.port和server.servlet.context-path



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-25 19:37 , Processed in 0.068123 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表