追加された@LoadBalancedはIPを使用してリモートインターフェイスを呼び出すことができません

問題の背景

以前、別のモジュールのデータを呼び出す必要がある時限タスクを作成したので、RestTemplateを使用して呼び出し、構成ファイルでそのモジュールのアドレスを構成しました(レジストリのマイクロサービス名を使用))。 、および@Valueを介して使用場所に注入されます。最初は問題ありませんでしたが、同僚がログを記録しているときに、たまたま同じモジュールを使用していて、そのモジュールのアドレスも設定ファイルに書き込んでいましたが、ipの形式でした。彼は私がこの書き込みのように見えるのを見て、マイクロサービス名を使用して呼び出すように模倣しました。呼び出しが失敗したことを発見したため、コードに新しいRestTemplateを直接作成する方法に変更しましたが、構成ファイルのURLアドレスipformを使用するように変更されました。今日関数をテストしたところ、スケジュールされたタスクを常に実行できないことがわかりました。エラーが表示されたとき、そのような負荷分散インスタンスはないと表示されました。しばらく考えて発見した後、構成ファイルの構成が変更されたことがわかりました。つまり、元のマイクロサービス名がipに変更されました。そこでエラーを報告しましたが、自分で考えた結果、ipを使用して@LoadBalancedアノテーションを呼び出すことができないことがわかりました。したがって、問題の原因を見つければ、後で簡単に解決できます。

@LoadBalancedアノテーションの説明

マイクロサービスアプリケーションを開発する場合、サービス間で相互に呼び出しを行うことは避けられません。通常、RestTemplateを使用してリモート呼び出しを行います。ただし、次のように、RestTemplateをSpringコンテナに入れるときに注意が必要な問題があります。

@Configuration
public class ApplicationContextConfig {
    
    
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
    
    
        return new RestTemplate();
    }
}

@LoadBalancedアノテーションを使用して、リモート呼び出しを使用するときに負荷分散戦略を使用する必要があることを示します。負荷分散は、実際には同じサービスでクラスターが存在する場合に使用されることがわかっています。したがって、開発では、@ LoadBalancedアノテーションを使用する場合、RestTemplateによって提供されるgetForObject()またはexchange()メソッドを使用するときに、URLをIPアドレスにすることはできませんが、レジストリ
なぜ?負荷分散が呼び出されると、このインターフェイスを提供するサービスがレジストリに複数存在するためです。リボンがカプセル化されている場合、負荷分散効果を提供するために、レジストリ内のサービス名でのみ呼び出すことができます。

したがって、RestTemplateを使用する場合、一部のシナリオでは、ipを使用して呼び出すだけで(サードパーティのインターフェイスサービスの呼び出しなど)、現時点ではRestTemplateに@LoadBanlancedの注釈を付けることはできませんもう1つの方法は、RestTemplateを使用する必要がある新しいRestTemplateオブジェクトを直接作成することです。次のように

public void test(){
    
    
	RestTemplate restTemplate = new RestTemplate();
	restTemplate.exchange("接口地址",xxx,xxx,xxx);//这里的接口地址就可以直接放协议+ip+端口,原理与上面一样
}

おすすめ

転載: blog.csdn.net/qq_41570752/article/details/113647958