@RibbonClient和@LoadBalanced之间的区别

时间:2016-09-20 06:40:47

标签: spring-boot spring-cloud-netflix netflix-ribbon

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

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

2 个答案:

答案 0 :(得分:39)

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

@LoadBalanced

用作标记注释,指示带注释的RestTemplate应使用RibbonLoadBalancerClient与您的服务进行互动。

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

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

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

@RibbonClient

用于配置功能区客户端。

是否需要@RibbonClient?

没有!如果您正在使用Service Discovery,并且您可以使用所有默认功能区设置,则甚至无需使用@RibbonClient注释。

我应该何时使用@RibbonClient

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

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

    定义@RibbonClient

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

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

    使用不带服务发现的功能区

    如果您没有使用服务发现,name注释的@RibbonClient字段将用于在application.properties中配置前缀以及“{1}}中的”逻辑标识符“您传递给RestTemplate的网址。

    定义@RibbonClient

    @RibbonClient(name = "myservice")
    

    然后在application.properties

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

答案 1 :(得分:2)

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

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

E.g。

@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
  }

}