blog

Feign拡張パッケージをジャークした

最近、同社は、Javaを使用してコア業務システムをリファクタリングする準備ができている、半年はJavaを書かなかった、JDKはJDK11と他の問題の最終的な選択の安定性を考慮して、14に更新されました...

May 31, 2020 · 5 min. read
シェア

序文

最近、同社は、Javaを使用する準備が整いました基幹業務システムのリファクタリング、半年Javaを書かなかった、JDKは、アカウントにJDK11と他の問題の最終的な選択の安定性を考慮して、14に更新されています。

全体的なアーキテクチャの選択に関しては、まったく新しいシステムであったため、歴史的なお荷物もなく、選択肢は大胆なものでした。

SpringCloud、Dubbo、その他の分散型フレームワークがすべて殺したもの、つまりService Meshです。

今回の焦点は、サービスメッシュとは何か、どのような問題を解決できるのか、なぜサービスメッシュを選ぶのか、といった議論ではありません。

問題点

実際のジャークコードのスタート時に方向性が決まっているので、「理想は非常に豊か、現実は非常に骨」という検証の始まりに過ぎません;

SpringCloudやDubboのようなフレームワークがなくなったことで、サービスの登録、ディスカバリ、ロードバランシング、その他の要件はすべてService Meshに格下げされました。

しかし、SpringCloudのようなフレームワークでは、ローカルメソッドを呼び出してリモートサービスを呼び出すことができます。

このシナリオに戻ると、要求は実際には非常に単純で、SpringCloud Feignをこのような宣言的+アノテーションされた方法で呼び出すことを実現することです。

 @Autowired
 private StoreClient client ;
 
 Store store = client.update(1, store)

spring-cloud-openfeign このパッケージを使うことで、上記の要件は実際に達成されますが、SpringCloudに関連する依存関係が導入され、まったく使用しないため、「清潔でない」感じがします。また、このようなフレームワークの押しつけがましさを減らすことを目的としたService Meshの考えにも反しています。

spring-cloud-openfeign 実際、 Feignコアはすぐに使えるので、Feign自体がこの使い方をサポートしているかどうか試してみました。

公式文書を通じて学ぶことができる:リモートインターフェイスを呼び出すには、インターフェイスのフォームを定義することが可能ですが、それは他のライブラリの性質に依存しない使用することができますので、それ自体も合理的である春と統合されていませんが、それはまた、既存のライブラリの不足の結果使用することができます。

使用

ライブラリ feign-plus、上記の要件を組み合わせたものです。

spring-cloud-openfeignそれを使うプロセスは、まさに:

@FeignPlusClient(name = "github", url = "${github.url}")
public interface Github {
 @RequestLine("GET /repos/{owner}/{repo}/contributors")
 List<GitHubRes> contributors(@Param("owner") String owner, @Param("repo") String repo);
}

SpringBootポータルでのスキャン:

@SpringBootApplication
@EnableFeignPlusClients(basePackages = "top.crossoverjie.feign.test")
public class DemoApplication {
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}
 @Autowired
 private Github github ;
 
 List<GitHubRes> contributors = github.contributors("crossoverJie", "feign-plus");
 logger.info("contributors={}", new Gson().toJson(contributors)); 

そのため、外部のサードパーティー・インターフェイスを呼び出す必要がある場合、HTTPリクエストの詳細をすべて遮断して、このインターフェイスに似たインターフェイスを定義することができます。

もちろん、SpringCloudやDubboを書いたときのように、内部サービスの呼び出しにも適しています。サービスプロバイダがClientパッケージを提供し、コンシューマはそれに直接依存して呼び出すことができます。その他の負荷分散やフォールトトレランスなどはService Meshが行います。

@RequestMapping("/path") 内部インターフェースの場合は、アノテーションを追加することもできます:

feign.order.service.url URLは/orderでスプライスされるため、.NETを設定する際にはサービスプロバイダのドメイン名またはIPを入力するだけで済みます。

feign-plusは特定のhttpclientへの切り替えもサポートしています。デフォルトはokhttp3ですが、以下の設定で変更できます。

# default(okhttp3)
feign.httpclient=http2Client

もちろん、他にも関連する構成はあります:

feign.plus.max-idle-connections = 520
feign.plus.connect-timeout = 11000
feign.plus.read-timeout = 12000

実装

spring-cloud-openfeign その方法について簡単にお話しして終わりにしましょう。

top.crossoverjie.feign.plus.factory.FeignPlusBeanFactory その中で最も中心的なものはクラスです。

org.springframework.beans.factory.FactoryBeanこのクラスはインターフェイスを実装し、オブジェクトを返す getObject() メソッドをオーバーライドします。

このコードはFeignの公式デモです。

ここで返されるオブジェクトは、実際には定義されたインターフェイスのプロキシであり、オブジェクト自体は Feign ですので、さらに続けます: http リクエストのコーディングとデコード、リクエストの開始などのロジックは、この feign オブジェクトによってプロキシされます。

HardCodedTarget は Feign が最終的なリクエストをプロキシするために内部的に使うオブジェクトです。

Feignは複数のクライアントをサポートしているので、クライアントは設定ファイルによって動的に指定することができます。

@ConditionalOnExpression SpringBootが提供するアノテーションにより、設定に基づいて使用するhttpclientを動的に選択する、つまり生成するBeanを動的に選択することができます。

要約

このライブラリのロジックは非常にシンプルで、本質的にFeignをカプセル化し、SpringBootのサポートを提供します。

Feign-plusのソースコード:github.com/crossoverJi...

Read next

JavaScriptで変数がオブジェクトか配列かを判断する方法

1.基本 上で示したように、今のところ全部で8つの型があり、基本型と参照型の2つに大きく分かれています。 typeof演算子は、未計算のオペランドの型を表す文字列を返します。 typeとtypeofの対応を以下に示します。 typeofの戻り値とJavaSc...

May 30, 2020 · 4 min read