マイクロサービス アーキテクチャでは、リクエストは少なくとも 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 はログを通じてトレース データを記録します。
サービスビルド
スルース+ジプキン
- 追跡する必要がある各マイクロサービス プロジェクトには依存関係座標が導入されます
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
- 各マイクロサービスの application.yml 構成ファイルを変更し、ログ レベルを追加します。
#分布式链路追踪
logging:
level:
org.springframework.web.servlet.DispatcherServlet: debug
org.springframework.cloud.sleuth: debug
- サービス監視コンソールを開始します
Zipkin と組み合わせて追跡データを表示します
Zipkin には、Zipkin Server と Zipkin Client が含まれています。Zipkin Server は別のサービスであり、Zipkin Client は
特定のマイクロサービスです。
- 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>
- スタートアップクラス
@SpringBootApplication
@EnableZipkinServer //开启ZipkinServer
public class MCloudZipkinServer9411 {
public static void main(String[] args) {
SpringApplication.run(MCloudZipkinServer9411.class,args);
}
}
- 構成
server:
port: 9411
management:
metrics:
web:
server:
auto-time-requests: false #关闭自动检测
- 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%
- Zipkin Server を起動し、次のサービスを再起動します。
- http://localhost:9411/zipkin/にアクセスしてください。
- マイクロサービスを呼び出してリンク情報を生成する
Zipkin が mysql に保持する追跡データ
永続性がない場合、データ サービスが再起動されるとデータが消えます。
- 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;
- 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>
- 設定ファイルを変更する
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
- トランザクション マネージャーをスタートアップ クラスに挿入する
@Bean
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
- サービス検証の永続性の開始