マイクロサービス学習ノート -- (Feign)

http クライアントのふり

  • Feign が RestTemplate を置き換える
  • カスタム構成
  • 偽装使用の最適化
  • ベストプラクティス

RestTemplate の呼び出しに関する問題

RestTemplate を使用してリモート呼び出しを開始するために使用されるコード:

String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);

以下の問題があります。

  • コードの可読性が低く、プログラミング エクスペリエンスに一貫性がない
  • 複雑なパラメータを持つ URL は保守が困難です

フェインさんの紹介

Feign は宣言型 http クライアントです。公式アドレス: http://github.com/OpenFeign/feign
その役割は、http リクエストをエレガントに送信し、上記の問題を解決できるようにすることです。


Feign クライアントを定義して使用する

Feign を使用する手順は次のとおりです。

1. 依存関係を導入します。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

2. order-service スタートアップクラスの Tainan Jia アノテーションで Feign の機能を有効にする

@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
    
    
	public static void main(String[] args) {
    
    
		SpringApplication.run(OrderApplication.class, args);
	}
}

Feign を使用する手順は次のとおりです。

3. 書き込み偽クライアント

@FeignClient("userservice")
public interface UserClient {
    
    
	@GetMapping("/user/{id}")
	User findById(@PathVariable("id") Long id);
}

これは主に SpringMVC アノテーションに基づいて、次のようなリモート呼び出し情報を宣言します。

  • サービス名: ユーザーサービス
  • リクエストメソッド:GET
  • リクエストパス: /user/{id}
  • リクエストパラメータ: 長い ID
  • 戻り値の型: ユーザー

4. RestTemplate の代わりに Feign クライアントを使用する

@Autowired
private UserClient userClient;

public Order queryOrderById(Long orderId) {
    
    
	// 1.查询订单
	Order order = orderMapper.findByid(orderId);
	// 2.利用Feign发起http请求,查询用户
	User user = userClient.findById(order.getUserId());
	// 3.封装user到Order
	order.setUser(user);
	// 4.返回
	return order;
}

まとめ:

Feign を使用する手順:

  • 依存関係を導入する
  • @EnableFeignClients アノテーションを追加
  • FeignClient インターフェースを作成する
  • RestTemplate の代わりに FeignClient で定義されたメソッドを使用する

Feign - カスタム構成

Feign の構成をカスタマイズする

Feign はカスタム構成を実行してデフォルト構成をオーバーライドします。変更できる構成は次のとおりです。

タイプ 効果 説明する
偽りのロガーレベル ログレベルの変更 4 つの異なるレベルが含まれます: NONE、BASIC、HEADERS、FULL
feign.codec.Decoder 応答結果のパーサー json 文字列を Java オブジェクトに解析するなど、http リモート呼び出しの結果を解析します。
feign.codec.Encoder リクエストパラメータのエンコーディング http リクエスト経由で送信するためのリクエスト パラメータをエンコードする
偽りの契約 サポートされている注釈形式 デフォルトはS平日のMVCのアノテーションです
feign.リトライアー 失敗時の再試行メカニズム リクエスト失敗時の再試行メカニズム。デフォルトは「いいえ」ですが、リボンの再試行が使用されます。

一般に、設定する必要があるのはログ レベルです。

Feign ログを設定するには 2 つの方法があります。

方法 1: 設定ファイルによる方法

  • グローバルに有効になります。
feign:
  client:
    config:
      default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL # 日志级别
  • 部分的な効果
feign:
  client:
    config:
      userservice: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL # 日志级别

Feign ログを設定する 2 番目の方法: Java コード メソッド。最初に Bean を宣言する必要があります。

public class FeignClientConfiguration {
    
    
	@Bean
	public Logger.Level feignLogLevel() {
    
    
		return Logger.Level.BASIC;
	}
}
  • グローバル構成の場合は、 @EnableFeignClients アノテーションに含めます。
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
  • 部分的な構成の場合は、 @FeignClient アノテーションに含めます。
@FeignClients(value="userservice", configuration = FeignClientConfiguration.class)

まとめ:

Feign のログ構成:

1. 最初の方法は、構成ファイル feign.client.config.xxx.loggerLevel です。

  • xxx がデフォルトの場合、グローバルを意味します
  • xxx が userservice などのサービス名である場合、サービスを表します。

