问题:微服务流行之后,如何进行跨服务的接口访问呢?
两种方案:Feign或者RestTemplate
Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单
RestTemplate是Spring提供的访问Rest服务的客户端,RestTemplate提供三种访问远程http服务的方法,来提高代码效率。
如何选择:
FeginClient简化了请求的编写,且通过动态负载进行选择使用哪个服务进行消费,由Spring实现,编写时直接调用方法即可。RestTemplate还需要编写服务器IP,需了解HTTP提供的http级别api的细节等,较为复杂。
以下是二者的使用方式:
1.Feign:
假设A服务要调用B服务中的find方法,可以在A服务中增加一个接口(其实将B服务中方法定义进行复制即可)
@FeignClient(name = "B") //模块名称
public interface PublishClient {
// 该模块中要访问的方法
@PostMapping("/download")
Response find(@RequestParam("mediaId") String mediaId,@RequestParam("userName") String userName);
}
2.RestTemplate:
(1)访问指定ip地址和端口
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:ip/msg", String.class);
(2)使用配置的restTemplate,通过应用名直接调用。前提在配置文件中一定要配置应用名称: spring.application.name=MANAFEMENT
String response = restTemplate.getForObject("http://MANAFEMENT/msg", String.class);
log.info("response={}",response);
(3)使用LoadBalancerClient获取url,例如获取management应用
ServiceInstance serviceInstance = loadBalancerClient.choose("MANAFEMENT");
String url = String.format("http://%s:%s", serviceInstance.getHost(), serviceInstance.getPort()+"/msg");
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject(url, String.class);
以上是我个人实践,有问题欢迎指出。