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 のベスト プラクティス:
- コントローラーと FeignClient に同じインターフェイスを継承させる
- すべてのコンシューマーが使用できるように、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 のバイトコードを指定します