版权声明:本文为博主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更高级的用法
-
配置fallback类,实现当前的接口:Feign的调用有限制响应时间,若在限定的时间内没收到回复的话,会回调调用fallback实现类的接口对应实现方法;
@FeignClient( value = "service-provider", fallback = IUserClientFallback.class, ) public interface UserClient { @GetMapping("/user/{id}") User queryById(@PathVariable("id") Long id); }
-
关联配置类: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的区别
请求方式不一样
RestTemplate需要每个请求都拼接url+参数+类文件,灵活性高但是消息封装臃肿。
feign可以伪装成类似SpringMVC的controller一样,将rest的请求进行隐藏,不用再自己拼接url和参数,可以便捷优雅地调用HTTP API。
底层实现方式不一样
RestTemplate在拼接url的时候,可以直接指定ip地址+端口号,不需要经过服务注册中心就可以直接请求接口;也可以指定服务名,请求先到服务注册中心(如nacos)获取对应服务的ip地址+端口号,然后经过HTTP转发请求到对应的服务接口(注意:这时候的restTemplate需要添加@LoadBalanced注解,进行负载均衡)。
Feign的底层实现是动态代理,如果对某个接口进行了@FeignClient注解的声明,Feign就会针对这个接口创建一个动态代理的对象,在调用这个接口的时候,其实就是调用这个接口的代理对象,代理对象根据@FeignClient注解中name的值在服务注册中心找到对应的服务,然后再根据@RequestMapping等其他注解的映射路径构造出请求的地址,针对这个地址,再从本地实现HTTP的远程调用。