微服务sleuth+zipkin---链路追踪+nacos配置中心

news2024/11/24 1:46:29

目录

1.分布式链路追踪

1.1.链路追踪Sleuth介绍

1.2.如何完成sleuth

1.3.zipkin服务器

2.配置中心

2.1.常见配置中心组件

2.2.微服务集群共享一个配置文件

2.2.1实时刷新--配置中心数据

2.2.2.手动写一个实时刷新的配置类 ----刷新配置文件

2.3.多个微服务公用一个配置


继 微服务Gateway网关 文章扩展的链路追踪


1.分布式链路追踪

在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心【区域】,也就意味着这种架构形式也会存在一些问题:

  • 如何快速发现问题?
  • 如何判断故障影响范围?
  • 如何梳理服务依赖?
  • 如何分析链路性能问题以及实时容量规划?

 

分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上IP、每个服务节点的请求状态200 500等等。

常见的链路追踪技术有下面这些:

  • cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。
  • zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单。
  • pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
  • skywalking 【未来企业会使用的多】
  • SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。 
  • Sleuth (日志记录每一条链路上的所有节点,以及这些节点所在的机器,和耗时。)log4j

SpringCloud 提供的分布式系统中链路追踪解决方案。

注意: sleuth+zipkin

 

1.1.链路追踪Sleuth介绍

SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。

Trace(一条完整链路--包含很多span(微服务接口))

由一组Trace Id(贯穿整个链路)相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId),同时在分布式系统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来,形成一条完整的请求链路。

Span

代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。通过SpanId的开始和结束时间戳,就能统计该span的调用时间,除此之外,我们还可以获取如事件的名称。请求信息等元数据。

Annotation

用它记录一段时间内的事件,内部使用的重要注释:

  • cs(Client Send)客户端发出请求,开始一个请求的命令
  • sr(Server Received)服务端接受到请求开始进行处理, sr-cs = 网络延迟(服务调用的时间)
  • ss(Server Send)服务端处理完毕准备发送到客户端,ss - sr = 服务器上的请求处理时间
  • cr(Client Reveived)客户端接受到服务端的响应,请求结束。 cr - cs = 请求的总时间

1.2.如何完成sleuth

记录微服务日志

(1) 微服务接入sleuth

父工程引入依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
    </dependencies>

运行日志:

 

调用链路中他们具有相同的traceId,每个模块都有自己的spanId. 这样sleuth会被这些相同traceId的spanId串联起来形成一个完整的调用链路。 如何想只要每个spanId的执行时间,可以通过日志的时间进行减操作。如果这样看非常麻烦。----有没有一个组件用来搜集sleuth生成的日志,并以图形化展示。---zipkin

1.3.zipkin服务器

ZIPKIN官网

第一件事:安装启动zipkin服务器

1.下载jar包 :资源以上传

2.运行

3. 浏览器访问zipkin服务器

http://localhost:9411/zipkin

 

第二件事: 指定微服务所用的zipkin服务器地址

1.需要在微服务中引入zipkin依赖

父工程引入依赖:

     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-zipkin</artifactId>
     </dependency>

2.在每个微服务中指定zipkin服务端的地址

在配置文件中添加:

#指定zipkin服务器的地址
spring.zipkin.base-url=http://localhost:9411/

缺点:当zipkin重启后,链路也会丢失。 默认存在在内存中

解决: 存储到数据库中

保证mysql数据库允许远程连接:

