【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪

本文涉及的产品
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪

1、SpringCloud Config分布式服务配置中心

1.1 微服务面临的问题

可以看到,每个微服务都需要一个配置文件,并且,如果有几个微服务都需要连接数据库
那么就需要配4次数据库相关配置,并且当数据库发生改动,那么需要同时修改4个微服务的配置文件才可以

所以有了springconfig配置中心

1.2 使用配置中心

使用github作为配置中心的仓库:

初始化git环境:

1.2.1 新建config模块

名字: cloud-config-3344

1.2.2 修改pom
1.2.3 配置文件

1.2.4 主启动类

1.2.5 修改hosts

1.2.6 配置完成

测试,3344是否可以从github上获取配置

启动3344 (要先启动eureka)

它实际上就是,读取到配置文件中的GitHub的地址,然后拼接上/master/config-dev.yml

1.2.7 读取配置文件的规则

这里默认会读取master分支,因为我们配置文件中配置了

注意,这个方式读取到的配置是json格式

所有规则:

1.3、创建配置中心客户端

1.3.1 创建config客户端项目

名字: cloud-config-client-3355

1.3.2 修改pom
1.3.3 配置文件

注意这个配置文件就不是application.yml

而是bootstrap.yml

这个配置文件的作用是,先到配置中心加载配置,然后加载到application.yml中

1.3.4 主启动类

1.3.5 controller类

就是上面提到的,以rest风格将配置对外暴露

如果客户端运行正常,就会读取到github上配置文件的,config.info下的配置

1.3.6 测试

启动3344,3355

访问3355的 /configInfo

1.3.7 问题
上面3355确实获取到了配置文件,但是如果此时配置文件修改了,3355是获取不到的
        3344可以实时获取到最新配置文件,但是3355却获取不到
        除非重启服务

1.4 实现动态刷新

1.4.1 修改3355,添加一个pom依赖:

1.4.2 修改配置文件,添加一个配置:

1.4.3 修改controller

1.4.4 重启服务

此时3355还不可以动态获取

因为此时,还需要外部发送post请求通知3355

此时在刷新3355,发现可以获取到最新的配置文件了,这就实现了动态获取配置文件,因为3355并没有重启

具体流程就是:

我们启动好服务后

运维人员,修改了配置文件,然后发送一个post请求通知3355

3355就可以获取最新配置文件

问题:

如果有多个客户端怎么办(3355,3356,3357…)

虽然可以使用shell脚本,循环刷新

但是,可不可以使用广播,一次通知??

这些springconfig做不到,需要使用springcloud Bus消息总线

2、SpringCloud Bus消息总线

2.1 概述

注意,这里年张图片,就代表两种广播方式

图1: 它是Bus直接通知给其中一个客户端,由这个客户端开始蔓延,传播给其他所有客户端

图2: 它是通知给配置中心的服务端,有服务端广播给所有客户端

为什么被称为总线?

就是通过消息队列达到广播的效果
        我们要广播每个消息时,主要放到某个topic中,所有监听的节点都可以获取到

2.2 使用Bus

2.1.1 配置rabbitmq环境

2.1.2 之前只有一个配置中心客户端,这里在创建一个

复制3355即可,创建为3366

全部复制3355的即可

2.1.3 使用Bus实现全局广播

Bus广播有两种方式:

就是上面两个图片的两种方式

这两种方式,第二种跟合适,因为:

第一种的缺点:

2.1.4 配置第二种方式
  • 配置3344(配置中心服务端)😗*
  1. 修改配置文件:

  1. 添加pom

springboot的监控组件,和消息总线

  • 修改3355(配置中心的客户端)
  1. pom:

  1. 配置文件:

注意配置文件的名字,要改为bootstrap.yml

  • 修改3366(也是配置中心的客户端)

修改与3355是一模一样的

2.1.5 测试

启动7001,3344,3355,3366

此时修改GitHub上的配置文件

此时只需要刷新3344,即可让3355,3366动态获取最新的配置文件

其原理就是:

所有客户端都监听了一个rabbitMq的topic,我们将信息放入这个topic,所有客户端都可以送到,从而实时更新

配置定点通知

