La logique sous-jacente du système de chaîne d'appel "Internet Architecture"

Il existe de nombreux systèmes de chaîne d'appel : Dapper, Hawkeye, hydra, cat, zipkin, skywalking. En fait, quel que soit le système de chaîne d'appels, l'implémentation sous-jacente est cohérente. Comprenons ensemble sa mise en œuvre sous-jacente.

(1) L'essence du système de chaîne d'appel

  • Quel processus une page Web doit-elle suivre pour atteindre l'utilisateur ?

C'est la question préférée d'Ali lors des premières interviews.Poser cette question, c'est comprendre l'étendue de votre technologie.

  • couche de transport réseau

# 该命令可直接跟踪网络通信所经过的节点
tracert www.baidu.com
复制代码

  • couche d'équilibrage de charge

Les premiers systèmes de surveillance ne surveillaient que les services réseau.

  • couche de service système

Les systèmes de surveillance d'aujourd'hui vont directement à l'intérieur du système. Systèmes d'application, bases de données, services de ressources tiers et interfaces pour demander des API tierces.

  • Éléments de base de la chaîne d'appel

Fondamentalement, tous les systèmes d'appel sont ces éléments, éventuellement sous des noms différents.

1. Événements

Actions spécifiques lors du traitement de la demande

2. Nœud

Le nœud système par lequel passe la demande, c'est-à-dire l'attribut spatial de l'événement.

3 fois

L'heure de début et de fin de l'événement

4. Relation

L'événement est lié à l'événement précédent.

0.1 et 0.1.1, 0.1.2 est la relation parent-enfant 02 et 0.2.3, 0.2.1, 0.2.2 est la relation parent-enfant. Manger est un événement, tenir des baguettes est un sous-événement de manger et ouvrir la bouche est un sous-événement de manger. Le mouvement de la bouche est un sous-événement de manger. sont des relations imbriquées.

  • Le système de chaîne d'appel est essentiellement utilisé pour répondre à ces questions

Tout comme écrire un essai, le temps, le lieu, la tâche, l'événement. (Les événements sont un par un, et il est nécessaire de s'assurer que la relation entre eux n'est pas complexe, et que ces événements d'appel ne sont pas chaotiques avant qu'ils ne soient terminés. La théorie est très simple, mais si vous avez vraiment besoin de la comprendre, vous devez l'utiliser dans un environnement de production. Résoudre de très nombreux problèmes.)

1. A quelle heure ? 2. Sur quel nœud ? 3. Que s'est-il passé ? 4. Qui a déclenché cet événement ?

  • capture d'événement

En effet, les informations de sortie

1. Capture de point enterré codé en dur 2. Capture de point enterré AOP 3. Capture de point enterré de composant public 4. Capture d'instrumentation bytecode

  • enchaînement d'événements

Le but de la concaténation d'événements

1. Tous les événements sont liés au même appel 2. Il existe une relation hiérarchique entre les événements

Afin d'atteindre ces deux objectifs, presque tous les systèmes de chaîne d'appel auront les deux propriétés suivantes :

trackID : Unique dans tout le système, les événements avec la même valeur représentent le même appel. eventID (spanID): unique dans un appel et affiche la relation hiérarchique des événements

1. Comment générer TrackID 2. Comment passer des paramètres

  • Processus concaténé :

1.由跟踪的起点⽣成⼀个TrackId, ⼀直传递⾄所有节点,并保存在事件属性值当中。 2.由跟踪的起点⽣成初始EventId(SpanID),每捕捉⼀个事件ID加1,每传递⼀次,层级加1。

  • trackId与eventId 的传递

  • eventId ⾃增⽣成⽅式

埋在具体某个实现⽅法类,当多线程调⽤该⽅法时如何保证⾃增正确性?

解决办法是每个跟踪请求创建⼀个互相独⽴的会话,EventId的⾃增都基于该会话实现。通常会话对象的存储基于ThreadLocal实现。

  • 事件的开始与结束

我们知道⼀个事件是⼀个时间段内系统执⾏的若⼲动作,所以对于事件捕捉必须包含开启监听和结束监听两个动作?如果⼀个事件在⼀个⽅法内完成的,这个问题是⽐较好解决的,我们只要在⽅法的开始创建⼀个Event对象,在⽅法结束时调⽤该对像的close ⽅法即可。

public void addUser(){ 
// 方法的开始处,开启一个监听 
Event event=new Event(); 
//业务代码执行 
..... 
..... 
// 方法的结束处,关闭一个监听 
event.close(); 
} 
复制代码

但如果⼀个事件的开始和结束触发分布在多个对象或⽅法当中,情况就会变得异常复杂。⽐如⼀个JDBC执⾏事件,应该是在构建 Statement 时开始,在Statement 关闭时结束。怎样把这两个触发动作对应到同⼀个事件当中去呢(即传递Event对象)?在这⾥的解决办法是对返回结果进⾏动态代理,把Event放置到代理对象的属性当中,以达到付递的⽬标。当这个⽅法只是适应JDBC这⼀个场景,其它场景需要重新设计Event 传递路径,⽬前还没有通⽤的解决办法。

// JDBC事件开始 
Connection.prepareStatement(String sql); 
//JDBC 事件结束 
PreparedStatement.close(); 
复制代码
  • 上传
  1. 基于Http请求直接上传
  2. 打印⽇志,然后在基于Flume或Logstash采集上传。

第⼀种相对简单,直接把数据发送服务进⾏持久化,但如果系统流量较⼤的情况下,会影响系统本身的性能,造成压⼒。第⼆种相对复杂,但可以应对⼤流量,通常情况下会采⽤第⼆种解决办法

(二)项⽬部署

  • 调⽤链Agent 如何部署
  1. 下载 agent.zip ⾄应⽤系统
  2. 解压缩 agent.zip
  3. 添加jvm 参数 -javaagent: <cbt-agent-bootstrap-1.0-SNAPSHOT.jar 路径>
  4. 重启应⽤

1.下载Agent.zip 2.在你启动项⽬的JVM参数⾥添加 -javaagent:cbt-agent-bootstrap-1.0-SNAPSHOT.jar 3.重启你的应⽤,观察你的应⽤⽇志,如果发现以下⽇志代表启动成功了

[2018-06-12:10:32:42]加载藏宝图配置文件来自G:\git\cbt-
agent\out\conf\cbt.properties
[2018-06-12:10:32:43]藏宝图服务登陆成功! 
[2018-06-12:10:32:43]藏宝图服务启动成功! 
复制代码

4.登陆 调⽤链管理WEB⻚⾯ client.cbtu.pro:9978/trace/reque…

PS:调用链系统并非自己原创,也是通过网络学习获得的,但是我会在上边进行改良,以达到自己需要,并会告诉大家如何搭建,最终可以在微服务项目上受用。

Je suppose que tu aimes

Origine juejin.im/post/7103428915103793183
conseillé
Classement