当我们构建一个微服务体系结构,并且服务的数量不断增加时,我们面临着在整个系统中调试和跟踪请求的问题。当用户在请求中出现500错误时,会发生什么情况?是什么部门不正确地处理了他的请求?所有这些问题都可以通过分布式跟踪系统来解决。我们走吧春云探测举个例子。

春云探测是如何工作的

为了通过分布式系统跟踪请求,引入了TraceID和SpanID的概念。当请求进入我们的系统并在整个路径中保持不变时,将生成TraceID。当请求从一个服务传递到另一个服务时,SpanID会发生更改。如果有必要,可以在一个服务中生成新的跨度,以区分业务流程。

在HTTP报头中,跟踪和跨系统之间传递。其中一个标准是B3传播,它描述分布式跟踪系统的头格式。上下文通过窗体的标头从一个服务传递到另一个服务。X-B3-*。在接收到具有此类头的请求之后,我们可以恢复跟踪上下文并继续执行流程。

Sluth的优点是它使用拦截器自动向所有请求(例如RestTemplate或假象)注入必要的标头。要使其自动工作,需要将HTTP客户端声明为Springbean。

让我们考虑由3个微服务组成的以下体系结构:

  1. 用户注册服务
  2. 负责忠诚度计划的服务
  3. 向用户发送通知的服务

在这个示例中,让我们看看如何将SpringCloudSluth连接到SpringBoot应用程序。我们将使用假名作为HTTP客户端。在创建了一个Gradle项目之后,我们将向每个服务添加依赖项:sluth,这个库用于将数据发送到齐普金并冒充客户,使我们可以向其他服务提出要求。

用户服务

Build.gradle:

ext {set('springCloudVersion', "2021.0.0")
}dependencies {implementation 'org.springframework.boot:spring-boot-starter-web'implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'implementation 'org.springframework.cloud:spring-cloud-sleuth-zipkin'implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'compileOnly 'org.projectlombok:lombok:1.18.22'annotationProcessor 'org.projectlombok:lombok:1.18.22'testCompileOnly 'org.projectlombok:lombok:1.18.22'testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
}dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"}
}

我们需要启用伪装功能:

@SpringBootApplication
@EnableFeignClients
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}

