1.今日内容

  • Config 分布式配置中心
  • Bus 消息总线
  • Stream 消息驱动
  • Sleuth+Zipkin 链路追踪

2.config

2.1-config-概述

SpringCloud-day03 - 图1

• Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护。
• 好处:
集中管理配置文件
不同环境不同配置,动态化的配置更新
配置信息改变时,不需要重启即可更新配置信息到服务

2.2-config-快速入门

2.2.1-gitee搭建远程仓库

1.编写仓库名称、仓库路径、公开(公开的比较方便)

SpringCloud-day03 - 图2

2.语言和模板可以不选,一般使用单分支模型,只创建master分支

SpringCloud-day03 - 图3

3.使用小乌龟工具,将远程仓库clone到本地

SpringCloud-day03 - 图4

4.使用小乌龟工具将配置文件提交到远程仓库

SpringCloud-day03 - 图5

SpringCloud-day03 - 图6

2.2.2-config server搭建

config server:

  1. 使用gitee创建远程仓库,上传配置文件
  2. 搭建 config server 模块
  3. 导入 config-server 依赖```xml

    1. <groupId>org.springframework.cloud</groupId>
    2. <artifactId>spring-cloud-config-server</artifactId>

    ```

  4. 编写配置,设置 gitee 远程仓库地址

  1. server:
  2. port: 9527
  3. spring:
  4. application:
  5. name: config-server
  6. # spring cloud config
  7. cloud:
  8. config:
  9. server:
  10. # git 的 远程仓库地址
  11. git:
  12. uri: https://gitee.com/itheima_cch/itheima-configs.git
  13. label: master # 分支配置
  1. 测试访问远程配置文件

SpringCloud-day03 - 图7

2.2.3-config client搭建

config client:

  1. 导入 starter-config 依赖```xml

    1. <dependency>
    2. <groupId>org.springframework.cloud</groupId>
    3. <artifactId>spring-cloud-starter-config</artifactId>
    4. </dependency>

    ```

  2. 配置config server 地址,读取配置文件名称等信息
    创建配置文件bootstrap.yml```yaml

    配置config-server地址

    配置获得配置文件的名称等信息

    spring: cloud: config:

    配置config-server地址

    uri: http://localhost:9527

    配置获得配置文件的名称等信息

    name: config # 文件名 profile: dev # profile指定, config-dev.yml label: master # 分支 ```

  3. 获取配置值java @Value("${itheima}") private String itheima;

  4. 启动测试

SpringCloud-day03 - 图8

2.2.4-config client刷新

  1. 在 config 客户端引入 actuator 依赖```xml

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-actuator</artifactId>
    4. </dependency>

    ```

  2. 获取配置信息类上,添加 @RefreshScope 注解

  1. /**
  2. * Goods Controller 服务提供方
  3. */
  4. @RestController
  5. @RequestMapping("/goods")
  6. @RefreshScope // 开启刷新功能
  7. public class GoodsController {
  8. @Autowired
  9. private GoodsService goodsService;
  10. @Value("${server.port}")
  11. private int port;
  12. @Value("${itheima}")
  13. private String itheima;
  14. ...
  15. }
  1. 添加配置management.endpoints.web.exposure.include: refresh
  1. # 配置config-server地址
  2. # 配置获得配置文件的名称等信息
  3. spring:
  4. cloud:
  5. config:
  6. # 配置config-server地址
  7. uri: http://localhost:9527
  8. # 配置获得配置文件的名称等信息
  9. name: config # 文件名
  10. profile: dev # profile指定, config-dev.yml
  11. label: master # 分支
  12. management:
  13. endpoints:
  14. web:
  15. exposure:
  16. include: refresh
  1. 使用curl工具发送post请求
    curl -X POST http://localhost:8001/actuator/refresh

SpringCloud-day03 - 图9

2.3-config集成Eureka

SpringCloud-day03 - 图10

1.config-server pom.xml中引入eureka-client 坐标

  1. <!-- eureka-client -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>

2.配置文件中配置eureka地址

  1. eureka:
  2. client:
  3. service-url:
  4. defaultZone: http://localhost:8761/eureka/

3.启动类中添加注解

  1. package com.itheima.config;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.config.server.EnableConfigServer;
  5. @SpringBootApplication
  6. @EnableConfigServer // 启用config server功能
  7. @EnableEurekaClient
  8. public class ConfigServerApp {
  9. public static void main(String[] args) {
  10. SpringApplication.run(ConfigServerApp.class,args);
  11. }
  12. }

4.config-provider 工程中bootstrap.yaml中注掉写死的地址,改为从Eureka中获取

  1. # 配置config-server地址
  2. # 配置获得配置文件的名称等信息
  3. spring:
  4. cloud:
  5. config:
  6. # 配置config-server地址
  7. #uri: http://localhost:9527
  8. # 配置获得配置文件的名称等信息
  9. name: config # 文件名
  10. profile: dev # profile指定, config-dev.yml
  11. label: master # 分支
  12. #从注册中心获取config-server地址
  13. discovery:
  14. enabled:true
  15. service-id:CONFIG-SERVER

