Spring Cloud:缺少使用 Ribbon 和 Feign 客户端(但不是 Eureka)的服务器实例
Spring Cloud: Missing Server Instance using Ribbon and Feign Client (but not Eureka)
我第一次尝试在简单的 REST 客户端测试应用程序中使用 @FeignClient
。我想使用 Ribbon 在两个服务器实例之间进行负载平衡,但不使用 Eureka。按照文档,我用 listOfServers
属性 配置了我的 application.yml
并禁用了 Eureka。我的客户端的名称与 ribbon
属性的 YAML 前缀相同。
application.yml
:
ds:
ribbon:
listOfServers: server1:18201,server2:18201
客户代码:
@FeignClient("ds")
public interface DataServicesClient {
@RequestMapping(method = RequestMethod.GET, value = "/context-path/customers")
List<Customers> getCustomers();
}
当我调用应用程序时,我可以看到 listOfServers
被 Ribbon 拾取:
2016-03-07 12:15:17.275 INFO 39948 --- [nio-8081-exec-1]
c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client ds
initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ds,current list of
Servers=[server1:18201, server2:18201]
然而,客户端随后仅使用没有服务器前缀的 @RequestMapping
注释的值进行调用,显然失败了。
2016-03-07 12:15:21.394 ERROR 39948 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].
[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context
with path [] threw exception [Request processing failed; nested exception is
feign.RetryableException: Unexpected end of file from server executing GET
http://context-path/customers] with root cause
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
我原以为它会依次注入每个服务器 (http:{server instance}/context-path/customers
),所以我显然在这里漏掉了一些东西。
谁能给我指出正确的方向?
谢谢,
抢.
所以我们发现问题是我试图访问受保护的资源,但没有为我的假客户端添加 https 前缀。
@FeignClient("https://ds")
我可能有点天真,但我没有发现错误真的很好地解释了问题:
java.net.SocketException: Unexpected end of file from server
我还希望所选的服务器实例出现在错误消息中,但看起来我们只是获得了客户端名称。这让我相信服务器被简单地省略了,但我想这只是学习曲线的一部分。
无论如何,问题现在已经解决,它只使用 @EnableFeignClients
注释,不需要 Feign.builder()
.
感谢@Dave Syer 的支持
我第一次尝试在简单的 REST 客户端测试应用程序中使用 @FeignClient
。我想使用 Ribbon 在两个服务器实例之间进行负载平衡,但不使用 Eureka。按照文档,我用 listOfServers
属性 配置了我的 application.yml
并禁用了 Eureka。我的客户端的名称与 ribbon
属性的 YAML 前缀相同。
application.yml
:
ds:
ribbon:
listOfServers: server1:18201,server2:18201
客户代码:
@FeignClient("ds")
public interface DataServicesClient {
@RequestMapping(method = RequestMethod.GET, value = "/context-path/customers")
List<Customers> getCustomers();
}
当我调用应用程序时,我可以看到 listOfServers
被 Ribbon 拾取:
2016-03-07 12:15:17.275 INFO 39948 --- [nio-8081-exec-1]
c.n.l.DynamicServerListLoadBalancer : DynamicServerListLoadBalancer for client ds
initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=ds,current list of
Servers=[server1:18201, server2:18201]
然而,客户端随后仅使用没有服务器前缀的 @RequestMapping
注释的值进行调用,显然失败了。
2016-03-07 12:15:21.394 ERROR 39948 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].
[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context
with path [] threw exception [Request processing failed; nested exception is
feign.RetryableException: Unexpected end of file from server executing GET
http://context-path/customers] with root cause
java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
我原以为它会依次注入每个服务器 (http:{server instance}/context-path/customers
),所以我显然在这里漏掉了一些东西。
谁能给我指出正确的方向?
谢谢,
抢.
所以我们发现问题是我试图访问受保护的资源,但没有为我的假客户端添加 https 前缀。
@FeignClient("https://ds")
我可能有点天真,但我没有发现错误真的很好地解释了问题:
java.net.SocketException: Unexpected end of file from server
我还希望所选的服务器实例出现在错误消息中,但看起来我们只是获得了客户端名称。这让我相信服务器被简单地省略了,但我想这只是学习曲线的一部分。
无论如何,问题现在已经解决,它只使用 @EnableFeignClients
注释,不需要 Feign.builder()
.
感谢@Dave Syer 的支持