当用户注册时,用户服务将形成HTTP请求到奖励服务,向用户发送通知,并返回用户的标识符和奖励程序。让我们编写一个控制器:

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {private final BonusClient bonusClient;private final NotificationClient notificationClient;@PostMapping("/register")RegisterResponse register(@RequestBody RegisterRequest registerRequest) {log.info("User registration request received");String userId = UUID.randomUUID().toString(); // generate uniq identifier of userString bonusId = bonusClient.register(); // register in loyalty programnotificationClient.send(new NotificationRequest(userId, "email")); // send notification to userreturn new RegisterResponse(userId, bonusId); //return response to user}
}

使用假装,让我们描述BonusClient和NotificationClient:

@FeignClient(name = "bonus", url = "http://localhost:8081/bonus")
public interface BonusClient {@RequestMapping(value = "/register", method = RequestMethod.POST)String register();
}@FeignClient(name = "notification", url = "http://localhost:8082/notification")
public interface NotificationClient {@PostMapping("/send")String send(@RequestBody NotificationRequest notificationRequest);
}

添加应用程序的标识符,以供Sluth使用:

spring:application:name: user-service

让我们以同样的方式实现其余的服务。项目依赖将是相同的。

奖金服务

为了简单起见,只编写一个控制器:

@RestController
@RequestMapping("/bonus")
@Slf4j
public class BonusController {@PostMapping("/register")@SneakyThrowsString register() {log.info("Bonus program registration request received");//e.g. load from DBThread.sleep(new Random().nextInt(100, 1000));return UUID.randomUUID().toString();}
}

在这里,我们将接收请求,模拟延迟并使用生成的标识符进行响应。类似地,将应用程序名称添加到application.yml:

spring:application:name: bonus-serviceserver:port: 8081

我们还指定了一个不同的端口,这样当我们在同一个实例上运行应用程序时,我们的应用程序就不会彼此冲突。

通知服务

让我们让通知服务变得更复杂一些。它将通过模拟对电子邮件网关的调用来接收消息并调用外部服务。

@RestController
@RequiredArgsConstructor
@RequestMapping("/notification")
@Slf4j
public class NotificationController {private final ExternalEmailGateway gateway;@PostMapping("/send")@SneakyThrowsString send(@RequestBody NotificationRequest notificationRequest) {log.info("Notification request received");//e.g. load from DB & logicThread.sleep(new Random().nextInt(100, 1000));gateway.sendEmail(1);return "ok";}
}
@FeignClient(name = "externalEmailGateway", url = "https://httpbin.org")
public interface ExternalEmailGateway {@GetMapping("/delay/{delay}")String sendEmail(@PathVariable int delay);
}

我们会打电话给你https://httpbin.org来模拟延迟响应。

申请:

spring:application:name: notification-serviceserver:port: 8082

OpenZipkin

默认情况下,我们的服务将尝试将跟踪消息发送到localhost:9411。如果OpenZipkin运行在不同的地址,则需要在每个服务的设置中指定它:

spring:zipkin:base-url: http://<host>:<port>

使用Docker运行Zipkin:

docker run -d -p 9411:9411 openzipkin/zipkin

让我们启动所有应用程序并执行用户注册请求:

./gradlew user-service:bootRun
./gradlew bonus-service:bootRun
./gradlew notification-service:bootRun
curl -L -X POST 'http://localhost:8080/user/register' \
-H 'Content-Type: application/json' \
--data-raw '{}'{"userId":"b5d04d9a-0447-4cf5-9002-b10841181e9f","bonusProgramId":"bda336f6-f5ab-4fc9-97b9-58df741d1de2"}

我们现在可以通过localhost:9411

在这里,您可以看到请求的总时间以及在每个请求上花费了多少时间。如果其中一个服务返回错误,我们将看到以下内容:

另外,如果您查看日志,您将在方括号中看到带有服务名称、TraceID和SpanID的记录。正如您在一个请求中所看到的,TraceID保持不变,SpanID从一个服务更改到另一个服务:

2022-02-16 08:48:58.617  INFO [user-service,15f8d0cc9c8c9e4a,15f8d0cc9c8c9e4a] 7028 --- [nio-8080-exec-4] c.e.user.controller.UserController       : User registration request received
...
2022-02-16 08:48:58.619  INFO [bonus-service,15f8d0cc9c8c9e4a,d8d79fe594bc4522] 12664 --- [nio-8081-exec-3] c.e.bonus.controller.BonusController     : Bonus program registration request received
...
2022-02-16 08:48:59.366  INFO [notification-service,15f8d0cc9c8c9e4a,3d31b3eb8062cbe0] 25796 --- [nio-8082-exec-3] c.e.n.controller.NotificationController  : Notification request received

结语

分布式跟踪系统对于微服务体系结构是必不可少的,并且允许您分析系统中的问题区域。SpringCloudSluth使这一切变得尽可能简单,几乎没有添加任何代码,Zipkin是一个非常容易使用的分析工具。

最后,有兴趣想要学习相关资料的朋友点赞三连+关注后私信我

分布式跟踪系统(SpringCloudSluth+OpenZipkin)相关推荐

  1. 大规模分布式跟踪系统的理论

    概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了几千台服务器 ...

  2. 分布式 集群 系统组件架构_分布式跟踪系统的四个组件如何一起工作

    分布式 集群 系统组件架构 十年前,基本上只有认真思考分布式跟踪的人是学者和少数大型互联网公司. 如今,对于任何采用微服务的组织来说,它已经变成了赌注. 基本原理是公认的:微服务以令人惊讶且通常是惊人 ...

  3. java天眼培训_Java天眼大型分布式跟踪系统 附带源码_IT教程网

    资源名称:Java天眼大型分布式跟踪系统 附带源码 教程内容: APP: 接入skyeye-client的系统会通过kafkaAppender向kafka写入日志 es-indexer-group: ...

  4. 系统设计之----分布式跟踪系统

    一.设计依据 二.设计思路 1.核心数据模型字段 2.参数透传说明 3.日志格式(举例子) 4.链路性能指标(处理时间) 三.先决条件 1.Web Servlet Filter 调用链开始 2.Dub ...

  5. 分布式跟踪系统 java_Java天眼大型分布式跟踪系统 附带源码

    资源名称:Java天眼大型分布式跟踪系统 附带源码 教程内容: APP: 接入skyeye-client的系统会通过kafkaAppender向kafka写入日志 es-indexer-group: ...

  6. Dapper--Google生产环境下的分布式跟踪系统

    Dapper--Google生产环境下的分布式跟踪系统 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发 ...

  7. 分布式跟踪系统(一):Zipkin的背景和设计

    原文链接: https://blog.csdn.net/manzhizhen/article/details/52811600 2010年谷歌发表了其内部使用的分布式跟踪系统Dapper的论文(htt ...

  8. Java分布式跟踪系统Zipkin(二):Brave源码分析-Tracer和Span

    所有博文均在个人独立博客http://blog.mozhu.org首发,欢迎访问! Brave是Java版的Zipkin客户端,它将收集的跟踪信息,以Span的形式上报给Zipkin系统. (Zipk ...

  9. JAVA天眼大型分布式跟踪系统

    目录 ├─源码SkyEye-master.zip ├─第1课-项目架构与技术点讲解.mp4 ├─第1课-项目架构与技术点讲解.pdf ├─第2课-日志实时采集.mp4 ├─第2课-日志实时采集.pdf ...

最新文章

  1. WCF基础知识问与答
  2. 20135320赵瀚青LINUX第十八章读书笔记
  3. Ubuntu下默认使用dash而非bash
  4. spring启动过程之源码跟踪(上)--spring Debug
  5. Mariadb安装及主从搭建,基于centos7
  6. python 如何匹配一撇字符_python,yaml如何解析包含撇号的字符串
  7. Element-UI-的登录页面_密码框---Element-UI工作笔记004
  8. hive hsql 漏斗模型_数据分析之SQL:常用模型
  9. 编程的一些经历和感想
  10. stm32中断优先级_STM的中断系统
  11. python用程序说爱你_用python写一个聊天小程序!和女朋友的专属聊天工具!
  12. [原]Linux 命令行浏览器
  13. Yii2中使用自定义的数据库
  14. vue运用JsBarcode生成一维码
  15. Material Dialogs的使用
  16. xkcd目录_使用随机XKCD漫画作为您的桌面墙纸
  17. 制作的excel表格如何放到微信公众平台文章中?
  18. 【建议收藏】6款高质量Windows软件,好用到无法拒绝
  19. Android Material Design动画 Curved motion | 曲线运动
  20. 智能相机与工业相机_使用智能手机相机后如何移动到专用相机

热门文章

  1. Percona XtraDB Cluster(PXC)——架构原理
  2. 利用百度(或者360搜索等)的快照解决公司网络限制
  3. 写给后端开发看的安卓入门
  4. Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.1.1:generate
  5. GPRS模块 测试项目
  6. H265(HEVC)视频下载 测试专用
  7. iTop-4412 裸机程序(十三)- 串口初始化
  8. seo采集,网站seo免费采集,seo采集方法技巧
  9. WIN键 锁定、解锁
  10. Python3网络爬虫requests库保存登录cookies无法显示登录后的结果