[10] 分散リンク追跡技術 Sleuth + Zipkin

マイクロサービス アーキテクチャでは、リクエストは少なくとも 3 つまたは 4 つのサービス呼び出しを通じて完了することがあり、数十、さらには数百のサービス ノードにまたがることもあります。次に、次のような質問が次々と出てきます。
1) サービス呼び出しリンクを動的に表示するにはどうすればよいですか? (たとえば、サービス A が呼び出す他のサービス - 依存関係)
2) サービス呼び出しリンク内のボトルネック ノードを分析し、調整する方法は? (例:A→B→C、Cサービスの処理時間が特に長い)
3) サービスリンク障害を迅速に検出するにはどうすればよいですか?
これが分散型リンクトラッキング技術の存在目的と意義です

本質: ロギング

リクエスト リンク、リンクは TraceId によって一意に識別され、スパンは開始されたリクエスト情報を識別します。各スパンは parrentId によって関連付けられます。 トレース :
サービス追跡の追跡単位は、顧客によってリクエスト (リクエスト) が開始され、追跡対象システムに到達すると、プロセスが開始され、追跡対象システムがクライアントに応答を返すときに終了します。

トレース ID : リクエスト追跡を実装するには、リクエストが分散システムのインレット エンドポイントに送信されるときに、サービス追跡フレームワークはリクエストに対して一意のトレース ID を作成するだけで済みます。分散システムでは、欠落したフレームは、トレースが要求者に返されるまでこの一意の識別を維持します。これは 1 つ以上のスパンで構成されます。各スパンには SpanId があり、TraceId はスパンに記録されます。

ParentId は別の Span の SpanId を指しており、親子関係を示しており、本質的には依存関係を表しています。

スパン ID : 各処理ユニットの遅延時間をカウントするために、リクエストが各サービス コンポーネントに到達したときに、その開始、特定のプロセス、および終了をマークするために一意の識別子 SpanID も使用されます。各スパンには、2 つの開始ノードと終了ノードが必要です。開始スパンと終了スパンのタイムスタンプを記録することで、スパンの遅延時間を計算できます。タイムスタンプ レコードに加えて、他のメタデータも含めることができます。 、時間名、リクエスト情報など。各スパンには一意の追跡識別子「スパン ID」があります。複数の順序付けされたスパンがトレースを形成する場合。

Span はログ データ構造と考えることができます。一部のログ情報は、タイムスタンプ、spanId、TraceId、parentIde などの特別なタイミング ポイントで記録されます。Span はイベントと呼ばれる別の概念も抽象化しています。コア イベントは次の
とおりです

  • CS: クライアント送信/開始 クライアント/コンシューマーは、スパンの開始を説明するリクエストを送信します。
  • SR: サーバー受信/開始サーバー/プロデューサー受信リクエスト SR-CS はネットワークに属し、リクエスト送信の遅延
  • SS: サーバー送信/終了 サーバー/プロデューサーは、サーバーが消費した時間である応答 SS-SR を送信します。
  • CR: クライアントが受信した/終了したクライアント/コンシューマが応答を受信したこと CR-SS は、応答に必要な時間を示します (応答のネットワーク遅延)

Spring Cloud Sleuth(トラッキングサービスフレームワーク)は、サービス間の呼び出しを追跡することができ、サービスリクエストがどのサービスを経由したか、サービスの処理時間などを記録することができ、これらをもとにマイクロサービス間の呼び出し関係や処理を明確にすることができ、課題追跡分析を行うことができます。

  • 時間のかかる分析: Sleuth を使用して、時間のかかるサンプリング リクエストを理解し、サービス パフォーマンスの問題 (どのサービス呼び出しに時間がかかるか) を分析します。

  • リンクの最適化: 頻繁に呼び出されるサービス、ターゲットを絞った最適化などを検出します。

  • Sleuth はログを通じてトレース データを記録します。

サービスビルド

