springboot+springcloud の学習 --- マイクロサービス間の呼び出し

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})

おすすめ

転載: blog.csdn.net/ImisLi/article/details/128728533