今回は、サービスを消費する方法をあなたと共有します。前の記事では、消費にfeignを使用することについて説明しています。この記事では、REST+リボン消費サービスを使用し、ポーリングを通じて簡単な消費コンポーネントをカスタマイズしています。この記事の目的は次のとおりです。消費サービスをカスタマイズするというアイデア。利点がある場合は、「いいね」をお願いします:
REST+リボンは消費者サービスを実現します
サービス消費者として、1)サービスの取得と2)通話サービスを区別するための2つの主要なプロセスを作成しました。では、サービスを取得する方法とサービスをどのように呼び出すか?以下の手動図を見てみましょう。
マニュアル図から、消費者が最初にサービスプロバイダーの実際のインターフェイスアドレスを取得し、次にアドレスを介してインターフェイスを呼び出すことがわかります。次に、マイクロサービスアーキテクチャの場合、特定のクラスIPまたはポートを取得してからインターフェイスを呼び出すことは間違いなくお勧めできないため、ServiceIDの概念がマイクロサービスに登場しました。単純なプロセスが導入されており、以下はそれを分析するための例です。最初に次のような依存関係を追加します:
<Dependency> groupId> org.springframework.boot </groupid> <artifactid> spring-boot-starter-web </artifactid> </dependency> <dependency> groupid> org.cloud </groupid> <artifactid> spring-cloud-eureka </artifactid> </artifactid>
Eureka_Server(サービスセンター)とEureka_Provider(サービスプロバイダー)を使用して、テストケースを実行しています。ここでは、eureka_consumer_ribbonモジュールを消費者サービスとして再定義します。最初にサービスレイヤークラスとコードを作成します。
@servicepublic class userserviceを実装しているuserinterface {@autowired保護されたrettemplate rettemplate; @Override public morp <list <mouser >> getusers(morq rq){return null; } @Override public String getMSG(){string str = retttemplate.getForObject( "http:// eureka-provider/msg"、string.class); strを返します。 }}主にrettemplate.getForObject関数を使用して、ページ上の取得したデータに応答するためにコントローラーを定義する必要があります。簡単にするには、GETMSGサービスインターフェイスを使用してテストしてください。
@RestControllerPublic Class UserController {@Autowired Private Userservice userservice; @getMapping( "/msg")public string getmsg(){return userservice.getMsg(); }}最後に、スタートアップクラスに次のコードを追加します。導入したeureka依存関係にはリボン(dalston.releaseバージョン)が含まれているため、 @loadbalancedタグを追加する必要があることに注意してください。リボンは、ロードバランスアルゴリズムをカプセル化します。この注釈が追加されていない場合、RESTメソッドのURLは利用可能なURLパスでなければなりません。もちろん、ここに注釈が追加されている場合は、上記のServiceIDを使用できます。
@springbootapplication @enablediscoveryclient //消費者クライアントパブリッククラスeurekaconsumerribbonapplication {@bean @loadbalanced // load balancing lesttemplate rettemplate(){return new resttemplate(); } public static void main(string [] args){springApplication.run(eurekaconsumerribbonapplication.class、args); }}以下は、消費者によって表示される効果です。
REST+POLLカスタムシンプルな消費コンポーネント
カスタム消費コンポーネントは、フェイスマニュアル図面とほぼ同じです。最初にサービスプロバイダーの実際のインターフェイスアドレスを取得し、次にRESTでURLを呼び出して対応する結果出力を取得することです。これは、Shenniubanlanceコンポーネントクラスです。
/** * Shenniuが2018/6 * <p> * Rest+Eureka+Custom Client */ @componentPublicクラスShenniubanlance {@autowired privateRestTemplateRestTemplate; @Autowired Private DiscoveryClient DiscoveryClient; / ** * Real Address ConcurrentHashmap <"Service Application name"、( "Real Interface IP"、訪問数)> */ public static concurrenthashmap <string、list <moservice >> servicesmap = new concurrenthashmap <>(); /** *マップするサービスプロバイダー情報を設定 */public void setServicesMap(){//すべてのサービスプロバイダーアプリケーションリスト<String> appNames = discoveryClient.getServices(); //(string appname:appnames){//サービスプロバイダーリストの情報を取得する実際のアドレスをmap for(serviceinstance> instanceinfos = discoveryclient.getInstances(appname); if(instanceinfos.isempty()){継続; } list <Moservice> services = new ArrayList <>(); instanceInfos.foreach(b-> {moservice service = new moservice(); //アクセス済みサービスの数。 //ある場合、servicesmap.put(appname.tolowercase()、services)を更新します。 }} / ** * app * * @param appname * @return * / public moservice choiceservicebyappname(string appname)throws exception {appname = appname.tolowercase(); //いくつかのアプリサービスコレクションリスト<Moservice> ServiceMap = ServicesMap.get(AppName); if(servicemap == null){//すべてのアプリサービスsetServicesMap();を初期化します。 servicemap = servicesmap.get(appname); if(servicemap == null){新しい例外をスロー( " + appname +"関連サービス "); }} //訪問数の最小数Moservice Moservice = servicemap.stream()。min(comparator.comparing(moservice :: getWatch)).get(); //レコードをロード+1 moservice.setwatch(moservice.getwatch() + 1); Moserviceを返します。 } / ** *サービスプロバイダー情報を自動的に更新してマップ * / @scheduled(sixtdelay = 1000 * 10)public void refreshServicesMap(){setServicesMap(); } / ** *リクエストサービスを取得して返品データを取得しますtry {//フィルターを取得して、実際のサービスMoservice Service = ChoicesErviceByAppName(AppName)を取得します。 // Service StringのURLをリクエストしますapiurl = service.geturl() + "/" + servicename; System.out.println(apiurl); result = map!= null? RESTTEMPLATE.getForObject(apiurl、tclass、map):retttemplate.getForObject(apiurl、tclass); } catch(Exception ex){ex.printstacktrace(); } return result; } / ***サービス情報* /パブリッククラスMoservice { / ***ロードレコードの数* /プライベートロングウォッチ; /** *実際のインターフェイスアドレス:http://xxx.com/api/add */private string url; public long getWatch(){return Watch; } public void setwatch(long watch){this.watch = watch; } public string geturl(){return url; } public void seturl(string url){this.url = url; }}}上記は主な実装コードです。コードロジック:サービスプロバイダー情報をMap-に設定します。アプリに従ってポーリング方法を取得するために、サービスはサービスに返信データを取得するよう要求します。ポーリングの実装の原則は、各リクエスト後に自動的に+1であるロードレコード番号を使用することです。特定のサービスプロバイダーを取得する場合、最小値のインスタンスがレコード番号を介して除外され、実際のインターフェイスアドレスURLが保存されます。呼び出しはこのようにする必要があります(もちろん、注釈と呼ぶことができます):
@Override public String getMSG(){string str = banlance.getServicedata( "eureka-provider"、 "msg"、null、string.class); strを返します。 }ここでは、前のrettemplateにannotation @loadbalancedを追加したことに注意する必要があります。これにより、RESTリクエストは正常に応答するために非IP(つまりserviceID)でアクセスする必要があります。
簡単に言えば、負荷分散メカニズムがあるため、もうIPを使用する必要はありません。この注釈を削除すると、カスタマイズされたコンポーネントが正常に実行でき、レンダリングは例1のコンポーネントと同じであり、マップは貼り付けられません。
スケジュールを使用してサービスプロバイダー情報を更新します
マイクロサービスアーキテクチャでは、サービスがハングアップしている場合、クライアントのサービスキャッシュ情報を時間内に更新する必要があります。そうしないと、ダウンURLにリクエストする場合があります。この考慮事項に基づいて、EnableSchedタグを使用して時限リフレッシュを実行しました。最初に@EnablesCheDulingをスタートアップクラスに追加し、次のようなサービス情報をフラッシュするサービスを定義します。
/ ** *サービスプロバイダー情報を自動的に更新して、@scheduled(sixtdelay = 1000 * 10)public void refreshservicesmap(){setServicesMap(); }テスト効果を促進するために、サーバー、プロバイダー(2)、および消費者が開始されたとき、Port 2005でプロバイダーサービスを開始します。次に、消費者インターフェイスを更新して効果を確認します。
この時点で、2005年のポートを呼び出すインターフェイスが正常に呼び出されていることがわかります。最新または無効なサービスが@Scheduled Timed Serviceに追加された後、必要なもののニーズを満たします。このコンテンツがあなたに役立つと思うなら、それを気に入ってください、ありがとう。私はそれがすべての人の学習に役立つことを願っています、そして、私は誰もがwulin.comをもっとサポートすることを願っています。