微服务中跨服务请求选择Fegin还是RestTemplate?

问题:微服务流行之后,如何进行跨服务的接口访问呢?

两种方案: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);

以上是我个人实践,有问题欢迎指出。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容