Feign的使用方法以及与RestTemplate的区别

版权声明:本文为博主ExcelMann的原创文章,未经博主允许不得转载。
作者:ExcelMann,转载需注明。

Feign的使用方法

第一步:导入依赖

第二步:在消费者服务,开启Feign客户端

@SpringBootApplication
@EnableFeignClients		// 开启Feign客户端
public class MircoRouteApplication {
    public static void main(String[] args) {
        SpringApplication.run(MircoRouteApplication.class, args);
    }
}

第三步:在消费者服务中,添加Feign的接口

// 标注该类是一个feign接口,value指定生产者的服务(生产者就是实现该接口方法的服务)
@FeignClient(value = "service-provider")
@Component
public interface UserClient {
    @GetMapping("/user/{id}") 
    User queryById(@PathVariable("id") Long id);
}

第四步:在生产者服务中,创建Controller,编写对应的接口

@RestController
public class FeignController{
    
    @Autowired
    private xxxService xxxSercice;
    
    @GetMapping("/user/{id}")
    User queryById(@PathVariable("id") Long id){
        ...具体实现逻辑...
    }
}

第五步:在消费者端调用feign方法

public class Test{
    @Resource
    private UserClient userClient;
    
    public void test(){
        // 这里实质上是调用生产者的接口
        User user = userClient.queryById(xxxx);
    }
}

FeignClient更高级的用法

  1. 配置fallback类,实现当前的接口:Feign的调用有限制响应时间,若在限定的时间内没收到回复的话,会回调调用fallback实现类的接口对应实现方法;

    @FeignClient(
        value = "service-provider",
        fallback = IUserClientFallback.class,
    )
    public interface UserClient {
        @GetMapping("/user/{id}") 
        User queryById(@PathVariable("id") Long id);
    }
    
  2. 关联配置类:Feign客户端指定配置类,该配置类需要添加@Configuration注解

    这里关联的配置类实现了RequestInterceptor接口,重写apply方法,从上下文中获取token,将token放在请求的header头部中,因为调用远程服务的api的时候,也要经过common模块的资源服务器的token拦截校验;

    @FeignClient(
        value = "service-provider",
        fallback = IUserClientFallback.class,
        configuration = OAuth2FeignConfig.class
    )
    public interface UserClient {
        @GetMapping("/user/{id}") 
        User queryById(@PathVariable("id") Long id);
    }
    
    @Configuration
    public class OAuth2FeignConfig implements RequestInterceptor {
    
        private static final String client_credentials = "client_credentials";
    
        @Override
        public void apply(RequestTemplate requestTemplate) {
            //从上线文中获取token
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            String header = requestAttributes.getRequest().getHeader(HttpHeaders.AUTHORIZATION);
            requestTemplate.header(HttpHeaders.AUTHORIZATION, header);
        }
    }
    

Feign与RestTemplate的区别

微服务之间的通信方式

常见的方式有两种:

  • RPC——代表-dubbo
  • HTTP——代表-SpringCloud

在SpringCloud中,默认是使用http来进行微服务的通信,最常用的实现形式有两种:

  • RestTemplate
  • Feign

Feign跟RestTemplate的区别

  1. 请求方式不一样

    RestTemplate需要每个请求都拼接url+参数+类文件,灵活性高但是消息封装臃肿。

    feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。

  2. 底层实现方式不一样

    RestTemplate在拼接url的时候,可以直接指定ip地址+端口号,不需要经过服务注册中心就可以直接请求接口;也可以指定服务名,请求先到服务注册中心(如nacos)获取对应服务的ip地址+端口号,然后经过HTTP转发请求到对应的服务接口(注意:这时候的restTemplate需要添加@LoadBalanced注解,进行负载均衡)。

    Feign的底层实现是动态代理,如果对某个接口进行了@FeignClient注解的声明,Feign就会针对这个接口创建一个动态代理的对象,在调用这个接口的时候,其实就是调用这个接口的代理对象,代理对象根据@FeignClient注解中name的值在服务注册中心找到对应的服务,然后再根据@RequestMapping等其他注解的映射路径构造出请求的地址,针对这个地址,再从本地实现HTTP的远程调用。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>