@RibbonClient和@LoadBalanced之间的区别

jac*_*ack 22 spring-boot netflix-ribbon spring-cloud-netflix

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

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

dus*_*ltz 45

TL; DR:@LoadBalanced是标记注释,@RibbonClient用于配置目的.


@LoadBalanced

用作标记注释,指示注释RestTemplate应使用a RibbonLoadBalancerClient来与您的服务进行交互.

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

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

some-service-name逻辑标识符在哪里.

@RibbonClient

用于配置Ribbon客户端.

是否需要@RibbonClient?

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

我应该什么时候使用@RibbonClient

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

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

自定义功能区设置:

定义一个 @RibbonClient

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

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

使用Ribbon而不使用Service Discovery

如果您未使用服务发现,则注释name字段@RibbonClient将用于application.properties在您传递到的URL中的"逻辑标识符"中添加配置前缀RestTemplate.

定义一个 @RibbonClient

@RibbonClient(name = "myservice")
Run Code Online (Sandbox Code Playgroud)

然后在你的 application.properties

myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
Run Code Online (Sandbox Code Playgroud)


sol*_*4me 6

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();
  }
  //...
}
Run Code Online (Sandbox Code Playgroud)

然后您创建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
  }

}
Run Code Online (Sandbox Code Playgroud)