2. 2 番目の方法は、Java コードで Logger.level Bean を構成することです。

  • @EnableFeignClients アノテーションで宣言されている場合、グローバルを表します。
  • @FeignClient アノテーションで宣言されている場合、サービスを表します。

ふりのパフォーマンスの最適化

パフォーマンスの最適化を装う

Feign の基礎となるクライアント実装:

  • URLConnection: デフォルトの実装、接続プーリングをサポートしません
  • Apache HttpClient: 接続プーリングをサポート
  • OKHttp: 接続プールのサポート

したがって、Feign のパフォーマンスの最適化には主に以下が含まれます。

  • デフォルトの URLConnection の代わりに接続プールを使用する
  • ログレベル、できれば基本またはなし

パフォーマンスの最適化を装う - 接続プールの構成

Feign は HttpClient サポートを追加します:
依存関係をインポートします:

<!--httpClient的依赖-->
<dependency>
	<groupId>io.github.openfeign</groupId>
	<artifactId>feign-httpclient</artifactId>
</dependency>

接続プールを構成します。

feign:
  client:
    config:
      default: # default全局的配置
        loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息
  httpclient:
    enabled: true # 开启feign对httpClient的支持
    max-connections: 200 # 最大的连接数
    max-connections-per-route: 50 # 每个路径最大的连接数

まとめ:

Feign の最適化:

1. ログ レベルとして Basic を使用してみます。
2. URLConnection の代わりに HttpClient または OKHttp を使用します。

  • feign-httpClient 依存関係を導入する
  • 構成ファイルは httpClient 機能を有効にし、接続プールのパラメータを設定します。

ふり - ベスト プラクティス分析

偽装のベストプラクティス

方法 1 (継承): コンシューマーの FeignClient とプロバイダーのコントローラーの統一された親インターフェイスを標準として定義します。

  • 密結合されたサービス
  • 親インターフェースのパラメータリストのマッピングは継承されません
public interface UserAPI {
    
    
	@GetMapping("/user/{id}")
	User findById(@PathVariable("id") Long id);
}
@FeignClient(value = "userservice")
public interface UserClient extends UserAPI{
    
    }
@RestController
public class UserController implements UserAPI{
    
    
	public User findById(@PathVariable("id") Long id){
    
    
		// ...实现业务
	}
}

方法 2 (抽出): FeignClient を独立したモジュールとして抽出し、インターフェースに関連する POJO とデフォルトの Feign 構成をこのモジュールに組み込み、すべてのコンシューマに提供します

まとめ:

Feign のベスト プラクティス:

  1. コントローラーと FeignClient に同じインターフェイスを継承させる
  2. すべてのコンシューマーが使用できるように、FeignClient、POJO、および Feign のデフォルト構成を 1 つのプロジェクトに定義します。

Feign - Feign のベスト プラクティスの実装

FeignClient の抽出

ベスト プラクティス方法 2 を実装する手順は次のとおりです。

1. まず feign-api という名前のモジュールを作成し、次に feign のスターター依存関係をインポートします。
2. order-service に記述された UserClient、User、および Default FeignConfiguration を feign-api プロジェクトにコピーします。
3. order-service -api depends に feign を導入します。 on
4. order-service の上記 3 つのコンポーネントに関連するインポート部分をすべて変更し、feign-api にパッケージをインポートするように変更します。
5. テストを再開します。

定義したFeignClientがSpringBootApplicationのスキャン範囲外の場合、これらのFeignClientは使用できません。それを解決するには 2 つの方法があります。

方法 1: FeignClient が配置されているパッケージを指定する

@EnableFeignClients(basePackages = "cn.itcast.feign.clients")

方法 2: FeignClient バイトコードを指定する

@EnableFeignClients(clients= {
    
    UserClient.class})

まとめ:

異なるパッケージの FeignClient をインポートするには 2 つの方法があります。

  • @EnableFeignClients アノテーションにbasePackagesを追加して、FeignClientが配置されているパッケージを指定します
  • @EnableFeignClients アノテーションにクライアントを追加して、特定の FeignClient のバイトコードを指定します

おすすめ

転載: blog.csdn.net/weixin_42594143/article/details/130579454