分布式之SleuthZipkin

Sleuth&Zipkin

学习当前课程,比必须要先掌握SpringCloud的基本应用(Nacos,Feign调用)

对Docker有一定的了解,知道docker-compose.yml如何启动一个容器

RabbitMQ,Elasticsearch有一定了解。

而且学习每一个技术前,一定要先知道有什么问题是现在无法解决的,通过学习的这个技术来解决当前产生的问题

一、Sleuth&Zipkin介绍

现存问题是什么?

image.png

这个问题需要监控整个请求的微服务调用链过程,为了可以监控网上可以使用的工具很多:

  • Sleuth&Zipkin:SpringCloud中的一个组件,专门链路追踪
  • SkyWalking:Apache组织下的一个开源框架,并且是个顶级项目
  • 阿里鹰眼:没玩过~~
  • 美团Cat:没玩过~~

Sleuth&Zipkin对比SkyWalking

  • 相同点,都是链路追踪框架
  • Sleuth是收集信息,Zipkin是图形化展示。 SkyWalking一锅端~~
  • SkyWalking的报表展示比Sleuth&Zipkin更丰富。
  • SkyWalking支持监控类的手段,但是Sleuth&Zipkin不支持,一般要配合SpringBootAdmin做单独监控
  • SkyWalking支持阈值报警,但是Sleuth&Zipkin不支持
  • Sleuth&Zipkin文档丰富,网上解决问题的方式或者博客很多,但是SkyWalking相对差一内内。

二、搭建环境

image.png

第一步:安装Nacos

image.png

第二步:准备两台服务

  • 准备聚合工程,

  • 管理好各个依赖的版本:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

  • Alibaba依赖:https://spring.io/projects/spring-cloud-alibaba

  • Cloud依赖:https://spring.io/projects/spring-cloud

  • 准备两个服务

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
    </dependencies>
    

    添加好启动类和各个配置

    @SpringBootApplication
    @EnableDiscoveryClient
    #-----------------------------
    server:port: 端口spring:application:name: 服务名cloud:nacos:discovery:server-addr: 192.168.11.32:8848
    

中间处理了几个小BUG~~~

三、Sleuth入门操作

Sleuth是要在服务内部收集信息一个框架。将收集的信息交给Zipkin做图形化界面展示

官网滴干活:

  • 导入依赖:

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    
  • 编写配置

    logging:level:org.springframework.web.servlet.DispatcherServlet: DEBUG
    

再次访问consumer到provider后,可以看到日志中多了一些信息

  • consumer:[consumer, db108ebea9c15ea1, db108ebea9c15ea1, true]
  • provider: [provider, db108ebea9c15ea1, 847d0be306bc1395, true]

[服务名,总链路ID,子链路ID,信息发送其他系统了]

可以看到整体是一个链路信息。

四、Zipkin搭建及操作

前面Sleuth已经收集到信息了。

Zipkin需要单独安装,本身也是一个Java编写的Web项目。

官网滴干活:https://zipkin.io/

采用docker-compose.yml文件的方式去安装Zipkin

version: "3.1"
services:zipkin:image: openzipkin/zipkinrestart: alwayscontainer_name: zipkinports:- 9411:9411

docker-compose up -d启动即可

查看到图形化界面image.png

让Sleuth收集的日志信息发送到Zipkin上

需要让服务做导入一些依赖并且写入一些配置

  • 导入依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
    
  • 编写配置

    spring:sleuth:sampler:probability: 100  # 设置Sleuth手机信息的百分比zipkin:sender:type: web    # 信息发送方式base-url: http://192.168.11.32:9411/     # Zipkin地址
    

访问几次请求链路后,查看Zipkinimage.png

五、RabbitMQ方式发送信息

如果日志量足够大,如果每次都让服务以HTTP的方式传输给Zipkin,成本有点高。

所以可以让服务将Sleuth收集的日志推给MQ,让Zipkin去监控MQ的信息,通过MQ的队列获取到服务的信息

如果日志量足够大,其实一般推荐使用Kafka。

准备RabbitMQ服务。

version: "3.1"
services:rabbitmq:image: daocloud.io/library/rabbitmq:3.8.5container_name: rabbitmqrestart: alwaysvolumes:- ./data/:/var/lib/rabbitmq/ports:- 5672:5672- 15672:15672

