当前位置: 首页 > 知识库问答 >
问题:

@RibbonClient和@LoadBalanced之间的差异

须景胜
2023-03-14

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

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

共有2个答案

商风华
2023-03-14

restemplate支持负载平衡,使用@LoadBalanced告诉Spring Cloud我们希望利用其负载平衡支持(如果您使用的是Ribbon,则使用@LoadBalanced的效果是restemplate将使用RibbionClient获取服务器地址)
您还可以在此处检查LoadBalancer自动配置的工作方式

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

例如。

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

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

然后创建RibbonConfig。类来重写任何与功能区相关的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
  }

}

韦阳晖
2023-03-14

TL;DR:@LoadBalanced是一个标记注释

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

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

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

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

用于配置功能区客户端。

是否需要@RibbonClient?

不!如果您使用的是Service Discovery,并且您可以使用所有默认的Ribbon设置,则甚至不需要使用@RibbonClient注释。

我应该何时使用@RibbonClient

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

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

自定义功能区设置:

定义一个@RibbonClient

@RibbonClient(name = "some-service", configuration = SomeServiceConfig.class)
  • name-将其设置为使用Ribbon调用的服务的相同名称,但需要对Ribbon如何与该服务交互进行其他自定义

请参阅Spring Cloud Netflix文档(链接)中的“定制RibbonClient”一节

在没有服务发现的情况下使用Ribbon

如果未使用服务发现,则将使用@RibbonClient注释的名称字段作为应用程序中配置的前缀。属性以及传递到restemplate的URL中的“逻辑标识符”。

定义一个@RibbonClient

@RibbonClient(name = "myservice")

然后在应用程序中。属性

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

 类似资料:
  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。 我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。 在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该

  • 我是Hadoop的新手。我正在浏览专业Hadoop解决方案的书,以获得一些关于Hadoop和生态系统的知识。我想澄清HDFS和HBase之间的主要区别是什么。我理解的方式就像两者都是存储系统。它们的区别只是在访问数据方面。HBase通过非关系型数据库访问数据,HDFS使用计算框架(MapReduce)处理数据。如果是这种情况,为什么我们不能只有一个存储HDFS或HBase。根据需求,他们将插入和插

  • 有人能解释一下 和 我不知道确切的意思。