以前のブログ投稿では、ユーレカ+リボン+ヒスストリックスフレームワークを作成しました。基本的にサービス間の通話を満たすことができますが、コードは本当に醜く見えます。クライアントは、毎回レストテンプレートを書く必要があります。通話をより美しく読みやすくするために、私たちは今、feignを使用することを学んでいます。
Peignには、リボンとHystrixが含まれています。これは、実際の戦闘で徐々にその重要性を経験しています。いわゆるインクルージョンは、リボンやヒストリックスの瓶パッケージを含むFeignのJARパッケージの物理的な包含ではなく、他の2つの機能を含むFeignの機能を論理的に含めることです。要するに、FeignはRibbonとHystrixについてのことを行うことができますが、リボンとヒスストリックスによってもたらされた注釈を使用するには、対応するJARパッケージを導入する必要があります。
ケース1:
eureka登録センター:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
サービスプロバイダー:https://github.com/yejingtao/forblog/tree/master/demo-feign-freeService
サービス発信者:https://github.com/yejingtao/forblog/tree/master/demo-feign-freeconsumer
サービスプロバイダーはシンプルなeurekaclient+Webアプリケーションであり、次の方法を提供します
@RestController @RequestMapping( "/feign-service")パブリッククラスHelloservicecontorller {private logger logger = loggerfactory.getLogger(this.getClass());プライベートボイドスリープ(String MethodName){int sleepmintime = new Random()。nextint(3000); logger.info( "helloservice"+methodname+"sleepmintime:"+sleepmintime); {thread.sleep(sleepmintime); } catch(arturnedexception e){e.printstacktrace(); }} @requestMapping(value = "/serviceget"、method = requestmethod.get)public string helloservice(@requestparam string name){sleep( "get"); "helloserviceimpl name:"+name; } @RequestMapping(value = "/servicehead"、method = requestmethod.head)public string helloservice(@requestheader string name、 @requestheader string password){sleep( "header"); "helloservicehead名:"+name+"パスワード:"+パスワード; } @RequestMapping(value = "/servicepost"、method = requestmethod.post)public string helloservice(@requestbody userdemo userdemo){sleep( "post"); return userdemo.toString(); }}注意を払う必要がある次の注釈は省略できません。
@RequestParam:メソッドパラメーターをWebリクエストパラメーターにバインドする必要があることを示す注釈
@RequestBody:MethodParameterを示す注釈は、Webリクエストの本文にバインドする必要があります。
@RequestHeader:メソッドパラメーターをWebリクエストヘッダーにバインドする必要があることを示す注釈。
上記の注釈が欠落している場合、サービスは実行後にエラーを報告しませんが、エントリパラメーターを取得できません。
サービス発信者プロジェクト:
<Dependency> groupId> org.springframework.cloud </groupId> <artifactid> spring-cloud-starter-feign </artifactid> </dependency>
feignはここでのみ依存しており、リボンやヒスストリックスではありません。
Application.yml:
サーバー:ポート:9051スプリング:アプリケーション:名前:DEMO-FIGN-FREECONSUMER EUREKA:クライアント:serviceUrl:defaultzone:http:// peer1:1111/eureka/、http:// peer2:1112/eureka/feign:hystrix:eadablea
Hystrixの構成は、私を長い間だましてきました。私が使用したスプリングクラウドは、インターネット上の他の素材のバージョンよりも新しいDalstonバージョンSR1です。新しいバージョンでは、Hystrixに対するFeignのサポートはデフォルトでオフになるため、feign.hystrix.enabledを手動でオンにする必要があります。
アプリケーションスタータープログラム
@SpringBootApplication @ENABLEDEUREKACLIENT @ENABLEFEIGNCLIENT PUBLIC CLASS DEMOFEIGNAPPLICATION {public static void main(string [] args){springApplication.run(demofeignapplication.class、args); }}ここに別の落とし穴があることに注意してください。 @SpringCloudApplicationの代わりに @SpringBootApplication+ @enableTeureKaclientを使用しています。後者には@EnableCircuit Breakerが含まれており、 @EnableCircuit BreakerがHystrixパッケージのコンテンツです。私のPOMはHystrixを導入しません。したがって、この点に関して、Spring Cloudにはまだ欠点があります。 @SpringCloudApplicationと直接コンパイルしてエラーを報告することはありませんが、開始することはできません。もちろん、ここの主人公はまだnotation @enablefeignclientsです。
コアクライアントコード
@feignclient(name = "demo-feign-freeservice"、fallback = demofeignfallback.class)public interface demofeignservice {@requestmapping(value = "/feign-service/serviceget"、method = requestmethod.get)string helloservice(@requestparam( "name")string); @RequestMapping(value = "/feign-service/servicehead"、method = requestmethod.head)string helloservice(@requestheader( "name")string name、@requestheader( "password")string password); @RequestMapping(value = "/feign-service/servicepost"、method = requestmethod.post)string helloservice(@requestbody userdemo userdemo); } @FeignClient Annotationは、インターフェイスがFeignクライアントであることを定義し、名前はEurekaに登録されているサービス名を指定し、Fallbackはサービスの格下げ後にインターフェイス実装クラスです。
@RequestMappingリクエストの相対URLおよびHTTPリクエストメソッドを指定します。これはサーバーに1つずつ対応します。 @RequestParam、
@RequestBodyと@RequestHeaderアノテーションには、サーバーよりも価値のある属性があります。ここでは省略できません。彼らは、パラメーターにどのように対応するかを偽のクライアントに明示的に通知する必要があります。
ダウングレードサービスコード:
@component public class demofeignfallbackを実装するDemofeignService {@Override public string helloService(string name){return "get error"; } @Override public string helloservice(string name、string password){return "head error"; } @Override public String helloservice(userdemo userdemo){return "post error"; }}これらの注釈の本質的な重要性は、@RequestParam、@RequestBody、および@Requestheaderアノテーションを意図的に削除したことがわかりました。なぜなら、これらの注釈の重要な重要性は、マイクロサービスコールを作成する際にFeignパラメーターをHTTPに渡すために使用することであるが、サービスのダウングレードはHTTPの要求にならないということです。
コントローラーコード:
@RestController public class demofeigncontroller {@autowired private demofeignservice demofeignservice; @RequestMapping(value = "/test"、method = requestmethod.get)public string demoservicetest(){stringbuffer sb = new StringBuffer(); sb.append(demofeignservice.helloservice( "yuanyuan")); sb.append( "/n"); sb.append(demofeignservice.helloservice( "yjt"、 "xixihaha")); sb.append( "/n"); sb.append(demofeignservice.helloservice(new userdemo( "yejingtao"、 "123456"))); return sb.tostring(); }}効果を見てみましょう:
私たちのサービスはタイムアウトせず、3つの方法はすべて正常でしたが、ヘッドリクエストには返品値が得られませんでした。これは、ヘッドメソッドHTTPリクエストの特性によって決定されます。頭は応答の本体を返さず、一般に接続テストに使用されます。
別のセットを見てみましょう:
ヘッドおよびポストリクエストの方法は2000m以上処理されており、サービスは格下げされており、実装はフォールバック処理クラスに置き換えられます。
1つの場合、サービスプロバイダーとサービス発信者の間に重複コードがあると常に感じています。最適化できますか?ケース2を参照してください。
ケース2:
eureka登録センター:https://github.com/yejingtao/forblog/tree/master/demo-eureka-register
インターフェイスAPI:https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceapi
サービスプロバイダー:https://github.com/yejingtao/forblog/tree/master/demo-feign-serviceimpl
サービス発信者:https://github.com/yejingtao/forblog/tree/master/demo-feign-apicconsumer
ケース2の最大の変更は、サービス機能を個別にAPIプロジェクトに書き込むことであり、発信者とプロバイダーの両方がこのAPIに依存しています。
API:
public interface helloservice {@requestmapping(value = "/feign-service/serviceget"、method = requestmethod.get)string helloservice(@requestparam( "name")string name); @RequestMapping(value = "/feign-service/servicehead"、method = requestmethod.head)string helloservice(@requestheader( "name")string name、@requestheader( "password")string password); @RequestMapping(value = "/feign-service/servicepost"、method = requestmethod.post)string helloservice(@requestbody userdemo userdemo); }サービスプロバイダー:
@RestController public class helloservicecontorllerはHelloService {private logger = loggerfactory.getLogger(this.getClass());プライベートボイドスリープ(String MethodName){int sleepmintime = new Random()。nextint(3000); logger.info( "helloservice"+methodname+"sleepmintime:"+sleepmintime); {thread.sleep(sleepmintime); } catch(arturnedexception e){e.printstacktrace(); }} @Override public string helloservice(@requestparam( "name")string name){sleep( "get"); "helloserviceimpl name:"+name; } @Override public String HelloService(@RequestHeader( "name")String name、@RequestHeader( "Password")String Password){Sleep( "Header"); "helloservicehead名:"+name+"パスワード:"+パスワード; } @Override public String HelloService(@RequestBody userdemo userdemo){sleep( "post"); return userdemo.toString(); }}サービス発信者:
@feignclient(name = "demo-feign-serviceimpl"、fallback = feignservicefallback.class)public interface feignservice extends helloservice {}他のコードは基本的に変更されておらず、効果は同じです。
2つのスタイルには独自の利点と短所があります。フリースタイルはより無料で、サーバーに追加された新しい方法はクライアントコードに影響しません。欠点は、サービス機能が同期されておらず、サービス機能の変更が異常を引き起こすことです。 API形式のサーバークライアントサービス機能は同期されていますが、インターフェイスの変更には両側のコードの変更が必要であり、それらを構築するときは明確に考慮する必要があります。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。