我有一堆微服务使用RestTemplate
相互通信。微服务的所有通信都来自API网关。
我正在做如下,
public List<ServiceInstance> serviceInstancesByApplicationName(String applicationName) {
return this.discoveryClient.getInstances(applicationName);
}
//some Other logic
List<ServiceInstance> apigatewaymsInstanceList = discoveryClient.getInstances(apigatewaymsName);
ServiceInstance apigatewaymsInstance = apigatewaymsInstanceList.get(0);
//and
restTemplate.exchange(apigatewaymsInstance.getUri().toString() + plmpayloadprocessmsResource, HttpMethod.POST,
entity, String.class);
但是这里看起来像硬编码。我还缺少另一种方法吗?什么是最好的方式?
同样,我问是否有任何可用的方法,以便我可以传递应用程序的名称,尤里卡返回我的完整URI,无需执行applicationgetInstaceId(0);
答案 0 :(得分:1)
尝试使用Feign - 它是一个声明式REST客户端。它不需要你提到的任何样板。有关详细信息,请参阅check-spring-cloud-netflix文档。简而言之,您的REST客户端将如下所示:
@FeignClient(name = "service-name", path = "/base-path")
public interface MyClient{
@RequestMapping(method = RequestMethod.GET, value = "/greeting")
String getGreeting();
}
调用 getGreeting 方法会导致向名为服务名称的服务发送GET请求,并且网址 / base-path / greeting
答案 1 :(得分:0)
您可以使用EurekaClient#getNextServerFromEureka。您可能必须自己创建URI,但这应该是微不足道的。
@Autowired
EurekaClient eurekaClient;
public void executeMethod() {
InstanceInfo loadBalancedInstance = eurekaClient.getNextServerFromEureka("myService", false);
//do work
}