我试图在一个简单的REST客户端测试应用程序中第一次使用@FeignClient
。我想使用Ribbon来实现两个服务器实例之间的负载平衡,但不使用Eureka。根据文档,我已将application.yml
配置为listOfServers
属性并禁用了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();
}
当我调用应用程序时,我可以看到Ribbon {<1}}正在被选中:
listOfServers
然而,客户端只使用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)
),所以我显然在这里错过了一些东西。
任何人都可以指出我正确的方向吗?
谢谢,
罗布。
答案 0 :(得分:1)
所以它转变为我们的问题是我试图访问一个安全的资源,但没有使用https为我的假装客户端添加前缀。
@FeignClient("https://ds")
我可能有些天真,但我没有发现错误真的很好地解释了这个问题:
java.net.SocketException: Unexpected end of file from server
我还希望所选服务器实例出现在错误消息中,但看起来我们只是获取客户端名称。这让我相信服务器被省略了,但我想这只是学习曲线的一部分。
无论如何,问题现在已经解决,只使用@EnableFeignClients
注释,不需要Feign.builder()
。
感谢@Dave Syer的支持