スルース+ジプキン

  1. 追跡する必要がある各マイクロサービス プロジェクトには依存関係座標が導入されます
    ここに画像の説明を挿入します
  <dependency>
     <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
 </dependency>
      
  1. 各マイクロサービスの application.yml 構成ファイルを変更し、ログ レベルを追加します。
#分布式链路追踪
logging:
  level:
    org.springframework.web.servlet.DispatcherServlet: debug
    org.springframework.cloud.sleuth: debug
  1. サービス監視コンソールを開始します
    ここに画像の説明を挿入します

Zipkin と組み合わせて追跡データを表示します

Zipkin には、Zipkin Server と Zipkin Client が含まれています。Zipkin Server は別のサービスであり、Zipkin Client は
特定のマイクロサービスです。

  1. Zipkin Server のビルド (m-parent の下に新しいモジュールを作成)
    ここに画像の説明を挿入します
    2. 依存関係
 <!--zipkin-server的依赖坐标-->
		        <dependency>
		            <groupId>io.zipkin.java</groupId>
		            <artifactId>zipkin-server</artifactId>
		            <version>2.12.3</version>
		            <exclusions>
		                <!--排除掉log4j2的传递依赖,避免和springboot依赖的⽇志组件冲突-->
		                <exclusion>
		                    <groupId>org.springframework.boot</groupId>
		                    <artifactId>spring-boot-starter-log4j2</artifactId>
		                </exclusion>
		            </exclusions>
		        </dependency>
		        <!--zipkin-server ui界⾯依赖坐标-->
		        <dependency>
		            <groupId>io.zipkin.java</groupId>
		            <artifactId>zipkin-autoconfigure-ui</artifactId>
		            <version>2.12.3</version>
		        </dependency>
  1. スタートアップクラス
@SpringBootApplication
@EnableZipkinServer //开启ZipkinServer
public class MCloudZipkinServer9411 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(MCloudZipkinServer9411.class,args);
    }
}
  1. 構成
server:
  port: 9411

management:
  metrics:
    web:
      server:
        auto-time-requests: false #关闭自动检测
  1. Zipkin クライアントの構築 (特定のマイクロサービスで変更)
  • pom に zipkin 依存関係を追加
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • application.yml に zipkin サーバーへの参照を追加します。
  # zipkin链路追踪配置
spring:
  zipkin:
    base-url: http://localhost:9411
    sender:
      type: web
  sleuth:
    sampler:
      probability: 1 #采样率 1代表100%全采集,默认0.1 10%
  1. Zipkin Server を起動し、次のサービスを再起動します。
    ここに画像の説明を挿入します
  2. http://localhost:9411/zipkin/にアクセスしてください。
  3. マイクロサービスを呼び出してリンク情報を生成する
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します
    ここに画像の説明を挿入します

Zipkin が mysql に保持する追跡データ

永続性がない場合、データ サービスが再起動されるとデータが消えます。

  1. mysql で名前を付けたデータベースを作成しzipkin、以下の SQL 文を実行します(公式に提供されています)
--
-- Copyright 2015-2019 The OpenZipkin Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-- in compliance with the License. You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software distributed under the License
-- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-- or implied. See the License for the specific language governing permissions and limitations under
-- the License.
--

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,
  `remote_service_name` VARCHAR(255),
  `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',
  PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

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(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
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 and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
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,
  `error_count` BIGINT,
  PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
  1. Zipkin サーバー、pom ファイルに関連する依存関係が導入される
 <dependency>
            <groupId>io.zipkin.java</groupId>
            <artifactId>zipkin-autoconfigure-storage-mysql</artifactId>
            <version>2.12.3</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
  1. 設定ファイルを変更する
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/zipkin?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
    username: root
    password: root
    druid:
      initialSize: 10
      minIdle: 10
      maxActive: 30
      maxWait: 50000
# 指定zipkin持久化介质为mysql
zipkin:
  storage:
    type: mysql
  1. トランザクション マネージャーをスタートアップ クラスに挿入する
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
    
    
 return new DataSourceTransactionManager(dataSource);
}
  1. サービス検証の永続性の開始

ここに画像の説明を挿入しますここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/u014535922/article/details/130078114