spring cloud config、bus动态刷新配置

spring cloud config、bus动态刷新配置

  1. 依赖版本
    spring cloud <Greenwich.SR1>
    spring boot <2.1.3.RELEASE>

  2. 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);
        }
    }
    
  3. 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();
        }
    }
    
  4. 在git上添加测试配置文件
    git截图
    如上图在git上建立分支(master/dev),在dev分支下新建文件application.yml和hotel-dev.yml文件,application.yml为默认加载的文件(可以把数据库连接或者公共配置放在此文件中),hotel-dev.yml根据应用配置环境加载的配置文件.在hotel-dev.yml 添加env: test4

  5. 在git中为本项目配置WebHooks
    在这里插入图片描述url配置上config_server_ip:port/actuator/bus-refresh(这里需要配置外网环境的地址,因为是本地测试,我这里使用natapp内网穿透)

  6. 需在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();
        }
    }
    
  7. 启动config_server/config_client,访问localhost:7081/env/print

  8. 更改hotel-dev.yml 配置后,触发webhook,再访问localhost:7081/env/print

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值