CREATE TABLE IF NOT EXISTS zipkin_spans (
 `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', 
`trace_id` BIGINT NOT NULL, 
`id` BIGINT NOT NULL, 
`name` VARCHAR(255) NOT NULL, 
`parent_id` BIGINT, 
`debug` BIT(1), 
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query' )
 ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate'; 
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations'; 
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
 ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
 ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
 `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', 
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', 
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
 `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1', 
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB', 
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation', 
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
 `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null', 
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address', 
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null' )
 ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate'; 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans'; 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds'; 
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';

ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces';
 ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces'; 
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies ( 
`day` DATE NOT NULL, 
`parent` VARCHAR(255) NOT NULL, 
`child` VARCHAR(255) NOT NULL,
 `call_count` BIGINT ) 
ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; 
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

运行

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456789

 

2.配置中心

思考:

  • (1)每个微服务可能要搭建n台集群。这个集群中的微服务配置都是一样。如果需要修改服务的配置,就需要每个都要修改。
  • (2)各个微服务他们可能拥有相同的配置。

思路: 交给一个组件来统一管理。----配置中心

2.1.常见配置中心组件

Apollo

Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料 也写的很详细。----很好用。

Disconf

Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。

SpringCloud Config

这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git<git没学>。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。

Nacos

这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心。

我们使用nacos作为配置中心。安装nacos服务端 不需要讲。

2.2.微服务集群共享一个配置文件

集群生产环境下一定是部署到不同的服务器上。

(1)需要在nacos配置中心创建一个配置文件

名称必须为: 微服务名.后缀

 

 

 (2)微服务中使用nacos配置中的配置文件

父工程引入依赖:

 <!--引入nacos配置中心的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

(3)必须使用bootstrap.properties---用来加载外部配置文件内容

#为微服务定义名称----必须和配置中心的id相同
spring.application.name=qy165-product
#指定配置中心的地址
spring.cloud.nacos.config.server-addr=localhost:8848
#指定配置文件所在的组  默认DEFAULT_GROUP
spring.cloud.nacos.config.group=aaa
#指定配置文件的后缀名  默认properties
#spring.cloud.nacos.config.file-extension=yml

修改ProductController

测试

 

 

2.2.1实时刷新--配置中心数据

 

2.2.2.手动写一个实时刷新的配置类 ----刷新配置文件

 

 

2.3.多个微服务公用一个配置

(1)把上面两个配置类公共内容提取到一个公共配置文件中

 

(2)让微服务引入公共文件

 

#引用额外公共的配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=gg.properties
spring.cloud.nacos.config.extension-configs[0].group=aaa
spring.cloud.nacos.config.extension-configs[0].refresh=true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端是不是快没了?

前言 可能是近些年前端的就业行情不好让你产生了这样的错觉&#xff1f;首先明确一点是我们不能拿市场就业、招聘的情况来判断一个行业的存亡&#xff0c;前端在目前仍然是有着比较大的需求&#xff0c;包括是在网页端、移动端、小程序方面&#xff0c;企业对于这些方面的需求…

msvcp140.dll丢失怎么弄?分享几个最靠谱的解决方法

当你在运行某个程序或游戏时&#xff0c;突然收到一个错误提示&#xff0c;提示你的计算机缺少msvcp140.dll文件。这意味着你的计算机中缺少一个重要的系统文件&#xff0c;可能会导致程序无法正常运行。下面是一些详细的解决方法&#xff0c;帮助你解决msvcp140.dll丢失的问题…

【力扣算法15】之 17. 电话号码的字母组合 python

文章目录 问题描述示例1示例2示例 3提示 思路分析代码分析完整代码详细分析运行效果截图调用示例运行结果 完结 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键…

获取微信服务器IP地址

获取微信服务器IP地址 如果公众号基于安全等考虑&#xff0c;需要获知微信服务器的IP地址列表&#xff0c;以便进行相关限制&#xff0c;可以通过该接口获得微信服务器IP地址列表或者IP网段信息。 由于出口IP及入口IP可能存在变动&#xff0c;建议用户每天请求接口1次&#x…

鲸鱼优化算法MATLAB代码

论文 Seyedali Mirjalili,Andrew Lewis. The Whale Optimization Algorithm[J]. Advances in Engineering Software,2016,95.func_plot.m % This function draw the benchmark functionsfunction func_plot(func_name)[lb,ub,dim,fobj]Get_Functions_details(func_name);switch…

Dcat-admin使用 Alpine 双向数据绑定

介绍 Alpine.js 这东西真的轻量级&#xff0c;和vue相似&#xff0c;和 livewire 同一个作者&#xff0c;推荐大家使用&#xff0c;可以平替jquery 效果 实现 在 bootstrap.php 引入js Admin::headerJs([https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/alpinejs/3.9.0/…

【Go】Go语言开发0基础7天入门 - 笔记

前言 课程来源&#xff1a;【路飞学城】-黑金年卡VIP课程 课程名称&#xff1a;GO语言开发0基础7天入门 讲师&#xff1a;【前汽车之家架构师】Wusir-银角大王 官网&#xff1a;点击进入 一、Why choose the go language 集python简洁 C语言性能 详情点击 二、学语言阶段…

Java基础之复习(下)

目录 前言 一.泛型的认知 &#x1f496;泛型类 &#x1f496;泛型数组 &#x1f496;泛型的上界 &#x1f496;泛型的方法 二.内部类讲解 三.了解异常 四.面向对象编程 &#x1f496;包 &#x1f496;继承 &#x1f496;多态 &#x1f496;抽象类和接口 &#x1f38…

OWASP TOP10 大主流漏洞原理和防范措施,易理解版

章节目录 回顾2017年和2021年OWASP主流漏洞都有哪些 一、访问控制崩溃 表现形式 防范 二、敏感数据暴露 防范 三、注入 sql注入分类 SQL盲注 SQL注入产生点 SQL注入的思路 盲注测试的思路 防范SQL 四、不安全的设计 产生的原因 业务漏洞的显现体现 五、安全配…

【C语言14】C语言实现顺序表(这可能是CSDN有史以来讲解最详细的顺序表)

顺序表 什么是顺序表顺序表的接口创建及使用1.创建2.初始化3.扩容4.尾插5.打印6.头插7.尾删8.头删9.查找10.删除任意位置11.插入任意位置12.修改 什么是顺序表 官方定义&#xff1a;顺序表是在计算机内存中以数组的形式保存的线性表&#xff0c;线性表的顺序存储是指用一组地址…

【运维小知识】(一)——centos系统安装(小白入门级)

目录 1.制作系统U盘 2.安装centos系统 3.系统配置 3.1【语言】配置​编辑 3.2【软件选择】配置 3.3【安装位置】配置 3.4【主机名、root密码、网络】配置 1.制作系统U盘 首先下载软件ventoy&#xff0c;制作系统U盘&#xff0c;买个新U盘。先在笔记本电脑安装ventoy软件&a…

【产品设计】如何从0到1做一款微信服务号

微信小程序、服务号作为企业用于在微信内提供服务的工具&#xff0c;已经越来越被广泛使用&#xff0c;对于选择使用哪一种方式来进行开发&#xff0c;在这里表述了我的看法。 前段时间&#xff0c;我们公司准备做一款关于兼职老师招聘的小程序&#xff0c;后来由于种种原因&am…

Flutter 小技巧之滑动控件即将“抛弃” shrinkWrap 属性

相信对于 Flutter 开发的大家来说&#xff0c; ListView 的 shrinkWrap 配置都不会陌生&#xff0c;如下图所示&#xff0c;每当遇到类似的 unbounded error 的时候&#xff0c;总会有第一反应就是给 ListView 加上 shrinkWrap: true 就可以解决问题&#xff0c;那为什么现在会…

Linux进程控制(一)---进程创建和终止(写时拷贝,exit与_exit等)

目录 进程创建 fork()函数 子进程如何继承父进程的数据 1.创建时拷贝分离 2.写时拷贝★ 进程终止 进程终止时&#xff0c;操作系统做了什么&#xff1f; 进程终止的常见方式 代码运行完毕&#xff0c;结果正确 退出码★ 代码运行完毕&#xff0c;结果不正确 代码异…

Redis 读写分离 使用redisTemplate执行lua脚本时,报错处理

项目框架说明 项目配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.4</version></parent>....<dependency><groupId>org.springfra…

Mac苹果装机工作必备软件推荐,十大效率神器让你的 Mac 雄起

Mac笔记本固然好用&#xff0c;但还是会有一些使用中的痛点&#xff0c;下面给大家推荐10款最常用的提高mac使用效率的软件 一、Magnet Pro - 窗口大小布局位置控制 这款软件可以让你的Mac像Windows一样&#xff0c;通过拖动窗口实现窗口最大化、左右半屏、上下半屏、1/4窗口…

Ubuntu18.04下的labelImg使用教程

Ubuntu18.04下的labelImg使用教程 1、安装 # 下载labelImg git clone https://github.com/Ruolingdeng/labelImg.git# 配置环境 sudo apt-get install pyqt5-dev-tools sudo pip3 install -r requirements/requirements-linux-python3.txt make qt5py3# 运行 python3 labelImg.…

mysql 1 -- 数据库介绍、mysql 安装及设置

Linux 安装 mysql 1、数据库&#xff08;mysql&#xff09; 数据文件 - 数据库过了系统 2、c/s mysql 服务器 mysql 客户端 ip port : 3306 3、关系型 于 非关系型数据库&#xff08;nosql&#xff09; nosql可以解决一些关系型数据库所无法实现的场景引用。 一、数据库介绍 …

什么是 Elasticsearch 索引?

作者&#xff1a;David Brimley 索引这个术语在科技界已经被用满了。 如果你问大多数开发人员什么是索引&#xff0c;他们可能会告诉你索引通常指的是关系数据库 (RDBMS) 中与表关联的数据结构&#xff0c;它提高了数据检索操作的速度。 但什么是 Elasticsearch 索引&#xff…

Spark(29):Spark内存管理

目录 0. 相关文章链接 1. 堆内和堆外内存规划 1.1. 堆内内存 1.2. 堆外内存 2. 内存空间分配 2.1. 静态内存管理 2.2. 统一内存管理 3. 存储内存管理 3.1. RDD 的持久化机制 3.2. RDD的缓存过程 3.3. 淘汰与落盘 4. 执行内存管理 4.1. Shuffle Write 4.2. Shuffl…