N.1 Bus的介绍
1)当我们更新 GitHub 中的配置文件内容后, Config 客户端服务是否会及时更新的配置内容呢? 2)答:不会,我们需要更改后,然后重启项目,这样的话就比较麻烦,所以Bus可以解决这个问题。 |
N.2 Bus使用机制
1)Spring Cloud Bus 被国内很多都翻译为消息总线。大家可以将它理解为管理和传播所有分布式项目中的消息即可,其实本质是利用了MQ的广播机制在分布式的系统中传播消息,目前常用的有Kafka和RabbitMQ。利用Bus的机制可以做很多的事情,其中配置中心客户端刷新就是典型的应用场景之一,我们用一张图来描述Bus在配置中心使用的机制。 |
————————————————————————
————————————————————————
2)根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤: (1)提交配置后发送post方式的/bus-refresh请求给Config客户端 (2)Config客户端接收到请求从Server端更新配置并且发送消息给消息总线 (3)消息总线接到消息并通知给其它客户端 (4)其它客户端接收到通知,请求Server端获取最新配置 (5)全部客户端均获取到最新的配置 3)RabbitMQ (1)介绍 RabbitMQ采用AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议,RabbitMQ的broker由Exchange,Binding,queue组成 |
————————————————————————
————————————————————————
(2)Brokerr与Consume交互方式不同 RabbitMQ 采用push的方式 kafka采用pull的方式 |
N.3 Bus操作案例
N.3.1 安装RabbitMQ
1)因为我们采用的是 RabbitMQ 消息队列进行传播消息,所以需要安装 RabbitMQ。 RabbitMQ是Erlang语言开发的,所以先要安装Erlang,类似jdk一样。 2)安装过程 这里省略...... 3)cmd窗口的命令 (1)安装服务 rabbitmq-service.bat install (2)停止服务 rabbitmq-service.bat stop (3)启动服务 rabbitmq-service.bat start 4)打开浏览器访问 (1)关于端口号 [1] 15672 RabbitMQ 的管理页面端口( 浏览器访问:http://localhost:15672 ) 。 [2] 5672 客户端连接RabbitMQ端口(java连接时使用 5672 端口) 。 5)安装管理插件成功后, 登录RabbitMQ 管理页面 (1)浏览器访问:http://localhost:15672。 (2)初始账号和密码: guest/guest |
————————————————————————
————————————————————————
N.3.2 配置Config客户端
1)microservice-cloud-14-product-config-8001 |
(1)bootstrap.yml |
spring: cloud: config: name: microservice-config-product #github上的配置名称,注意没有yml后缀名 profile: prod # 本次访问的环境配置项 label: master # 远程库的分支名 uri: http://localhost:5001 #Config配置中心地址,通过它获取microservice-config-product.yml配置信息 rabbitmq: host: localhost port: 5672 username: guest password: guest # 暴露触发消息总线的地址 management: endpoints: web: exposure: include: bus-refresh |
(2)添加的依赖 |
<!--Bus 与 rabbitMQ依赖--> <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> |
2)microservice-cloud-13-eureka-config-6001 |
(1)bootstrap.yml (同理还要加依赖) |
spring: cloud: config: name: microservice-config-eureka #github上的配置名称,注意没有yml后缀名 profile: prod #本次访问的环境配置项 label: master #远程库的分支名 uri: http://localhost:5001 #Config配置中心地址,通过它获取microservice-config-eureka.yml配置信息 # 暴露触发消息总线的地址 management: endpoints: web: exposure: include: bus-refresh |
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
N.3.3 读取配置操作
1)如果我们要读取配置文件的话,不能在用简单的Postman软件 ,发送post就认为可以读取了,必须还要在@value类中添加 @RefreshScope //刷新配置 的注解 才可以获取。 |
————————————————————————
————————————————————————
import com.mengxuegu.springcloud.entities.Product; import com.mengxuegu.springcloud.service.ProductService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.*; import java.util.List; @RefreshScope //刷新配置 @RestController public class ProductController { @Value("${emp.name}") private String name; @GetMapping("/hello") public String hello() { return name; } @Autowired private ProductService productService; //value = "/product/get/{id}" 最后的是id 是浏览器变量 ,@PathVariable("id")变成 传入参数 @RequestMapping(value = "/product/get/{id}") public Product get(@PathVariable("id") Long id) { Product product = productService.get(id); return product; } @RequestMapping(value = "/product/getAll") public List<Product> getAll() { return productService.getAll(); } //http://localhost:8001/product/add 这个是访问web有的 @RequestMapping( value = "/product/add") public Boolean add( Product product) { return productService.add(product); } @RequestMapping(value = "/product/updata") public Boolean updata(Product product) { return productService.updata(product); } @RequestMapping(value = "/product/delete") public Boolean delete( Product product) { return productService.delete(product); } } |
————————————————————————
———————————————————————— ————————————————————————
————————————————————————
————————————————————————
N.3.4 刷新Druid数据源配置实战
1)注意:如果我们使用的树Druid数据源,且跟该了数据,那么不可以在用简单的Postman软件 ,发送post就认为可以更新配置文件,我们还要创建配置类和@RefreshScope //刷新配置的注解结合使用呢, 才可以用Postman软件发送post命令,达到配置文件的更新效果。 2)如果使用的是默认的数据源,那么就不用创建配置类+@RefreshScope ,直接使用Postman软件发送post命令,就可以做到实时更新。 |
import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DruidConfig { @RefreshScope //刷新配置, 注意 注释必须放在方法上面,不要反正类上面,放在类上面没有 @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druid() { return new DruidDataSource(); } } |
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————
————————————————————————