分布式跟踪系统(SpringCloudSluth+OpenZipkin)
当我们构建一个微服务体系结构,并且服务的数量不断增加时,我们面临着在整个系统中调试和跟踪请求的问题。当用户在请求中出现500错误时,会发生什么情况?是什么部门不正确地处理了他的请求?所有这些问题都可以通过分布式跟踪系统来解决。我们走吧春云探测举个例子。
春云探测是如何工作的
为了通过分布式系统跟踪请求,引入了TraceID和SpanID的概念。当请求进入我们的系统并在整个路径中保持不变时,将生成TraceID。当请求从一个服务传递到另一个服务时,SpanID会发生更改。如果有必要,可以在一个服务中生成新的跨度,以区分业务流程。
在HTTP报头中,跟踪和跨系统之间传递。其中一个标准是B3传播,它描述分布式跟踪系统的头格式。上下文通过窗体的标头从一个服务传递到另一个服务。X-B3-*
。在接收到具有此类头的请求之后,我们可以恢复跟踪上下文并继续执行流程。
Sluth的优点是它使用拦截器自动向所有请求(例如RestTemplate或假象)注入必要的标头。要使其自动工作,需要将HTTP客户端声明为Springbean。
让我们考虑由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)相关推荐
- 大规模分布式跟踪系统的理论
概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发.可能使用不同的编程语言来实现.有可能布在了几千台服务器 ...
- 分布式 集群 系统组件架构_分布式跟踪系统的四个组件如何一起工作
分布式 集群 系统组件架构 十年前,基本上只有认真思考分布式跟踪的人是学者和少数大型互联网公司. 如今,对于任何采用微服务的组织来说,它已经变成了赌注. 基本原理是公认的:微服务以令人惊讶且通常是惊人 ...
- java天眼培训_Java天眼大型分布式跟踪系统 附带源码_IT教程网
资源名称:Java天眼大型分布式跟踪系统 附带源码 教程内容: APP: 接入skyeye-client的系统会通过kafkaAppender向kafka写入日志 es-indexer-group: ...
- 系统设计之----分布式跟踪系统
一.设计依据 二.设计思路 1.核心数据模型字段 2.参数透传说明 3.日志格式(举例子) 4.链路性能指标(处理时间) 三.先决条件 1.Web Servlet Filter 调用链开始 2.Dub ...
- 分布式跟踪系统 java_Java天眼大型分布式跟踪系统 附带源码
资源名称:Java天眼大型分布式跟踪系统 附带源码 教程内容: APP: 接入skyeye-client的系统会通过kafkaAppender向kafka写入日志 es-indexer-group: ...
- Dapper--Google生产环境下的分布式跟踪系统
Dapper--Google生产环境下的分布式跟踪系统 概述 当代的互联网的服务,通常都是用复杂的.大规模分布式集群来实现的.互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发 ...
- 分布式跟踪系统(一):Zipkin的背景和设计
原文链接: https://blog.csdn.net/manzhizhen/article/details/52811600 2010年谷歌发表了其内部使用的分布式跟踪系统Dapper的论文(htt ...
- Java分布式跟踪系统Zipkin(二):Brave源码分析-Tracer和Span
所有博文均在个人独立博客http://blog.mozhu.org首发,欢迎访问! Brave是Java版的Zipkin客户端,它将收集的跟踪信息,以Span的形式上报给Zipkin系统. (Zipk ...
- JAVA天眼大型分布式跟踪系统
目录 ├─源码SkyEye-master.zip ├─第1课-项目架构与技术点讲解.mp4 ├─第1课-项目架构与技术点讲解.pdf ├─第2课-日志实时采集.mp4 ├─第2课-日志实时采集.pdf ...
最新文章
- WCF基础知识问与答
- 20135320赵瀚青LINUX第十八章读书笔记
- Ubuntu下默认使用dash而非bash
- spring启动过程之源码跟踪(上)--spring Debug
- Mariadb安装及主从搭建,基于centos7
- python 如何匹配一撇字符_python,yaml如何解析包含撇号的字符串
- Element-UI-的登录页面_密码框---Element-UI工作笔记004
- hive hsql 漏斗模型_数据分析之SQL:常用模型
- 编程的一些经历和感想
- stm32中断优先级_STM的中断系统
- python用程序说爱你_用python写一个聊天小程序!和女朋友的专属聊天工具!
- [原]Linux 命令行浏览器
- Yii2中使用自定义的数据库
- vue运用JsBarcode生成一维码
- Material Dialogs的使用
- xkcd目录_使用随机XKCD漫画作为您的桌面墙纸
- 制作的excel表格如何放到微信公众平台文章中?
- 【建议收藏】6款高质量Windows软件,好用到无法拒绝
- Android Material Design动画 Curved motion | 曲线运动
- 智能相机与工业相机_使用智能手机相机后如何移动到专用相机
热门文章
- Percona XtraDB Cluster(PXC)——架构原理
- 利用百度(或者360搜索等)的快照解决公司网络限制
- 写给后端开发看的安卓入门
- Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.1.1:generate
- GPRS模块 测试项目
- H265(HEVC)视频下载 测试专用
- iTop-4412 裸机程序(十三)- 串口初始化
- seo采集,网站seo免费采集,seo采集方法技巧
- WIN键 锁定、解锁
- Python3网络爬虫requests库保存登录cookies无法显示登录后的结果