すべてのプロダクト
Search
ドキュメントセンター

Enterprise Distributed Application Service:ロードバランシングの実装

最終更新日:Jan 07, 2025

Spring Cloud は、Ribbon コンポーネントを使用して負荷を分散します。 Ribbon は、コンシューマー側のソフトウェアロードバランシングアルゴリズムを提供します。 Spring Cloud では、Ribbon は RestTemplate および Feign クライアントの基盤となるレイヤーでロードバランシングを実装します。 このトピックでは、Ribbon を使用して Spring Cloud アプリケーションのロードバランシングを実装する方法について説明します。

背景情報

Nacos は Ribbon の機能を統合しています。 NacosServerList は、Ribbon によって提供される com.netflix.loadbalancer.ServerList インターフェースを実装しています。 このインターフェースは汎用的に使用されます。 Eureka、Consul、ZooKeeper などの他の同様のサービスディスカバリコンポーネントも、DomainExtractingServerList、ConsulServerList、ZookeeperServerList などの対応する ServerList インターフェースを実装しています。

インターフェースが実装されている場合、サービスは Spring Cloud ロードバランシングの一般的な仕様をサポートします。 サービスディスカバリソリューションで使用するツールを Eureka、Consul、または ZooKeeper から Spring Cloud Alibaba に変更する場合、コードを変更せずにロードバランシングを実装できます。 つまり、サービスディスカバリソリューションのために RestTemplate コード、FeignClient コード、または非推奨の AsyncRestTemplate のコードを変更する必要はありません。

説明 エンタープライズ分散アプリケーションサービス (EDAS) と Hystrix との互換性を確保するために、Hystrix の依存関係をクライアントに追加します。フォールバック属性をサポートしています。これは Sentinel によって実装できます。

このトピックの指示に従って、アプリケーションにロードバランシングを実装できます。 また、アプリケーションデモをダウンロードすることもできます。 service-provider および service-consumer

RestTemplate のロードバランシングを実装する方法は、Feign の方法とは異なります。 このトピックの以下のセクションでは、RestTemplate および Feign のアプリケーションロードバランシングを実装する方法について説明します。

RestTemplate

RestTemplate は、RESTful サービスにアクセスするために Spring Cloud によって提供されるクライアントです。 リモート HTTP サービスにアクセスするための複数の便利なメソッドを提供します。 これにより、より効率的にクライアントを記述できます。

RestTemplate のロードバランシングを実装するには、次の例に基づいてアプリケーションのコードを変更します。

public class MyApp {
    // @LoadBalanced アノテーションを使用してビルドされた RestTemplate クライアントを挿入します。
    // このアノテーションは、RestTemplate クライアントに次のインターセプターを追加します: LoadBalancerInterceptor。
    // LoadBalancerInterceptor は、内部で LoadBalancerClient インターフェースの実装クラス RibbonLoadBalancerClient を使用して負荷を分散します。
    @Autowired
    private RestTemplate restTemplate;

    @LoadBalanced // ロードバランシング機能を有効にするには、@LoadBalanced アノテーションを使用してビルドされた RestTemplate クライアントを変更します。
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    // RestTemplate クライアントはサービスを呼び出します。 ロードバランシングは内部で実装されています。
    public void doSomething() {
        Foo foo = restTemplate.getForObject("http://service-provider/query", Foo.class);
        doWithFoo(foo);
    }

    ...
}            

Feign

Feign は、RESTful API 呼び出しを簡素化するために Java で実装された Java HTTP クライアントです。

@EnableFeignClients および @FeignClient を使用して、ロードバランシングリクエストを開始します。

  1. @EnableFeignClients を使用して、Feign の機能を有効にします。
    @SpringBootApplication
    @EnableFeignClients // Feign の機能を有効にします。
    public class MyApplication {
      ...
    }                        
  2. @FeignClient を使用して、Feign クライアントをビルドします。
    @FeignClient(name = "service-provider")
    public interface EchoService {
            @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
            String echo(@PathVariable("str") String str);
    }                        
  3. EchoService を挿入し、echo メソッドを呼び出します。
    echo メソッドを呼び出すと、HTTP リクエストが開始されます。
    public class MyService {
    @Autowired // @FeignClient アノテーションを使用してビルドされた EchoService を挿入します。
        private EchoService echoService;
    
        public void doSomething() {
        // これは、http://service-provider/echo/test リクエストを開始する操作と同等です。
        echoService.echo("test");
            }
        ...
    }                        

結果の確認

service-consumer サービスと複数の service-provider サービスが開始された後、service-consumer によって提供される URL にアクセスして、ロードバランシングが実装されているかどうかを確認します。

  • RestTemplate

    /echo-rest/rest-test に複数回アクセスし、リクエストが異なるインスタンスに転送されているかどうかを確認します。

  • Feign

    /echo-feign/feign-test に複数回アクセスし、リクエストが異なるインスタンスに転送されているかどうかを確認します。