web-dev-qa-db-ja.com

@RibbonClientと@LoadBalancedの違い

@LoadBalancedは、Restテンプレートがリボンを使用したクライアント側の負荷分散に基づいていることを示し、Eurekaサーバーをチェックしてサービス名をホスト/ポートに解決することを示しています。

@RibbonClientの使用法は何ですか。 Eurekaを使用せずにネイティブのリボンクライアントLBをサポートし、DiscoveryEnabledNIWSServerListで構成された場合にEureka Discoverもサポートするのですか?

20
jack

TL; DR@LoadBalancedはマーカー注釈であり、@RibbonClientは設定目的で使用されます。


@LoadBalanced

注釈付きRestTemplateがサービスと対話するためにRibbonLoadBalancerClientを使用する必要があることを示すマーカー注釈として使用されます。

これにより、RestTemplateに渡すURLに「論理識別子」を使用できます。これらの論理識別子は通常、サービスの名前です。例えば:

restTemplate.getForObject("http://some-service-name/user/{id}", String.class, 1);

ここで、some-service-nameは論理識別子です。

@RibbonClient

リボンクライアントの構成に使用されます。

@ RibbonClientが必要ですか?

いや! Service Discoveryを使用していて、デフォルトのすべてのリボン設定で問題なければ、@RibbonClientアノテーションを使用する必要さえありません。

いつ@RibbonClient?を使用すべきか

@RibbonClientを使用する必要がある場合が少なくとも2つあります

  1. 特定のリボンクライアントのリボン設定をカスタマイズする必要があります
  2. サービス検出を使用していません

リボン設定のカスタマイズ:

@RibbonClientを定義します

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name-リボンで呼び出しているサービスと同じ名前に設定しますが、リボンがそのサービスとやり取りする方法をさらにカスタマイズする必要があります。
  • configuration-すべてのカスタマイズを@Configurationとして定義した@Beansクラスに設定します。このクラスではない@ComponentScanによって選択されていることを確認してください。そうでない場合、すべてのリボンクライアントのデフォルトがオーバーライドされます。

Spring Cloud Netflixドキュメントの「RibbonClientのカスタマイズ」セクションを参照してください (link)

サービス検出なしでリボンを使用する

Service Discoveryを使用していない場合は、@RibbonClientアノテーションのnameフィールドを使用して、application.propertiesの構成のプレフィックスと、URLの「論理識別子」を使用します。 RestTemplateに渡します。

@RibbonClientを定義します

@RibbonClient(name = "myservice")

その後、application.properties

myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
41
dustin.schultz

RestTemplateは負荷分散をサポートします。@LoadBalancedを使用すると、Spring Cloudに負荷分散サポートを利用したいことを伝えます(リボンを使用している場合、@ LoadBalancedを使用するとRestTemplateはRibbionClientを使用しますサーバーのアドレスを取得します)。
LoadBalancerAutoConfigurationの動作を確認することもできます here

@ RibbonClients を使用すると、リボンクライアントに宣言的な構成を提供できます。

例えば。

@SpringBootApplication
@RestController
@RibbonClient(name = "app", configuration = RibbonConfig.class)
public class App {

  @LoadBalanced
  @Bean
  RestTemplate restTemplate(){
    return new RestTemplate();
  }
  //...
}

次に、RibbonConfig.classを作成して、リボン関連のBeanをオーバーライドします。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IPing;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.PingUrl;
import com.netflix.loadbalancer.AvailabilityFilteringRule;

public class RibbonConfig {

  @Autowired
  IClientConfig ribbonClientConfig;

  @Bean
  public IPing ribbonPing (IClientConfig config) {
    return new PingUrl();//we override default Iping which is a NoOpPing
  }

  @Bean
  public IRule ribbonRule(IClientConfig config) {
    return new AvailabilityFilteringRule(); // we override the default ZoneAvoidanceRule
  }

}
3
sol4me