Spring Cloud 消息总线(BUS)实现自动刷新

阳光穿透心脏的1/2处 2024-04-17 14:53 130阅读 0赞

附:natapp内网穿透 详细文档

ps:springboot 版本:2.1.7.RELEASE,springcloud版本:Greenwich.SR2

一.config-server:

1.引入相应jar包:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-config-server</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-actuator</artifactId>
  16. </dependency>

2.修改配置文件:application.yml

  1. server:
  2. port: 8765
  3. spring:
  4. application:
  5. name: config-server
  6. cloud:
  7. config:
  8. server:
  9. git:
  10. uri: https://github.com/LuciferZK/config-repo
  11. username: 13871xxxxx@163.com
  12. password: ---------*******
  13. #basedir: D:\project\morning-star\config-server\config\basedir
  14. rabbitmq:
  15. host: 192.168.47.131
  16. port: 5672
  17. username: guest
  18. password: guest
  19. management:
  20. endpoints:
  21. web:
  22. exposure:
  23. include: bus-refresh

3.主配置类添加@EnableConfigServer注解,开启config

  1. @EnableConfigServer
  2. @SpringBootApplication
  3. public class MorningConfigApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(MorningConfigApplication.class, args);
  6. }
  7. }

二:config-client

1.引入相应jar包

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-config</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.boot</groupId>
  11. <artifactId>spring-boot-starter-actuator</artifactId>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.cloud</groupId>
  19. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  20. </dependency>

2:控制层添加RefreshScope注解;否则无法刷新看到效果

20190827164454316.png

3.配置文件:bootstrap.yml

  1. spring:
  2. application:
  3. name: morning-service-order
  4. cloud:
  5. config:
  6. uri: http://localhost:8765
  7. profile: dev
  8. bus:
  9. enabled: true
  10. trace:
  11. enabled: true
  12. rabbitmq:
  13. host: 192.168.47.131
  14. port: 5672
  15. username: guest
  16. password: guest

三、使用postman测试:http://localhost:8765/actuator/bus-refresh

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDk1Nzg2_size_16_color_FFFFFF_t_70

并无任何问题。如果想自动刷新的话,不可能每次去使用postman请求一次,所以按照如下操作即可:

四:github上操作:

(1)设置

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDk1Nzg2_size_16_color_FFFFFF_t_70 1

(2)添加

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDk1Nzg2_size_16_color_FFFFFF_t_70 2

ps:**Payload URL这个地址需要是外网能够访问的地址,而不是只是本地的http://localhost:8765/actuator/bus-refresh,没有域名,因此我这里就用到内网穿透工具。**

我这里只是用的免费版的,免费的缺点是映射的外网网址不会固定不变,随机的

具体操作看附的连接中的文档;工具双击打开:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3NDk1Nzg2_size_16_color_FFFFFF_t_70 3

这里的forwarding 的地址就是填在github上Payload URL的地址;再次提醒,免费版的,映射地址会变动的,除非你cmd不关闭。

上述操作完毕后,用postman测试,并无问题,但是你在github上修改配置文件,github自动请求你的http://\*\*\*\*/[actuator/bus-refresh][http_localhost_8765_actuator_bus-refresh]的时候,你的config-server会报错,报错内容就是json解析失败.

五:增加filter过滤器,并重写getInputStream方法

  1. package com.lucifer.config.filter;
  2. import org.springframework.stereotype.Component;
  3. import javax.servlet.*;
  4. import javax.servlet.http.HttpServletRequest;
  5. import java.io.IOException;
  6. /**
  7. * @author: lucifer
  8. * @date: 2019/8/27
  9. * @description:
  10. */
  11. @Component
  12. //@WebFilter(urlPatterns = "/**", filterName = "BusFilter")
  13. public class BusFilter implements Filter {
  14. @Override
  15. public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
  16. HttpServletRequest httpServletRequest = (HttpServletRequest) req;
  17. String requestURI = httpServletRequest.getRequestURI();
  18. //过滤掉非/actuator/bus-refresh请求
  19. if (!requestURI.endsWith("/actuator/bus-refresh")) {
  20. filterChain.doFilter(req, res);
  21. return;
  22. }
  23. RequestWrapper requestWrapper = new RequestWrapper(httpServletRequest);
  24. filterChain.doFilter(requestWrapper, res);
  25. }
  26. @Override
  27. public void destroy() {
  28. }
  29. @Override
  30. public void init(FilterConfig arg0) {
  31. }
  32. }
  33. package com.lucifer.config.filter;
  34. import javax.servlet.ReadListener;
  35. import javax.servlet.ServletInputStream;
  36. import javax.servlet.http.HttpServletRequest;
  37. import javax.servlet.http.HttpServletRequestWrapper;
  38. import java.io.ByteArrayInputStream;
  39. import java.io.IOException;
  40. /**
  41. * @author: lucifer
  42. * @date: 2019/8/27
  43. * @description:
  44. */
  45. public class RequestWrapper extends HttpServletRequestWrapper {
  46. public RequestWrapper(HttpServletRequest request) {
  47. super(request);
  48. }
  49. @Override
  50. public ServletInputStream getInputStream() throws IOException {
  51. byte[] bytes = new byte[0];
  52. ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
  53. return new ServletInputStream() {
  54. @Override
  55. public int read() throws IOException {
  56. return byteArrayInputStream.read();
  57. }
  58. @Override
  59. public boolean isFinished() {
  60. return byteArrayInputStream.read() == -1 ? true : false;
  61. }
  62. @Override
  63. public boolean isReady() {
  64. return false;
  65. }
  66. @Override
  67. public void setReadListener(ReadListener readListener) {
  68. }
  69. };
  70. }
  71. }

发表评论

表情:
评论列表 (有 0 条评论,130人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Cloud Bus(消息总线)(1)

    消息代理 消息代理是一种消息验证、传输、路由的架构模式。它在应用程序之间起到通信调度并最小化应用之间的依赖作用,使得应用程序可以高效地解耦通信过程。消息代理是一个中间件产