这可能是没有任何硬代码的微服务通信的最佳方式

时间:2016-10-09 08:43:40

标签: spring-boot microservices netflix-eureka

我有一堆微服务使用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);

2 个答案:

答案 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
}