Feign介绍
Feign是一个声明式的http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
而且Feign默认集成了Ribbon,所以使用Feign默认就实现了负载均衡的效果。
1. 被调用者-Feign接口
被调用者api中添加注解:@FeignClient("xc-media-service")
写在API模块中
@FeignClient(“xc-media-service”)
public interface MediaClient {
@GetMapping("/media/{mediaId}")
public ResponseResult<MediaVo> findById(@PathVariable Long mediaId);
}
2.被调用者Controller
@GetMapping("{mediaId}")
public ResponseResult findById(@PathVariable Long mediaId) {
Media media = mediaService.getById(mediaId);
//转化成Vo
MediaVo vo = BeanHelper.copyProperties(media, MediaVo.class);
return ResponseResult.okResult(vo);
}
2. 配置Feign(Web模块)
默认情况下,通过feign进行远程调用。并不会携带当前请求连接的请求头数据。
微服务发起feign接口时,手动设置需要添加的请求头内容。Feign内部支持RequestInterceptor,可以在进行调用之前,由程序员按需设置
/**
* 配置Feign请求时,携带请求头
*/
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
//设置授权头
template.header("payload", request.getHeader("payload"));
}
}
}
3.调用者-引入依赖
调用者添加依赖:
<dependency>
<groupId>com.xuecheng</groupId>
<artifactId>xc-media-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
4.调用者引导类中添加注解
@EnableFeignClients(basePackages = "com.xuecheng.*.api")