第一件事:需要服务将消息扔到RabbitMQ。

  • 导入依赖

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    
  • 编写配置

    spring:zipkin:sender:type: rabbitrabbitmq:host: 192.168.11.32port: 5672username: guestpassword: guestvirtual-host: /
    

第二件事:需要Zipkin从RabbitMQ中获取消息。

https://github.com/openzipkin/zipkin/tree/master/zipkin-collector/rabbitmq

修改docker-compose.yml文件,并重新构建容器

version: "3.1"
services:zipkin:image: openzipkin/zipkinrestart: alwayscontainer_name: zipkinports:- 9411:9411environment:- RABBIT_ADDRESSES=192.168.11.32:5672- RABBIT_USER=guest

六、Elasticsearch持久化

Zipkin容器重启之后,存储的链路信息全丢了。

刚刚发现Zipkin重启后,之前的链路信息全丢了,默认应当是内存存储。

为了可以保留一定Zipkin的链路信息,可以让Zipkin将链路信息持久化。

持久化操作支持很多种DB、

因为采用了最新的Zipkin:latest,那么ES就需要7.x版本。

Docker安装7.6.2的es

  • 准备yml文件

    version: "3.1"
    services:elasticsearch:image: daocloud.io/library/elasticsearch:7.6.2restart: alwayscontainer_name: elasticsearchports:- 9200:9200environment:- "discovery.type=single-node"- "ES_JAVA_OPTS=-Xms256m -Xmx256m"volumes:- ./data:/usr/share/elasticsearch/data- ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ymlkibana:image: daocloud.io/library/kibana:7.6.2restart: alwayscontainer_name: kibanaports:- 5601:5601environment:# 记得改IP- elasticsearch_url=http://192.168.11.32:9200depends_on:- elasticsearchvolumes:- ./config/kibana.yml:/usr/share/kibana/config/kibana.yml
    
  • 准备数据卷的映射

    • elasticsearch.yml

      cluster.name: "docker-cluster"
      network.host: 0.0.0.0
      
    • kibana.yml

      server.name: kibana
      server.host: "0"
      elasticsearch.hosts: [ "http://elasticsearch:9200" ]
      xpack.monitoring.ui.container.elasticsearch.enabled: true
      

准备Zipkin的配置:https://github.com/openzipkin/zipkin/tree/master/zipkin-server

修改docker-compose.yml

version: "3.1"
services:zipkin:image: openzipkin/zipkinrestart: alwayscontainer_name: zipkinports:- 9411:9411environment:- STORAGE_TYPE=elasticsearch- ES_HOSTS=http://192.168.11.32:9200

做链路跟踪的时候 说超时了 让把优化 优化思路是单线程改成多线程 请问怎么改?是把原来的代码写进run方法 然后把这样一个线程放入线程池么?是这个思路么?像这种优化思路 老师能否分享下?

image.png

SpringBootAdmin

一、Actuator介绍

SpringBoot提供的,是一个指标监控的组件。

Actuator的官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/html/production-ready-features.html#production-ready

在一个微服务架构层面下,如果某一个服务出现了问题,导致出现了一些不可控的情况。需要快速的定位出故障的服务,从而解决问题。

二、Actuator快速入门

导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

展示全部对外暴露的端点(EndPoint)

management:endpoints:web:exposure:include: '*'

启动服务连接Nacos的时候,发现之前能跑的服务,现在连接Nacos出问题。

  • Nacos服务端有木有问题……
  • 网络……
  • 版本问题(官网给定的版本貌似有坑)

查看Actuator提供的端点信息,可以查看到服务的很多信息

image.png

但是,这种JSON的展示形式,很难排查一些问题,此时需要一个更友好的图形化界面做展示

三、SpringBootAdmin介绍

Admin就是Actuator的一个图形化界面,是基于vue写的。

本质上就是Actuator的接口响应数据做图形化的展示,方便开发人员和运维人员监控信息。

SpringBootAdmin并不是Spring官方提供的,是一个github的开源项目。

SpringBootAdmin的Github地址:https://github.com/codecentric/spring-boot-admin

官网文档:https://codecentric.github.io/spring-boot-admin/2.5.1/#getting-started

