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 のコードを変更する必要はありません。
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 を使用して、ロード バランシング リクエストを開始します。
- @EnableFeignClients を使用して、Feign の機能を有効にします。
@SpringBootApplication @EnableFeignClients // Feign の機能を有効にします。 public class MyApplication { ... }
- @FeignClient を使用して、Feign クライアントをビルドします。
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); }
- 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
に複数回アクセスし、リクエストが異なるインスタンスに転送されているかどうかを確認します。