3.bus

3.1-bus-概述

SpringCloud-day03 - 图11

• Spring Cloud Bus 是用轻量的消息中间件将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。关键的思想就是,消息总线可以为微服务做监控,也可以实现应用程序之间相通信。

• Spring Cloud Bus 可选的消息中间件包括 RabbitMQ 和 Kafka

3.2-bus-rabbitmq回顾

SpringCloud-day03 - 图12

SpringCloud-day03 - 图13

RabbitMQ 提供了 6 种工作模式:简单模式、work queues、Publish/Subscribe 发布与订阅模式、Routing
路由模式、Topics 主题模式、RPC 远程调用模式(远程调用,不太算 MQ;暂不作介绍)。

SpringCloud-day03 - 图14

RabbitMQ Window 安装参考资料中RabbitMQ Windows 安装.md

3.3-bus-快速入门

  1. 分别在 config-server 和 config-client中引入 bus依赖:bus-amqp```xml

    1. <!-- bus -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    5. </dependency>

    ```

  2. 分别在 config-server 和 config-client中配置 RabbitMQ
    bootstrap.yml```yaml

    配置rabbitmq信息

    rabbitmq: host: localhost port: 5672 username: guest password: guest virtual-host: / ```

OrderController上添加@RefreshScope注解

  1. @RestController
  2. @RequestMapping("/order")
  3. @RefreshScope
  4. public class OrderController {
  5. @Value("${itheima}")
  6. private String itheima;
  7. ...
  8. }
  1. 在config-server中设置暴露监控断点:bus-refresh
    application.yml```yaml

暴露bus的刷新端点

management: endpoints: web: exposure: include: ‘bus-refresh’

  1. 4. 启动测试<br />curl结果中没有信息,说明成功了<br />![](img/1587801187953.png#alt=1587801187953)
  2. ![](img/1587799845708.png#alt=1587799845708)
  3. <a name="4.stream"></a>
  4. # 4.stream
  5. <a name="63edf8aa"></a>
  6. ## 4.1-stream-概述
  7. Spring Cloud Stream 是一个构建消息驱动微服务应用的框架。<br />• Stream 解决了开发人员无感知的使用消息中间件的问题,因为Stream对消息中间件的进一步封装,可以做<br />到代码层面对中间件的无感知,甚至于动态的切换中间件,使得微服务开发的高度解耦,服务可以关注更多<br />自己的业务流程。<br />• Spring Cloud Stream目前支持两种消息中间件RabbitMQKafka
  8. ![](img/1587801268585.png#alt=1587801268585)
  9. ![](img/1587801281505.png#alt=1587801281505)
  10. <a name="cc7aaf67"></a>
  11. ## 4.2-stream-组件
  12. Spring Cloud Stream 构建的应用程序与消息中间件之间是通过绑定器 Binder相关联的。绑定器对于应用程序而言起到了隔离作用, 它使得不同消息中间件的实现细节对应用程序来说是透明的。
  13. binding 是我们通过配置把应用和spring cloud stream binder 绑定在一起
  14. output:发送消息 Channel,内置 Source接口
  15. input:接收消息 Channel,内置 Sink接口
  16. ![](img/1587801301281.png#alt=1587801301281)
  17. <a name="ae9ea80d"></a>
  18. ## 4.3-stream-消息生产者
  19. 1. 创建消息生产者模块,引入依赖 starter-stream-rabbit```xml
  20. <!-- stream -->
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
  24. </dependency>
  1. 编写配置,定义 binder,和 bingings```yaml server: port: 8000 spring: cloud: stream:

    定义绑定器,绑定到哪个消息中间件上

    binders:

    1. itheima_binder: # 自定义的绑定器名称
    2. type: rabbit # 绑定器类型
    3. environment: # 指定mq的环境
    4. spring:
    5. rabbitmq:
    6. host: localhost
    7. port: 5672
    8. username: guest
    9. password: guest
    10. virtual-host: /

    bindings:

    1. output: # channel名称
    2. binder: itheima_binder #指定使用哪一个binder
    3. destination: itheima_exchange # 消息目的地

    ```

  2. 定义消息发送业务类。添加 @EnableBinding(Source.class),注入
    MessageChannel output ,完成消息发送


MessageProducer

  1. package com.itheima.stream.producer;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.cloud.stream.annotation.EnableBinding;
  4. import org.springframework.cloud.stream.messaging.Source;
  5. import org.springframework.messaging.MessageChannel;
  6. import org.springframework.messaging.support.MessageBuilder;
  7. import org.springframework.stereotype.Component;
  8. @Component
  9. @EnableBinding(Source.class)
  10. public class MessageProducer {
  11. @Autowired
  12. private MessageChannel output;
  13. public void send(){
  14. String msessage = "hello stream~~~";
  15. //发送消息
  16. output.send(MessageBuilder.withPayload(msessage).build());
  17. System.out.println("消息发送成功~~~");
  18. }
  19. }

