@RibbonClient 和@LoadBalanced 之间的区别
Difference between @RibbonClient and @LoadBalanced
我理解 @LoadBalanced
指示 Rest 模板应基于使用 Ribbon 的客户端负载平衡并检查 Eureka 服务器以将服务名称解析为 host/port。
@RibbonClient
有什么用。是不是在没有Eureka的情况下支持原生的Ribbon Client LB,在配置了DiscoveryEnabledNIWSServerList
的情况下也支持Eureka Discover?
RestTemplate
支持负载均衡,using @LoadBalanced
告诉SpringCloud我们要利用它的负载均衡支持(如果你使用Ribbon那么使用@的效果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
}
}
TL;DR: @LoadBalanced
是一个标记注释 & @RibbonClient
用于配置目的。
@LoadBalanced
用作标记注释,指示带注释的 RestTemplate
应使用 RibbonLoadBalancerClient
与您的服务进行交互。
反过来,这允许您将 "logical identifiers" 用于传递给 RestTemplate
的 URL。这些逻辑标识符通常是服务的名称。例如:
restTemplate.getForObject("http://some-service-name/user/{id}", String.class, 1);
其中 some-service-name
是逻辑标识符。
@RibbonClient
用于配置您的功能区客户端。
是否需要@RibbonClient?
没有!如果您正在使用服务发现并且您对所有默认功能区设置都满意,您甚至不需要使用 @RibbonClient
注释。
什么时候应该使用@RibbonClient
?
至少有两种情况需要使用@RibbonClient
- 您需要为特定的功能区客户端自定义功能区设置
- 您没有使用任何服务发现
自定义功能区设置:
定义一个@RibbonClient
@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
name
- 将其设置为与您使用 Ribbon 调用的服务相同的名称,但需要对 Ribbon 如何与该服务交互进行额外的自定义。
configuration
- 将其设置为 @Configuration
class,并将所有自定义设置定义为 @Beans
。确保这个 class 没有被 @ComponentScan
选择 否则它将覆盖所有功能区客户端的默认值。
请参阅 Spring Cloud Netflix 文档中的“自定义 RibbonClient”部分 (link)
在没有服务发现的情况下使用功能区
如果您不使用服务发现,@RibbonClient
注释的 name
字段将用于在 application.properties
和 "logical identifier" 在 URL 你传递给 RestTemplate
.
定义一个@RibbonClient
@RibbonClient(name = "myservice")
然后在你的 application.properties
myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001
我理解 @LoadBalanced
指示 Rest 模板应基于使用 Ribbon 的客户端负载平衡并检查 Eureka 服务器以将服务名称解析为 host/port。
@RibbonClient
有什么用。是不是在没有Eureka的情况下支持原生的Ribbon Client LB,在配置了DiscoveryEnabledNIWSServerList
的情况下也支持Eureka Discover?
RestTemplate
支持负载均衡,using @LoadBalanced
告诉SpringCloud我们要利用它的负载均衡支持(如果你使用Ribbon那么使用@的效果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
}
}
TL;DR: @LoadBalanced
是一个标记注释 & @RibbonClient
用于配置目的。
@LoadBalanced
用作标记注释,指示带注释的 RestTemplate
应使用 RibbonLoadBalancerClient
与您的服务进行交互。
反过来,这允许您将 "logical identifiers" 用于传递给 RestTemplate
的 URL。这些逻辑标识符通常是服务的名称。例如:
restTemplate.getForObject("http://some-service-name/user/{id}", String.class, 1);
其中 some-service-name
是逻辑标识符。
@RibbonClient
用于配置您的功能区客户端。
是否需要@RibbonClient?
没有!如果您正在使用服务发现并且您对所有默认功能区设置都满意,您甚至不需要使用 @RibbonClient
注释。
什么时候应该使用@RibbonClient
?
至少有两种情况需要使用@RibbonClient
- 您需要为特定的功能区客户端自定义功能区设置
- 您没有使用任何服务发现
自定义功能区设置:
定义一个@RibbonClient
@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
name
- 将其设置为与您使用 Ribbon 调用的服务相同的名称,但需要对 Ribbon 如何与该服务交互进行额外的自定义。configuration
- 将其设置为@Configuration
class,并将所有自定义设置定义为@Beans
。确保这个 class 没有被@ComponentScan
选择 否则它将覆盖所有功能区客户端的默认值。
请参阅 Spring Cloud Netflix 文档中的“自定义 RibbonClient”部分 (link)
在没有服务发现的情况下使用功能区
如果您不使用服务发现,@RibbonClient
注释的 name
字段将用于在 application.properties
和 "logical identifier" 在 URL 你传递给 RestTemplate
.
定义一个@RibbonClient
@RibbonClient(name = "myservice")
然后在你的 application.properties
myservice.ribbon.eureka.enabled=false
myservice.ribbon.listOfServers=http://localhost:5000, http://localhost:5001