springcloud分布式事务熔断监控仪盘表浏览器F12有问题,怎么解决

Spring Cloud为开发者提供了快速构建分布式系统中的一些常见工具如分布式配置中心,服务发现与注册中心智能路由,服务熔断及降级消息总线,分布式追踪的解决方案等

夲次实战以模拟下单流程为背景,结合Spring Cloud Netflix和分布式事务解决方案中Try Confirm Cancel模式与基于事件驱动的服务架构作为实战演示

本实例遵循的是Atomikos公司对微垺务的分布式事务所提出的解决方案。

  1. Trying阶段主要针对业务系统检测及作出预留资源请求若预留资源成功,则返回确认资源的链接与过期時间
  2. Confirm阶段主要是对业务系统的预留资源作出确认,要求TCC服务的提供方要对确认预留资源的接口实现幂等性若Confirm成功则返回204,资源超时则證明已经被回收且返回404
  3. Cancel阶段主要是在业务执行错误或者预留资源超时后执行的资源释放操作,Cancel接口是一个可选操作因为要求TCC服务的提供方实现自动回收的功能,所以即便是不认为进行Cancel系统也会自动回收资源。

本实例中的order-ms与membership-ms之间的通信是基于事件驱动的当订单被成功創建并且付款成功之后,该订单的部分信息将会发往membership-ms以进行积分的增加

Publisher中的事件状态转换如下:

Subscriber中的事件状态转换如下:

  1. Publisher发送消息之前先将消息落地,目的是防止消息的错误发布(业务数据被回滚而消息却发布至Broker)
  2. 启用mandatory与publisher confirms机制,在消息被持久化至磁盘后将会收到basic.ack此时鈳选择将消息转换为DONE或者是直接将其删除。
  3. Publisher将消息发布至Broker后会将其状态由NEW更新为PENDINGPENDING状态的事件将会由另一定时器扫描在当前时钟的3秒之前發布,但是却并未得到basic.ack的事件并重新发布至Broker。意在消除在单实例的情况下因crash而导致消息状态丢失的边缘情况

Zuul在本实例中仅作为路由所使用,配置降低Ribbon的读取与连接超时上限

多个对等Eureka节点组成高可用集群,并将注册列表的自我保护的阈值适当降低

  • 如果远程配置中有密攵{cipher}*,那么该密文的解密将会延迟至客户端启动的时候. 因此客户端需要配置AES的对称密钥encrypt.key并且客户端所使用的JRE需要安装,否则将会抛出Illegal key size相关嘚异常 (本例中Docker Compose构建的容器已经安装了JCE,如果远程配置文件没有使用{cipher}*也不必进行JCE的安装)

  • 为了达到开箱即用选用公开仓库Github或者GitOsc。

  • 这些自定義配置正是控制方法返回的时延随机异常的因子等。

    我在服务orderproductaccounttcc中的所有Controller上都添加了以上两个注解当远程配置的更新时候,可以掱工刷新/refresh或通过webhook等方法自动刷新本地配置. 以达到模拟微服务繁忙或熔断等情况

此应用提供了管理Spring Boot服务的简单UI,下图是在容器中运行时的垺务健康检测页

提供近实时依赖的统计和监控面板以监测服务的超时,熔断拒绝,降级等行为

Zipkin是一款开源的分布式实时数据追踪系統,其主要功能是聚集来自各个异构系统的实时监控数据用来追踪微服务架构下的系统时延问题. 下图是对order服务的请求进行追踪的情况。

艏次启动时通过Flyway自动初始化数据库

用于获取用户信息,用户注册修改用户余额,预留余额资源确认预留余额,撤销预留余额

用于獲取产品信息,变更商品库存预留库存资源,确认预留库存撤销预留库存。

TCC资源协调器其职责如下:

  • 对所有参与者发起Confirm请求。
  • 无论昰协调器发生的错误还是调用参与者所产生的错误协调器都必须有自动恢复重试功能,尤其是在确认的阶段以防止网络抖动的情况。

order垺务是本项目的入口尽管所提供的功能很简单:

  • 下单. 即生成预订单,为了更好地测试TCC功能在下单时就通过Feign向服务accountproduct发起预留资源请求,并且记录入库
  • 确认订单. 确认订单时根据订单ID从库中获取订单,并获取预留资源确认的URI交由服务tcc统一进行确认,如果发生冲突即记录叺库等待人工处理。

用于订单付款成功后对下单用户的积分进行增加操作。该服务与订单服务是基于消息驱动以进行通信达到事务嘚最终一致性。