ProducerController

  1. package com.itheima.stream.producer;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class ProducerController {
  7. @Autowired
  8. private MessageProducer producer;
  9. @RequestMapping("/send")
  10. public String sendMsg(){
  11. producer.send();
  12. return "success";
  13. }
  14. }
  1. 编写启动类,测试
  1. package com.itheima.stream;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class ProducerApp {
  6. public static void main(String[] args) {
  7. SpringApplication.run(ProducerApp.class,args);
  8. }
  9. }

4.4-stream-消息消费者

  1. 创建消息消费者模块,引入依赖 starter-stream-rabbit```xml

    1. <!-- stream -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    5. </dependency>

    ```

  2. 编写配置,定义 binder,和 bingings```yaml server: port: 9000 spring: cloud: stream:

    定义绑定器,绑定到哪个消息中间件上

    binders:

    1. itheima_binder: # 自定义的绑定器名称
    2. type: rabbit # 绑定器类型
    3. environment: # 指定mq的环境
    4. spring:
    5. rabbitmq:
    6. host: localhost
    7. port: 5672
    8. username: guest
    9. password: guest
    10. virtual-host: /

    bindings:

    1. output: # channel名称
    2. binder: itheima_binder #指定使用哪一个binder
    3. destination: itheima_exchange # 消息目的地

    ```

  3. 定义消息接收业务类。添加 @EnableBinding(Sink.class),使用
    @StreamListener(Sink.INPUT),完成消息接收。

  1. package com.itheima.stream.consumer;
  2. import org.springframework.cloud.stream.annotation.EnableBinding;
  3. import org.springframework.cloud.stream.annotation.StreamListener;
  4. import org.springframework.cloud.stream.messaging.Sink;
  5. import org.springframework.messaging.Message;
  6. import org.springframework.stereotype.Component;
  7. /**
  8. * 消息接收类
  9. */
  10. @EnableBinding({Sink.class})
  11. @Component
  12. public class MessageListener {
  13. @StreamListener(Sink.INPUT)
  14. public void receive(Message message){
  15. System.out.println(message);
  16. System.out.println(message.getPayload());
  17. }
  18. }
  1. 编写启动类,测试
  1. package com.itheima.stream;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class ConsumerApp {
  6. public static void main(String[] args) {
  7. SpringApplication.run(ConsumerApp.class,args);
  8. }
  9. }

5.Sleuth+Zipkin

5.1-Sleuth+Zipkin-概述

• Spring Cloud Sleuth 其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程,捕获这些跟踪数
据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。
• 耗时分析
• 可视化错误
• 链路优化
• Zipkin 是 Twitter 的一个开源项目,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包
括数据的收集、存储、查找和展现。

5.2-Sleuth+Zipkin-快速入门

  1. 安装启动zipkin。 java –jar zipkin.jar
    SpringCloud-day03 - 图15

    1. 启动成功日志
    2. ![](img/1587802360854.png#alt=1587802360854)
  2. 访问zipkin web界面。 http://localhost:9411/

SpringCloud-day03 - 图16

  1. 在服务提供方和消费方分别引入 sleuth 和 zipkin 依赖
  1. <!-- sleuth-zipkin -->
  2. <!--<dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-sleuth</artifactId>
  5. </dependency>-->
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-zipkin</artifactId>
  9. </dependency>
  1. 分别配置服务提供方和消费方。


sleuth-provider application.yaml

  1. server:
  2. port: 8001
  3. eureka:
  4. client:
  5. service-url:
  6. defaultZone: http://localhost:8761/eureka
  7. spring:
  8. application:
  9. name: feign-provider
  10. zipkin:
  11. base-url: http://localhost:9411/ # 设置zipkin的服务端路径
  12. sleuth:
  13. sampler:
  14. probability: 1 # 采集率 默认 0.1 百分之十。

sleuth-consumer application.yaml

  1. server:
  2. port: 9000
  3. eureka:
  4. instance:
  5. hostname: localhost # 主机名
  6. client:
  7. service-url:
  8. defaultZone: http://localhost:8761/eureka
  9. spring:
  10. application:
  11. name: feign-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
  12. zipkin:
  13. base-url: http://localhost:9411/ # 设置zipkin的服务端路径
  14. sleuth:
  15. sampler:
  16. probability: 1 # 采集率 默认 0.1 百分之十。
  17. logging:
  18. level:
  19. com.itheima: debug
  1. 启动,测试 http://localhost:9411/

SpringCloud-day03 - 图17

详细信息

SpringCloud-day03 - 图18