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

@LoadBalanced RestTemplate以调用嵌套上下文endpoint

养鸿运
2023-03-14

下面的指南页非常棒,可以作为spring boot应用程序中功能区的基本情况。

https://spring.io/guides/gs/client-side-load-balancing/

一旦endpoint映射嵌套,该示例就停止工作-例如添加

@Request映射(value="/Welcome")

在班级层面

@RestController
@SpringBootApplication
@RequestMapping(value = "/welcome") //<------------- ADDED --->
public class SayHelloApplication {

  private static Logger log = LoggerFactory.getLogger(SayHelloApplication.class);

  @RequestMapping(value = "/greeting")
  public String greet() {

然后将客户端中的@LoadBalanced RestTemplate调用

String greeting = this.restTemplate.getForObject("http://say-hello/greeting", String.class);

String greeting = this.restTemplate.getForObject("http://say-hello/welcome/greeting", String.class);

当直接访问http://localhost:8090/welcome/greeting时,使用附加的stacktrace调用失败。将ribbon配置为对长的和嵌套的URLendpoint(如domain.com/x/y/z/p/q?)进行负载平衡请求的适当方式是什么

堆栈跟踪:

java.lang.IllegalStateException: No instances available for say-hello
    at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.execute(RibbonLoadBalancerClient.java:79) ~[spring-cloud-netflix-core-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:46) ~[spring-cloud-commons-1.1.1.RELEASE.jar:1.1.1.RELEASE]
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:85) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:69) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:596) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:557) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:264) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at hello.UserApplication.hi(UserApplication.java:31) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45]

共有2个答案

穆承运
2023-03-14

我还使用这个示例应用程序开始使用Ribbon,这很棒。

为了清楚起见,我想在设计上多花点时间:

    < Li >“/complete/user”文件夹下的用户应用程序是“客户端”应用程序,我们可以通过“curl http://{host}:8888”访问它;而“/complete/say-hello”文件夹下的say-hello应用程序是“服务提供商”。按照示例的说明,我们应该通过{host}:8090、{host}:9092和{host}:9999旋起3个实例——我们可以查看一下/complete/user/src/main/resources/application . yml; < li >嵌入在“客户端”用户应用程序中的Ribbon将通过默认ping策略维护一系列负载平衡服务实例(如果我们如上所述启动实例,这里将有3个实例),该策略将通过调用特定URL来定期Ping服务实例。默认情况下是“/”,我们可以在这里看到代码(同样,也可以通过指定URI来配置):< code > @ Bean public IPing ribbon ping(IClientConfig config){ return new PingUrl();} 现在,让我们回到您的问题上。

SayHello 应用程序中更改 URI 映射后.java显式添加@RequestMapping(值 = “/welcome”),即 中“/”的映射

@RequestMapping(value = "/")
public String home() {
  log.info("Access /");
  return "Hi!";
}

将表示“/欢迎”下的根路径,即“/欢迎/”,而不是“/”的“/”。

那么我们就没有真正的“/”的任何映射,例如,“http://{host}:8090/”。在这种情况下,Ping将一个接一个地失败,最终Ribbon会将所有服务实例标记为不健康,因此您最终会看到“没有实例可供say-hello”。

汝弘深
2023-03-14

问题是通过将< code>@RequestMapping添加到类中,您还更改了< code>/处理程序以从根移动到< code>/welcome/。为了使负载平衡器能够继续工作,您必须更新用户应用程序的< code > sayhello configuration 中使用的< code>PingUrl。使其< code >成为新的PingUrl(false,“/welcome/”

 类似资料:
  • 问题内容: 在这个问题中,我定义了一个包含上下文管理器的上下文管理器。完成此嵌套的最简单的正确方法是什么?我最后打电话了。但是,在中,我很确定我必须调用finally块,以防引发异常。如果出现问题,是否应该设置type_,value和traceback参数?我检查了,但找不到任何实用程序来帮助解决此问题。 来自问题的原始代码: 问题答案: 创建上下文管理器的简单方法是使用。像这样: 然后使用。语句

  • 我有以下两个类Heartrate与字段: 和字段步骤: 我写的规则在最后一分钟步数超过100步,心率超过160时触发。 我想更改此规则,使其基于macAddress的上下文。因此,该规则只考虑具有相同macAddress的步骤和心率。我已经为步骤的macAddress和心率的macAddress编写了上下文规则。它们都是单独工作的,但当我试着给它们筑巢时,规则就不再起作用了。 我做错了什么?

  • 在Javascript中调用顶级函数时,函数中的this关键字引用默认对象(如果在浏览器中,则为窗口)。我的理解是,这是作为方法调用函数的一种特殊情况,因为默认情况下,它是在窗口上调用的(如John Resig的书《JavaScript忍者的秘密》第49页所述)。实际上,下面代码中的两个调用是相同的。 到目前为止还不错...这是我不明白的部分: 当一个函数嵌套在另一个函数中并在未指定要调用的对象的

  • 问题内容: 我有以下代码: 有什么方法可以在函数外部调用函数?我试过调用,但我认为它仅在父函数内部可见。 问题答案:

  • 我有这段代码。第一个非嵌套的映射输出了一些东西,而嵌套的映射没有。我想我理解为什么第二个不起作用。这是一个延迟序列,Perl 6正在收集结果。那很好。但是,第一个(非嵌套的)映射不是以同样的方式懒惰吗?如果我不对映射结果做任何操作,它将如何输出任何内容?也就是说,第一个怎么懒惰?is是否会自动获取一个接收器上下文,在该上下文中,我必须显式地向嵌套的接收器提供接收器(或其他内容)?不知何故,我认为P

  • 我是Elasticsearch的新手,我提出了一个问题,Elasticsearch嵌套查询是否只能为嵌套字段返回匹配的嵌套文档。 对于示例,我有一个名为的类型,其中嵌套字段名为 和嵌套查询 我需要的是搜索有提到足球的评论的博客文章,每个博客文章的评论数与足球相匹配(在例子中它数为1,因为另一个评论刚刚提到篮球)。 然而,Elasticsearch似乎总是返回完整的文档,所以我如何才能实现它,或者我