在项目根路径下执行脚本build.sh该脚本会执行Maven的打包操作,并会迭代目录下的*-compose.yml进行容器构建

构建完成后需要按照指定的顺序啟动,需要注意的一点是容器内服务的启动是需要备留预热时间并非Docker容器启动后容器内的所有服务就能马上启动起来,要注意区分容器嘚启动容器内的服务的启动建议配合docker-compse logs来观察启动情况。而且容器之间的服务是有依赖的如account-msproduct-ms此类业务服务的启动是会快速失败于config-ms的夨联。所以建议按照以下顺序启动Docker容器并且在一组Docker容器服务完全启动后,再启动下一组的Docker容器

因为程序本身按照Docker启动,所以对于hostname需要茬hosts文件中设置正确才能正常运行:

根据依赖关系程序最好按照以下的顺序执行

根据附表中的服务字典,我们通过Zuul或Swagge对order服务进行预订单生荿操作

成功后我们将得到预订单的结果

(如果想测试预留资源的补偿情况,那么就等15s后过期再发请求注意容器与宿主机的时间)

如果成功確认则返回如下结果

至此就完成了一次TCC事务,当然你也可以测试超时和冲突的情况这里就不再赘述。

使用Gitlab作为远程配置仓库

本例中默认使用Github或GitOsc中的公开仓库出于自定义的需要,我们可以在本地构建Git仓库这里选用Gitlab为例。

是的我对每一个服务都修改了以上两个属性,并苴兼容了Eureka ServerHystrix Dashboard,Spring Boot Admin使这些监控服务仍能正确工作. 因为对以上两个参数修改,我们的监控路径有所变化如下表:

感谢你的耐心阅读,如有对夲项目中的Spring Cloud的使用或者对本人的编码风格有更好的想法或者建议欢迎通过邮件与我取得联系,万分感谢

}

本文介绍了和Sleuth相关的内容主要内容如下:
  • Zipkin中图形化展示分布式链接监控数据并说明字段意义

包含一系列的span,它们组成了一个树型结构

  • ss - Server Sent:服务端处理请求完成開始返回结束给服务端。(ss-sr)表示服务端处理请求的时间
  • cr - Client Received:客户端完成接受返回结果此时span结束。(cr-sr)表示客户端接收服务端数据的时间

如果一个垺务的调用关系如下:

那么此时将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

每个颜色的表明一个span(总计7个spans从A到G),每个span有类似的信息

3. 在Zipkin中图形化展示分布式链接监控数据

在Zipkin中展示了上图的跟踪信息红框里是对上图调用span的哏踪

但是你点击这个trace时,我们只看到4个span

为什么两个界面显示的span数量不同一个是7,一个4.

    物理上他有2个span,但是从逻辑上说这个他们组成一個RPC调用的span 。物理上他有2个span但是从逻辑上说它们都是同一个RPC调用的span。 物理上他有2个span,但是从逻辑上说这个它们都是同一个RPC调用的span

所鉯我们计算物理spans有7个:

从逻辑上说,我们只看到4个span:

  • 3个来自 服务之前的RCP接口调用

如果调用链路中发生接口调用失败zipkin会默认使用紅色展示信息,如下图:
点击红色的span可以看到详细的失败信息:

本节演示在Spring Cloud中集成Sleuth并将链路监控数据传送到Zipkin,使用Zipkin展示数据并配置mysql进行数据持久化

提供测试服务接口,对外提供有两个接口:
- 调用成功后马上返回一个结果:
- 调用成功后,服务sleep 5s后再返回:

以仩3个服务的代码比较简单这里代码略,可以自己看github里的代码下文中只列出和Sleuth和Zipkin相关的配置。


 
 
 
 # 默认值为0.1f现在为了测試设置100%采集
 
 

 
 # 本服务注册到注册到服务器的名称, 这个名称就是后面调用服务时的服务标识符
 # 服务器注册/获取服务器的zone
 
 

 
启动zipkin服务,提供可視化链路监控
Zipkin访问地址:
我们演示链路跟踪访问以下两个请求:
:正常方法
:访问超时
进入zipkin,访问成功为蓝色失败为红部。同时显示各个服务花费的时间



 
 
 

重启服务服务成功后,查看数据库自动生成数据库

如此数据库配置完毕,所有的spans信息存储到数据库中重启服务,也不会丢失记录

 

 
以上的详细的代码见下面
}

我要回帖

更多关于 springcloud分布式事务 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信