ここにディレクトリのタイトルを書きます
RestTemplate を使用してマイクロサービス間で呼び出しを行う
1. 他のマイクロサービスを呼び出す必要があるサービスのスタートアップ クラスに、次のコードを追加します。
//只要引入boot就可以使用
@Bean
@LoadBalanced//表示用负载均衡调用服务
public RestTemplate restTemplate(){
return new RestTemplate();
}
2. ビジネスロジックコード部分
RestTemplate の代わりに OpenFeign を使用する
1)、依存関係を導入する
order-service サービス (他のサービスを呼び出すサービス) の pom ファイルに偽の依存関係を導入します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2)、注釈を追加します
order-service のスタートアップクラスにアノテーションを追加し、Feign の機能を有効にします。
3)、偽のクライアントを書き込みます
次の内容を含む新しいインターフェイスを order-service に作成します。
@FeignClient(value = "user-server")//user-server为想要调用的微服务名称
public interface UserServiceClient {
@GetMapping("/user/{id}")//完整的路径
User findById(@PathVariable("id") Long id);
}
このように、Feign は、RestTemplate を使用せずに http リクエストを送信するのに役立ちます。
4)、テスト
order-service の OrderService クラスの queryOrderById メソッドを変更し、RestTemplate の代わりに Feign クライアントを使用します。
カスタム構成
タイプ | 効果 | 説明する |
---|---|---|
偽りのロガーレベル | ログレベルの変更 | 4 つの異なるレベルが含まれます: NONE (デフォルト)、BASIC、HEADERS、FULL NONE 、ロギングなし。デフォルトのオプションではBASIC 、リクエストのメソッドと URL を、レスポンスのステータス コードと実行時間とともにログに記録するだけです。HEADERS 、基本情報とリクエストヘッダーとレスポンスヘッダーをログに記録します。FULL 、リクエストとレスポンスのヘッダー、本文、メタデータを記録します。 |
feign.codec.Decoder | 応答結果のパーサー | json 文字列を Java オブジェクトに解析するなど、http リモート呼び出しの結果を解析します。 |
feign.codec.Encoder | リクエストパラメータのエンコーディング | POST リクエストなどの http リクエストによる送信を容易にするためにリクエスト パラメータをエンコードし、リクエスト パラメータをリクエスト本文にエンコードします。 |
偽りの契約 | サポートされている注釈形式 | デフォルトはSpringMVCのアノテーションです |
feign.リトライアー | 失敗時の再試行メカニズム | リクエスト失敗時の再試行メカニズム。デフォルトは「いいえ」ですが、リボンの再試行が使用されます。たとえば、A サービスにアクセスできない場合は、クラスター内の B サービスへのアクセスが試行されます。 |
通常の状況では、デフォルト値で十分ですが、カスタマイズする場合は、カスタム @Bean を作成してデフォルト Bean をオーバーライドするだけで済みます。
以下では、例としてログを使用して、構成をカスタマイズする方法を示します。
- Feign ログを変更するには、設定ファイルによる方法とJava コードによる方法の2 つの方法があります。
設定ファイル方式
構成ファイルに基づいて feign のログ レベルを変更すると、単一のサービスを対象にすることができます。
feign:
client:
config:
user-service: # 针对某个微服务的配置
loggerLevel: FULL # 日志级别
すべてのサービスをターゲットにすることもできます。
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
loggerLevel: FULL # 日志级别
ログレベルは次の 4 種類に分類されます。
- NONE: ログ情報を記録しません。これがデフォルト値です。
- BASIC: リクエストメソッド、URL、レスポンスステータスコード、実行時間のみをログに記録します。
- HEADERS: BASICをベースに、リクエストとレスポンスのヘッダ情報を追加記録します。
- FULL: ヘッダー情報、リクエスト本文、メタデータを含む、すべてのリクエストとレスポンスの詳細を記録します。
Javaコードメソッド
Java コードに基づいてログ レベルを変更することもできます。最初にクラスを宣言し、次に Logger.Level オブジェクトを宣言します。
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
グローバルに有効にしたい場合は、スタートアップ クラスの @EnableFeignClients アノテーションに追加します。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
ローカルで有効な場合は、対応する @FeignClient アノテーションに入れます。
@FeignClient(value = "user-service", configuration = DefaultFeignConfiguration .class)
偽装使用の最適化
Feign の最下層は http リクエストを開始し、他のフレームワークに依存します。その基礎となるクライアント実装には次のものが含まれます。
- URLConnection:
默认实现
、不支持连接池
、各リクエストは新しい接続です
Feign は、接続プール機能を備えたフレームワークの使用をサポートしています。
- Apache HttpClient: 接続プールのサポート
- OKHttp: 接続プールのサポート
したがって、Feign のパフォーマンスを向上させる主な手段は、デフォルトの URLConnection の代わりに接続プールを使用することです。
ここでは、Apache の HttpClient を使用してデモンストレーションします。
1)、依存関係を導入する
order-service の pom ファイルに Apache の HttpClient 依存関係を導入します。
<!--httpClient的依赖 -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2)、接続プールを構成します (オプション)
order-service の application.yml に設定を追加します。
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
httpclient:
enabled: true # 开启feign对HttpClient的支持,默认开启
max-connections: 200 # 最大的连接数,默认200
3) 検証:省略
ベストプラクティス
個々のモジュールを抽出する
Feign のクライアントを独立したモジュールとして抽出し、インターフェイス関連の POJO とデフォルトの Feign 設定をすべてのコンシューマーが使用できるようにこのモジュールに組み込みます。
たとえば、UserClient、User、および Feign のデフォルト構成はすべて feign-api パッケージに抽出され、この依存関係パッケージを参照することですべてのマイクロサービスを直接使用できます。
1. まず feign-api という名前のモジュールを作成し、次に feign-api に依存関係を導入します。
<!--openfeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--httpclient基于连接池的调用-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2. 次に、order-service に記述された UserClient、User、DefaultFeignConfiguration を feign-api プロジェクトにコピーします
3. order-service 内の UserClient、User、DefaultFeignConfiguration などのクラスまたはインターフェイスを削除します。
4. order-service の pom ファイルに feign-api の依存関係を導入します。
order-service の openfeign と httpclient の依存関係はコメントアウトできます。
order-service 内の上記 3 つのコンポーネントに関連するすべてのパッケージ インポート部分を変更し、feign-api にパッケージをインポートするように変更します
。
order-service の @EnableFeignClients で注釈が付けられています パッケージは同じパッケージ内にないため、UserClient をスキャンできません。
6. 解決
方法 1:
Feign がスキャンする必要があるパッケージを指定します。
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方法 2:
ロードする必要があるクライアント インターフェイスを指定します (推奨されません)。
@EnableFeignClients(clients = {
UserClient.class})