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

Serverless App Engine:ロード バランシングの実装

最終更新日:May 08, 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 のコードを変更する必要はありません。

説明 Serverless App Engine (SAE) と Hystrix との互換性を確保するために、クライアントに Hystrix の依存関係を追加してください。 fallback 属性をサポートしています。 これは Sentinel によって実装できます。

Alibaba Cloud Toolkit を使用すると、VPN 接続を確立することなく、相互呼び出しを使用して、SAE にデプロイされているオンプレミス アプリケーションとクラウド アプリケーションを相互接続できます。 これにより、開発効率を向上させることができます。

このトピックの指示に従って、アプリケーションにロード バランシングを実装できます。 また、アプリケーション デモをダウンロードすることもできます: 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 に複数回アクセスし、リクエストが異なるインスタンスに転送されているかどうかを確認します。