33

我理解@LoadBalanced表示 Rest 模板应该基于使用 Ribbon 的客户端负载平衡,并检查 Eureka 服务器以将服务名称解析为主机/端口。

有什么用@RibbonClient。是否支持没有 Eureka 的本地 Ribbon Client LB,并且在配置时也支持 Eureka Discover DiscoveryEnabledNIWSServerList

4

2 回答 2

65

TL;DR :@LoadBalanced是一个标记注释 &@RibbonClient用于配置目的。


@LoadBalanced

用作标记注释,指示注释RestTemplate应使用 aRibbonLoadBalancerClient与您的服务交互。

反过来,这允许您对传递给RestTemplate. 这些逻辑标识符通常是服务的名称。例如:

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

其中some-service-name是逻辑标识符。

@RibbonClient

用于配置您的功能区客户端。

@RibbonClient 是必需的吗?

不!如果您使用的是服务发现并且您可以使用所有默认功能区设置,您甚至不需要使用@RibbonClient注释。

我应该什么时候使用@RibbonClient

至少有两种情况需要使用@RibbonClient

  1. 您需要为特定功能区客户端自定义功能区设置
  2. 您没有使用任何服务发现

自定义功能区设置:

定义一个@RibbonClient

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name- 将其设置为与您使用 Ribbon 调用的服务相同的名称,但需要对 Ribbon 如何与该服务进行交互进行额外的自定义。
  • configuration- 将其设置为@Configuration所有自定义定义为的类@Beans。确保该类未被拾取,@ComponentScan否则它将覆盖所有功能区客户端的默认值。

请参阅 Spring Cloud Netflix 文档(链接)中的“自定义 RibbonClient”部分

在没有服务发现的情况下使用功能区

如果您不使用服务发现,注释的name字段@RibbonClient将用于在application.properties您传递给的 URL 中为您的配置以及“逻辑标识符”添加前缀RestTemplate

定义一个@RibbonClient

@RibbonClient(name = "myservice")

然后在你的application.properties

myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
于 2017-03-25T22:33:42.613 回答
7

RestTemplate支持负载均衡,using@LoadBalanced 告诉 Spring Cloud 我们想要利用它的负载均衡支持(如果你使用 Ribbon 那么使用 @LoadBalanced 的效果是 RestTemplate 将使用 RibbionClient 获取服务器地址)。 您还可以在此处
查看 LoadBalancerAutoConfiguration 的工作原理

使用@RibbonClients,您可以为功能区客户端提供声明性配置。

例如

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

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

然后您创建RibbonConfig.class以覆盖任何与 Ribbon 相关的 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
  }

}
于 2016-09-20T09:56:26.970 回答