在使用SpringBootAdmin时,尽量选择大版本和SpringBoot类似的。

四、SpringBootAdmin快速入门

使用方式和Eureka很像,需要先单独的搭建SpringBootAdminServer端,让各个微服务连接上AdminServer即可。

4.1 搭建AdminServer

创建项目、导入依赖、添加启动类、编写配置

<dependencies><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
@SpringBootApplication
@EnableAdminServer
public class AdminServerStarterApp {public static void main(String[] args) {SpringApplication.run(AdminServerStarterApp.class,args);}
}

image.png

4.2 AdminClient注册

导入依赖、编写配置

<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.3.1</version>
</dependency>
spring:boot:admin:client:url: http://localhost:9000

image.png

image.png

五、SpringBootAdmin安全配置

所有的微服务对外暴露了actuator的端点,这样会不会不安全?

微服务不需要暴露公网IP,服务内部通过内网去访问即可,所以Actuator端点是否安全,其实无所谓。

SpringBootAdmin需要运维人员或者开发人员放假了,回家了等等,可能需要基于外网去访问。

考虑到Admin图形化界面的安全问题。

为了保证SpringBootAdminServer的安全,需要基于官方文档提供的内容去实现

导入依赖、编写配置类

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration(proxyBeanMethods = false)
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {private final AdminServerProperties adminServer;public SecuritySecureConfig(AdminServerProperties adminServer) {this.adminServer = adminServer;}@Overrideprotected void configure(HttpSecurity http) throws Exception {SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();successHandler.setTargetUrlParameter("redirectTo");successHandler.setDefaultTargetUrl(this.adminServer.path("/"));http.authorizeRequests((authorizeRequests) -> authorizeRequests.antMatchers(this.adminServer.path("/assets/**")).permitAll().antMatchers(this.adminServer.path("/login")).permitAll().anyRequest().authenticated()).formLogin((formLogin) -> formLogin.loginPage(this.adminServer.path("/login")).successHandler(successHandler).and()).logout((logout) -> logout.logoutUrl(this.adminServer.path("/logout"))).httpBasic(Customizer.withDefaults()).csrf((csrf) -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).ignoringRequestMatchers(new AntPathRequestMatcher(this.adminServer.path("/instances"),HttpMethod.POST.toString()),new AntPathRequestMatcher(this.adminServer.path("/instances/*"),HttpMethod.DELETE.toString()),new AntPathRequestMatcher(this.adminServer.path("/actuator/**")))).rememberMe((rememberMe) -> rememberMe.key(UUID.randomUUID().toString()).tokenValiditySeconds(1209600));}@Value("${spring.admin.user}")private String user;@Value("${spring.admin.password}")private String password;@Value("${spring.admin.role}")private String role;// Required to provide UserDetailsService for "remember functionality"@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser(user).password("{noop}" +password).roles(role);}}

客户端在AdminServer提供安全机制后,无法正常注册到AdminServer,此时需要在AdminClient中设置好连接的用户名和密码

spring.boot.admin.client:username: sba-clientpassword: s3cret

六、SpringBootAdmin注册中心连接

因为一般在微服务的架构下需要使用AdminServer,但是这样话,会造成所有的微服务都需要主动去设置AdminServer的地址,从而实现监控效果。

这样一来AdminServer地址的耦合性就特别的高。

基于注册中心,来让AdminServer监控所有注册中心列表上的服务。

可以直接让AdminServer也注册到注册中心(Nacos,Eureka,Zookeeper)

别的什么都不用管,AdminServer支持注册中心监控服务的方式

导入依赖,编写配置,启动

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件

spring:boot:admin:discovery:ignored-services:- adminserverapplication:name: adminservercloud:nacos:discovery:server-addr: 49.233.115.171:8848

七、定制内容监控发邮件

7.1 服务下线自动发送邮件

AdminServer提供了服务下线后,自动通知功能,通知的方向有很多

国内更多的是:JavaMail,DingDing…

导入依赖、编写配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:mail:host: smtp.126.compassword: RPRVYYXGIAEQSFSVusername: zjw_2301211@126.comboot:admin:notify:mail:to: 402424668@qq.comfrom: zjw_2301211@126.com  #出现了553的错误,发送方必须是授权的邮箱地址

7.2 制定监控的内容