就是只通知部分服务,比如只通知3355,不通知3366

只通知3355

可以看到,实际上就是通过微服务的名称+端口号进行指定

3、SpringCloud Stream消息驱动

3.1 概述

现在一个很项目可能分为三部分:
        前端--->后端---->大数据
        而后端开发使用消息中间件,可能会使用RabbitMq
        而大数据开发,一般都是使用Kafka,
        那么一个项目中有多个消息中间件,对于程序员,因为人员都不友好

而Spring Cloud Stream就类似jpa,屏蔽底层消息中间件的差异,程序员主要操作Spring Cloud Stream即可

不需要管底层是kafka还是rabbitMq

3.2 什么是Spring Cloud Stream

3.3 Spring Cloud Stream是怎么屏蔽底层差异的?

3.4 Spring Cloud Streamd 通信模式

3.5 Spring Cloud Stream的业务流程

类似flume中的channel,source,sink 估计是借鉴(抄袭)的
        source用于获取数据(要发送到mq的数据)
        channel类似SpringCloudStream中的中间件,用于存放source接收到的数据,或者是存放binder拉取的数据

3.6 常用注解和api

3.7 使用SpringCloudStream

需要创建三个项目,一个生产者,两个消费者

3.7.1 创建生产者
  1. pom
  2. 配置文件

  1. 主启动类

  1. service和实现类

service定义发送消息

这里,就会调用send方法,将消息发送给channel,

然后channel将消费发送给binder,然后发送到rabbitmq中

  1. controller

  1. 测试

启动rabbitmq

启动7001,8801

确定8801后,会在rabbitmq中创建一个Exchange,就是我们配置文件中配置的exchange

访问8801的/sendMessage

3.7.2 创建消费者
  1. pom文件
  2. 配置文件

这里排版一点问题

input就表示,当前服务是一个消费者,需要消费消息,下面就是指定消费哪个Exchange中的消息

  1. 主启动类

  1. 业务类(消费数据)

生产者发送消息时,使用send方法发送,send方法发送的是一个个Message,里面封装了数据

  1. 测试:

启动7001.8801.8802

此时使用生产者生产消息

可以看到,消费者已经接收到消息了

3.7.2 创建消费者2

创建8803,

与8802创建一模一样,就不写了

创建8803主要是为了演示重复消费等问题

重复消费问题:

此时启动7001.8801.8802.8803

此时生产者生产一条消息

但是此时查询消费者,发现8802,8803都消费到了同一条数据

3.7.3 自定义分组

修改8802,8803的配置文件

现在将8802,8803都分到了A组

然后去重启02,03

然后此时生产者生产两条消息

可以看到,每人只消费了一条消息,并且没有重复消费

3.8 持久化问题

就是当服务挂了,怎么消费没有消费的数据??

这里,先将8802移除A组,

然后将02,03服务关闭

此时生产者开启,发送3条消息

此时重启02,03

可以看到,当02退出A组后,它就获取不到在它宕机的时间段内的数据

但是03重启后,直接获取到了宕机期间它没有消费的数据,并且消费了

总结:

也就是,当我们没有配置分组时,会出现消息漏消费的问题

而配置分组后,我们可以自动获取未消费的数据

4、Spring Cloud Sleuth链路追踪

4.1 sleuth要解决的问题

而来sleuth就是用于追踪每个请求的整体链路

4.2 使用sleuth

4.2.1 安装zipkin

运行jar包

java -jar xxxx.jar

然后就可以访问web界面, 默认zipkin监听的端口是9411

localhost:9411/zipkin/

可以看到,类似链表的形式

4.2.2 使用sleuth

不需要额外创建项目,使用之前的8001和order的80即可

  1. 修改8001

引入pom:

这个包虽然叫zipkin但是,里面包含了zpikin与sleuth

修改配置文件:

  1. 修改80

添加pom

与上面是一样的

添加配置:

与上面也是一样的

4.2.3 测试

启动7001.8001,80,9411

相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
打赏
0
0
0
0
36
分享
相关文章
|
2天前
|
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
19 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
10 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
15 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th="http://www.thymeleaf.org"`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
16 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
15 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
13 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
11 0
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
236 1
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等