前の記事では、RestTemplateを介して他のサービスのAPIを呼び出すとき、要求されたURLに必要なパラメーターをスプライスする必要があることがわかります。パラメーターが少ない場合、それを許容できる場合があります。複数のパラメーターがあると、リクエスト文字列をスプライシングすることは非効率的で愚かに思えます。
それで、より良い解決策はありますか?答えは確かであり、Netflixは私たちにフレームワークを提供してくれました:Feign。
Feignは宣言的なWebサービスクライアントであり、その目的はWebサービス通話をよりシンプルにすることです。 Feignは、HTTPリクエストのテンプレートを提供します。シンプルなインターフェイスと挿入注釈を記述することにより、HTTPリクエストのパラメーター、フォーマット、アドレス、その他の情報を定義できます。
FeignはHTTPリクエストを完全にプロキシにします。また、サービス要求と関連する処理を完了する方法を呼び出すように呼び出す必要があります。 FeignはRibbonとHystrixを統合します(Hystrixについては後で説明します)。そのため、これら2つのコンポーネントを明示的に使用できなくなりました。
要するに、Feignには次の特性があります。
これは、SpringMVCパターンのコントローラーレイヤーの要求マッピングマッピングに少し似ています。このパターンは私たちが本当に好きなものです。 Feignは@feignclientを使用してサービスをマッピングします。
まず、最初のステップは、元のベースで新しいPeignモジュールを作成してから、関連する依存関係を導入し、依存関係を導入することです。これにより、次のようにHystrixの依存関係が自動的に導入されます。
<Dependency> groupId> org.springframework.cloud </groupid> <artifactid> spring-cloud-starter-eureka </artifactid> <バージョン> 1.3.5. release </version> </dependency> <deplency> <groupid> org.springframework.cloud < <バージョン> 1.4.0.Release </version> </dependency>
Application.yml構成は次のとおりです。
サーバー:ポート:8083Spring:アプリケーション:名前:Feign-Consumereureka:client-client-url:defaultzone:http:// localhost:8888/eureka/、http:// localhost:8889/eureka/
次に、前の記事では、次のコードに示すように、2つのProvider1およびProvider2 Modulesサービスにいくつかの新しい方法が追加されます。
/*** 2018/5/8にコングによって作成されました。 */ @retscontrollerpublic class hellocontroller {@requestmapping( "/hello")public string hello(){system.out.println( "アクセスCOMES 1 ..."); 「hello1」を返します。 } @RequestMapping( "/hjcs")public list <string> laowangs(string ids){list <string> list = new ArrayList <>(); list.add( "laowang1"); list.add( "laowang2"); list.add( "laowang3");返品リスト。 } // method @requestMapping(value = "/hellol"、method = requestmethod.get)public string hello(@requestparam string name){return "hello" + name; } @RequestMapping(value = "/hello2"、method = requestmethod.get)public user hello(@requestheader string name、 @requestheader integer age){return new user(name、age); } @requestMapping(value = "/hello3"、method = requestmethod.post)public string hello(@requestbody user user){return "hello"+ user。 getname() + "、" + user。 getage(); }}次は、上記のコードに必要なユーザークラスです。コードは次のとおりです。
/*** CONG 2017/12/2によって作成されました。 */public class user {private string name;民間整数年齢; //送信をシリアル化するときは空のコンストラクターが必要です。そうしないと、エラーが発生します。 public user(){} public user(string name、integer age){this.name = name; this.age = age; } public string getname(){return name; } public void setName(string name){this.name = name; } public Integer getage(){return age; } public void Setage(整数年齢){this.age = age; }}次に、Feignの@feignclient( "Service Name")を使用して、サービスコールをマッピングします。コードは次のとおりです。
パッケージhjc; import org.springframework.cloud.netflix.feign.feignclient; Import org.springframework.web.bind.annotation。 */// configuration = xxx.classこのクラスは、Hystrixのいくつかの正確なプロパティを構成します@RequestMapping(value = "/hellol"、method = requestmethod.get)string hello(@requestparam( "name")string name); @RequestMapping(value = "/hello2"、method = requestmethod.get)ユーザーhello(@requestheader( "name")string name、 @requestheader( "age")integer age); @RequestMapping(value = "/hello3"、method = requestmethod.post)string hello(@requestbodyユーザー);}
次に、Feiserviceインターフェイスをコントローラーレイヤーに注入して、リモートサービスコールを実行します。コードは次のとおりです。
/*** 2018/5/17にCONGによって作成されました。 */ @retscontrollerpublic class consumercontroller {@autowired feignservice feignservice; @RequestMapping( "/consumer")public string helloconsumer(){return feignservice.hello(); } @RequestMapping( "/consumer2")public string helloconsumer2(){string r1 = feignservice.hello( "hjc");文字列r2 = feignservice.hello( "hjc"、23).toString();文字列r3 = feignservice.hello(new user( "HJC"、23)); R1 + "-----" + r2 + "----" + r3; }}次に、Feign ModuleのStartup Class @EnabledIsCoveryClient Client AnnotationでEurekaクライアントにアノテートする場所
@EnableFeignClients、コードは次のとおりです。@SpringBootApplication@enabledisCoveryClient@enableFeignClientsspublic class feignApplication {public static void main(string [] args){springApplication.run(feignapplication.class、args); }}次に、スタートアップクラスを開始し、BrowserにLocalHost:8083/Consumerを入力し、実行中の結果は次のとおりです。
ロードバランスポーリングがHello1とhello2に表示されることがわかります。
次に、ブラウザにlocalhost:8083/consumer2を入力し続けます。実行中の結果は次のとおりです。
次に、Peign宣言コールサービスの下でサービスのダウングレードを使用します。次に、Feiserviceを継承するために新しいFiingfallbackクラスを作成する必要があります。コードは次のとおりです。
パッケージhjc; Import org.springframework.stereeotype.component;/*** 2018/5/17にCONGによって作成されました。 */ @componentPublic Class Feignfallback Implements FeignService {//実装方法は、ダウングレードのサービス方法です@Override public String hello(){return "error"; } @Override public String hello(string name){return "error"; } @Override public user hello(string name、integer age){return new user(); } @Override public String hello(user user){return "error"; }}次に、2つのサービスプロバイダーモジュールProvider1とProvider2モジュールを停止します。実行中の結果は次のとおりです。
私たちの通話にはすべて格下げされたサービスがあることがわかります。
次に、Hystrixのパラメーターを正確に制御する場合(たとえば、Hystrixと組み合わせたパラメーター)が、feignclient Annotationで構成= xxx class.class属性を構成して、どのクラスでプロパティを指定します。
または、次のように、application.ymlで構成します。
Hystrix:コマンド:デフォルト:デフォルト:実行:分離:スレッド:TimeoutinMilliseConds:5000Ribbon:ConnectTimeOut:500#以下のように、別のサービスを詳細に構成する場合、hello-service:ribbon:connecttimeout:500
これは私たちのシナリオのほとんどの呼び出しを満たしますが、素晴らしいシナリオを書く場合、ネイティブヒスストリックスを使用して以前のHystrixの使用に従う必要があります。次のように、feignクライアントの呼び出しを使用しないでください。
/*** 2018/5/17にCONGによって作成されました。 */public class hjccommandはhystrixcommandを拡張します{Protected hjccommand(hystrixcommandgroupkeyグループ){super(group); } @Override保護されたオブジェクトrun()スロー例外{return null; }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。