查看健康信息的详细信息

management:endpoint:health:show-details: always

image.png

仿照他自动生成的监控信息,自己写一个~~~

找到了他实现的类

image.png

仿照这个类,玩一下。

@Component
public class MyHealthIndicator extends AbstractHealthIndicator {private static long time = System.currentTimeMillis() + (60 * 1000) ;@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {long currTime = System.currentTimeMillis();if(currTime >= time){// 发送邮件,给予通知// 如果一些通知Admin不支持,在这自己玩~~System.out.println("凉凉~");builder.down();}else {// 没什么事System.out.println("一切ok~~");builder.up();}}
}

类名别乱写,后缀要一致,默认是去掉HealthIndicator,没用前缀作为名称。

绿色健康。

红色是某个组件出问题。(可以访问到health,但是有组件凉凉~)

灰色是服务下线。(宕机,也有可能是某写组件出问题,导致无法接收请求)

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

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

相关文章

[C++]20:unorderedset和unorderedmap结构和封装。

unorderedset和unorderedmap结构和封装 一.哈希表&#xff1a;1.直接定址法&#xff1a;2.闭散列的开放定址法&#xff1a;1.基本结构&#xff1a;2.insert3.find4.erase5.补充&#xff1a;6.pair<k,v> k的数据类型&#xff1a; 3.开散列的拉链法/哈希桶&#xff1a;1.基…

mabatis 下

mybatis 原生的API&注解的方式MyBatis-原生的API调用快速入门需求快速入门代码实现 MyBatis-注解的方式操作快速入门需求快速入门代码实现注意事项和说明 mybatis-config.xml配置文件详解说明properties属性settings全局参数定义typeAliases别名处理器typeHandlers类型处理…

几个特殊的控件

目录 一、3个button 1、button 2、linkbutton 3、ImageButton Enabled属性 二、Image控件 1、使用原因 2、使用方式 法一&#xff1a;指明路径 法二&#xff1a;同一目录 3、使用实例 &#xff08;1&#xff09;要求 &#xff08;2&#xff09;操作 三、Typelink和…

对https://registry.npm.taobao.org/tyarn的请求失败,原因:证书过期

今天安装tyarn时&#xff0c;报错如下&#xff1a; request to https://registry.npm.taobao.org/tyarn failed, reason: certificate has expired 原来淘宝镜像过期了&#xff0c;需要重新搞一下 记录一下解决过程&#xff1a; 1.查看当前npm配置 npm config list 2.清空…

JAVAEE多线程——锁

文章目录 什么是锁为什么需要锁如何加锁synchorized 的使用synchronized 修饰方法synchronized 修饰代码块 死锁问题那种场景会造成死锁死锁的本质由于内部存在无限循环导致的死锁 死锁的第二种情况哲学家吃饭模型造成死锁的必要条件 什么是锁 首先我们来解释一下什么是锁呢&a…

SpringBoot整合Xxl-Job

一、下载Xxl-Job源代码并导入本地并运行 Github地址:GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 中文文档地址:分布式任务调度平台XXL-JOB 1.使用Idea或Eclipse导入 2.执行sql脚本(红色标记…

机器学习_神经网络

文章目录 简介反向传播小结 简介 为了构建神经网络模型&#xff0c;我们需要首先思考大脑中的神经网络是怎样的&#xff1f;每一个神经元都可以被认为是一个处理单元/神经核&#xff0c;它含有许多输入/树突&#xff0c;并且有一个输出/轴突。神经网络是大量神经元相互链接并通…

计算机网络简答题:复试+期末

文章目录 1.计算机网络的功能:2.计算机网络的分类:3.主机间的通信方式:4.电报交换、报文交换、分组交换的区别:5.计算机网络的性能指标:6.0SI模型和TCP/IP模型:7.通信信通的方式:8.端到端的通信与点到点通信的区别:9.同步通信和异步通信:10.频分复用、时分复用、波分复用和码分…

使用Pygame做一个乒乓球游戏(2)使用精灵重构

本节没有添加新的功能&#xff0c;而是将前面的功能使用精灵类(pygame.sprite.Sprite) 重构。 顺便我们使用图片美化了一下程序。 看到之前的代码&#xff0c;你会发现代码有点混乱&#xff0c;很多地方使用了全局变量(global)。 本节我们将使用类进行重构。 Block(Sprite)…

NCV7428D15R2G中文资料PDF数据手册参数引脚图图片价格概述参数芯片特性原理

产品概述&#xff1a; NCV7428 是一款系统基础芯片 (SBC)&#xff0c;集成了汽车电子控制单元 (ECU) 中常见的功能。NCV7428 为应用微控制器和其他负载提供低电压电源并对其进行监控&#xff0c;包括了一个 LIN 收发器。 产品特性&#xff1a; 控制逻辑3.3 V或5 V VOUT电源&…

Spark-Scala语言实战(4)

在之前的文章中&#xff0c;我们学习了如何在scala中定义无参&#xff0c;带参以及匿名函数。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言…

四、HarmonyOS应用开发-ArkTS开发语言介绍

目录 1、TypeScript快速入门 1.1、编程语言介绍 1.2、基础类型 1.3、条件语句 1.4、函数 1.5、类 1.6、模块 1.7、迭代器 2、ArkTs 基础&#xff08;浅析ArkTS的起源和演进&#xff09; 2.1、引言 2.2、JS 2.3、TS 2.4、ArkTS 2.5、下一步演进 3、ArkTs 开发实践…

Verilog基础:always结构和initial结构

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 always和initial是Verilog中的核心&#xff0c;它们被称为结构(construct)&#xff0c;用于组织语句的执行方式。下面将分别对这两者进行阐述。 always结构 图1是…

弹框el-dialog title展示不下,鼠标hover显示tip

el-dialog title展示不下&#xff0c;鼠标hover显示tip <el-dialog:visible.sync"shows":close-on-click-modal"false"v-dialogDragwidth"520px"><template #title><div class"custom-title"><el-tooltipplaceme…

【文件操作和IO】

文件操作和IO 1.文件2. 硬盘上文件的目录结构3. 文件路径4. 文件重要分类&#xff1a;5. Java中操作文件5.1 Java对于文件操作的API5.2 Java中使用File类来进行文件操作5.3 File类属性5.4 构造方法5.5 方法&#xff1a; 6. 文件内容的读写 -- 文件流&#xff08;数据流&#xf…

Apache Superset

前言 最近在准备一个小的项目&#xff0c;需要对 Hive 的数据进行展示&#xff0c;所以想到了把 Hive 的数据导出到 MySQL 然后用 Superset 进行展示。 Superset 1.1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接…

kubesphere all in one部署Jenkins提示1 Insufficient cpu

原因 devops 至少一个cpu&#xff08;1000m&#xff09;&#xff0c;但是其他资源已经占用了很多cpu CPU 资源以 CPU 单位度量。Kubernetes 中的一个 CPU 等同于&#xff1a; 1 个 AWS vCPU 1 个 GCP核心 1 个 Azure vCore 裸机上具有超线程能力的英特尔处理器上的 1 个超线程…

RISC-V架构的三种特权模式如何切换

1、RISC-V的三种特权模式 特权模式功能描述机器模式&#xff08;M-mode&#xff09;具有最高特权等级&#xff0c;具有访问所有资源的权限&#xff0c;通常运行固件和内核用户模式&#xff08;U-mode&#xff09;权限要比M模式低&#xff0c;通常是用来运行操作系统内核管理员…

MyBatis3源码深度解析(十七)MyBatis缓存(一)一级缓存和二级缓存的实现原理

文章目录 前言第六章 MyBatis缓存6.1 MyBatis缓存实现类6.2 MyBatis一级缓存实现原理6.2.1 一级缓存在查询时的使用6.2.2 一级缓存在更新时的清空 6.3 MyBatis二级缓存的实现原理6.3.1 实现的二级缓存的Executor类型6.3.2 二级缓存在查询时使用6.3.3 二级缓存在更新时清空 前言…

2024年第六届区块链与物联网国际会议(BIOTC 2024)即将召开!

2024年第六届区块链与物联网国际会议&#xff08;简称&#xff1a;BIOTC 2024&#xff09;将于2024 年 7 月 19 日至 21 日在日本福冈召开&#xff0c;旨在为来自行业、学术界和政府的研究人员、从业者和专业人士提供一个论坛&#xff0c;就研发区块链和物联网的专业实践进行交…