Feign进行分布式服务调用
1. 添加feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2. 启动类上添加@EnableFeignClients注解
3. 服务消费方创建Feign接口
这里是继承服务提供方提供出来的feign接口(pom文件添加了服务提供方的api模块)
@FeignClient(name = "blog-article", fallback = ArticleFallback.class)
public interface ArticleClient extends ArticleService{
}
服务提供方提供的feign接口(@GetMapping注解上的路径就是Feign调用的http请求路径)
public interface ArticleService {
@GetMapping(value = "/article/user-article/list")
ResponseVO<PageInfo<ArticleListVO>> queryUserArticleList(@RequestParam UserArticleListParamVO vo, @RequestParam PageParams pageParams);
}
4. 服务提供方添加接口的具体实现
@Service("articleService")
public class ArticleServiceImpl implements ArticleService{
@Autowired
private ArticleMapper articleMapper;
@Override
public ResponseVO<PageInfo<ArticleListVO>> queryUserArticleList(UserArticleListParamVO vo, PageParams pageParams) {
List<ArticleListVO> list = articleMapper.queryArticleList(vo);
return ResponseVO.success(new PageInfo<>(list));
}
}
5. 服务提供方添加接收Feign请求的Controller(方法上的请求路径必须跟Feign接口上的一致,否则会访问不到)
@RestController
@RequestMapping("/article")
public class ArticleController {
@Autowired
private ArticleService articleService;
@GetMapping(value = "/user-article/list")
public ResponseVO<PageInfo<ArticleListVO>> queryUserArticleList(@Validated UserArticleListParamVO vo, PageParams pageParams) {
return articleService.queryUserArticleList(vo, pageParams);
}
}
总结: 这是通过Postman模拟的get请求,我们可以看到服务消费方的Feign请求日志,从日志中我们可以看到,我们调用服务提供方提供出来的Feign接口时本质是服务消费方向服务提供方发送了一个http请求。用过HttpClient的朋友应该知道,HttpClient需要我们自己通过请求头请求参数等信息组装一个request请求,从而请求对方。而使用Feign时我们只需要调用Feign接口就可以了,Feign就相当于通过Feign接口上的请求路径、参数等帮我们完成了request请求组装的过程,之后跟HttpClient一样通过http请求访问服务提供方,然后服务提供方只要提供一个Controller(其它能接收http请求的方式也行)处理我们的请求就可以完成调用。
Feign请求日志
项目源码地址:https://github.com/luckymeet/spring-cloud-seed