- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈Spring-cloud 之 sleuth 服务链路跟踪由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这篇文章主要讲述服务追踪组件zipkin,spring cloud sleuth集成了zipkin组件.
1、简介 。
add sleuth to the classpath of a spring boot application (see below for maven and gradle examples), and you will see the correlation data being collected in logs, as long as you are logging requests. 。
—— 摘自官网 。
spring cloud sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.
2、服务追踪分析 。
微服务架构上通过业务来划分服务的,通过rest调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败。随着业务的不断扩张,服务之间互相调用会越来越复杂.
随着服务的越来越多,对调用链的分析会越来越复杂。它们之间的调用关系也许如下:
3、术语 。
span:基本工作单元,例如,在一个新建的span中发送一个rpc等同于发送一个回应请求给rpc,span通过一个64位id唯一标识,trace以另一个64位id表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的id、以及进度id(通常是ip地址) 。
span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它.
trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式大数据工程,你可能需要创建一个trace.
annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束 。
将span和trace在一个系统中使用zipkin注解的过程图形化:
4、构建工程 。
基本知识讲解完毕,下面我们来实战,本文的案例主要有三个工程组成:一个server-zipkin,它的主要作用使用zipkinserver 的功能,收集调用数据,并展示;一个service-hi,对外暴露hi接口;一个service-miya,对外暴露miya接口;这两个service可以相互调用;并且只有调用了,server-zipkin才会收集数据的,这就是为什么叫服务追踪了.
4.1 构建server-zipkin 。
建一个spring-boot工程取名为server-zipkin,在其pom引入依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
<dependency>
<groupid>io.zipkin.java</groupid>
<artifactid>zipkin-server</artifactid>
</dependency>
<dependency>
<groupid>io.zipkin.java</groupid>
<artifactid>zipkin-autoconfigure-ui</artifactid>
</dependency>
</dependencies>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<version>camden.sr6</version>
<type>pom</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencymanagement>
|
在其程序入口类, 加上注解@enablezipkinserver,开启zipkinserver的功能:
1
2
3
4
5
6
7
8
|
@springbootapplication
@enablezipkinserver
public
class
serverzipkinapplication {
public
static
void
main(string[] args) {
springapplication.run(serverzipkinapplication.
class
, args);
}
}
|
在配置文件application.yml指定服务端口为:
1
|
server.port=
9411
|
4.2 创建service-hi 。
在其pom引入起步依赖spring-cloud-starter-zipkin,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<dependencies>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!--compile(
'org.springframework.cloud:spring-cloud-starter-zipkin'
)-->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-zipkin</artifactid>
</dependency>
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
</dependencies>
<dependencymanagement>
<dependencies>
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-dependencies</artifactid>
<version>dalston.rc1</version>
<type>pom</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencymanagement>
|
在其配置文件application.yml指定zipkin server的地址,头通过配置“spring.zipkin.base-url”指定:
1
2
3
|
server.port=
8988
spring.zipkin.base-url=http:
//localhost:9411
spring.application.name=service-hi
|
通过引入spring-cloud-starter-zipkin依赖和设置spring.zipkin.base-url就可以了.
对外暴露接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
@springbootapplication
@restcontroller
public
class
servicehiapplication {
public
static
void
main(string[] args) {
springapplication.run(servicehiapplication.
class
, args);
}
private
static
final
logger log = logger.getlogger(servicehiapplication.
class
.getname());
@autowired
private
resttemplate resttemplate;
@bean
public
resttemplate getresttemplate(){
return
new
resttemplate();
}
@requestmapping
(
"/hi"
)
public
string callhome(){
log.log(level.info,
"calling trace service-hi "
);
return
resttemplate.getforobject(
"http://localhost:8989/miya"
, string.
class
);
}
@requestmapping
(
"/info"
)
public
string info(){
log.log(level.info,
"calling trace service-hi "
);
return
"i'm service-hi"
;
}
@bean
public
alwayssampler defaultsampler(){
return
new
alwayssampler();
}
}
|
4.3 创建service-miya 。
创建过程痛service-hi,引入相同的依赖,配置下spring.zipkin.base-url.
对外暴露接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
@springbootapplication
@restcontroller
public
class
servicemiyaapplication {
public
static
void
main(string[] args) {
springapplication.run(servicemiyaapplication.
class
, args);
}
private
static
final
logger log = logger.getlogger(servicemiyaapplication.
class
.getname());
@requestmapping
(
"/hi"
)
public
string home(){
log.log(level.info,
"hi is being called"
);
return
"hi i'm miya!"
;
}
@requestmapping
(
"/miya"
)
public
string info(){
log.log(level.info,
"info is being called"
);
return
resttemplate.getforobject(
"http://localhost:8988/info"
,string.
class
);
}
@autowired
private
resttemplate resttemplate;
@bean
public
resttemplate getresttemplate(){
return
new
resttemplate();
}
}
|
4.4 启动工程,演示追踪 。
依次启动上面的三个工程,打开浏览器访问:http://localhost:9411/,会出现以下界面:
访问:http://localhost:8989/miya,浏览器出现:i'm service-hi 。
再打开http://localhost:9411/的界面,点击dependencies,可以发现服务的依赖关系:
点击find traces,可以看到具体服务相互调用的数据:
本文源码下载: https://github.com/forezp/springcloudlearning/tree/master/chapter9 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/forezp/article/details/70162074 。
最后此篇关于浅谈Spring-cloud 之 sleuth 服务链路跟踪的文章就讲到这里了,如果你想了解更多关于浅谈Spring-cloud 之 sleuth 服务链路跟踪的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
服务架构进化论 原始分布式时代 一直以来,我可能和大多数的人认知一样,认为我们的服务架构的源头是单体架构,其实不然,早在单体系
序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的
内容,是网站的核心所在。要打造一个受用户和搜索引擎关注的网站,就必须从网站本身的内容抓起。在时下这个网络信息高速发展的时代,许多低质量的信息也在不断地充斥着整个网络,而搜索引擎对一些高质量的内容
从第一台计算机问世到现在计算机硬件技术已经有了很大的发展。不管是现在个人使用的PC还是公司使用的服务器。双核,四核,八核的CPU已经非常常见。这样我们可以将我们程序分摊到多个计算机CPU中去计算,在
基本概念: 浅拷贝:指对象的字段被拷贝,而字段引用的对象不会被拷贝,拷贝对象和原对象仅仅是引用名称有所不同,但是它们共用一份实体。对任何一个对象的改变,都会影响到另外一个对象。大部分的引用类型,实
.NET将原来独立的API和SDK合并到一个框架中,这对于程序开发人员非常有利。它将CryptoAPI改编进.NET的System.Security.Cryptography名字空间,使密码服务摆脱
文件与文件流的区别(自己的话): 在软件开发过程中,我们常常把文件的 “读写操作” ,与 “创造、移动、复制、删除操作” 区分开来
1. 前言 单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试,以及落地的程度, 每个项目都有自己的情况。 本篇为
事件处理 1、事件源:任何一个HTML元素(节点),body、div、button 2、事件:你的操作 &
1、什么是反射? 反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 Oracle 官方对
1、源码展示 ? 1
Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。
可能大家谈到反射面部肌肉都开始抽搐了吧!因为在托管语言里面,最臭名昭著的就是反射!它的性能实在是太低了,甚至在很多时候让我们无法忍受。不过不用那么纠结了,老陈今天就来分享一下如何来优化反射!&nbs
1. 前言 最近一段时间一直在研究windows 驱动开发,简单聊聊。 对比 linux,windows 驱动无论是市面上的书籍,视频还是社区,博文以及号主,写的人很少,导
问题:ifndef/define/endif”主要目的是防止头文件的重复包含和编译 ========================================================
不知不觉.Net Core已经推出到3.1了,大多数以.Net为技术栈的公司也开始逐步的切换到了Core,从业也快3年多了,一直坚持着.不管环境
以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木
目录 @RequestParam(required = true)的误区 先说结论 参数总结 @RequestParam(r
目录 FTP、FTPS 与 SFTP 简介 FTP FTPS SFTP FTP 软件的主动模式和被动模式的区别
1、Visitor Pattern 访问者模式是一种行为模式,允许任意的分离的访问者能够在管理者控制下访问所管理的元素。访问者不能改变对象的定义(但这并不是强制性的,你可以约定为允许改变)。对管
我是一名优秀的程序员,十分优秀!