Feign的前世今生
Feign是什么?
- Feign是一个Java 的HTTP Client 组件
- 作用: 简化HTTP API的复杂度
Feign的工作机制
- 处理注解
- 解析参数
- 构造http请求模板
- 发送请求
- 解析响应数据
什么场景下使用Feign?
- 涉及到http调用的地方都可以考虑使用feign
- 例如调用第三方http接口,支付接口
- 例如爬虫项目等
dubbo中是否需要feign?为什么?
- dubbo框架本身不需要feign
- dubbo中的微服务使用dubbo私有协议,不是http协议,所以不能使用feign
Spring Cloud Feign 是什么
- Spring全家桶把openfeign整合进来,形成了spring cloud feign
- 增加了对SpringMVC注解的支持
- 集成对eureka、zuul、Hystrix的支持
原生Feign案例实战
需求
- 访问 https://api.github.com/repos/OpenFeign/feign/contributors
- 获取贡献者信息,包括登录名、贡献量。
引入pom文件
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version> 10.2.3</version>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version> 10.2.3</version>
</dependency>
编写基础代码
- 编写dto
public class Contribution {
String login;
int contributions;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public int getContributions() {
return contributions;
}
public void setContributions(int contributions) {
this.contributions = contributions;
}
}
- 开发接口
public interface GithubService {
List<Contribution> getContributions();
}
- main程序中调用
public class App {
public static void main(String[] args) {
GithubService service;
List<Contribution> list = service.getContributions();
for (Contribution contribution : list) {
System.out.println(contribution.getLogin() + " ("
+ contribution.getContributions() + ")");
}
}
}
增加Feign支持
- 接口中增加Feign注解
@RequestLine("GET")
List<Contribution> getContributions();
- main程序中通过Feign调用接口
GithubService service=Feign.builder().decoder(
new GsonDecoder()).target(GithubService.class,
"https://api.github.com/repos/OpenFeign/feign/contributors")
扩展需求
- 在url中增加参数支持,可以任意指定owner 和 repo,获取对应的贡献者信息
- 获取 alibaba/nacos 的贡献者信息
代码实现
- 修改接口代码
@RequestLine("GET /repos/{owner}/{repo}/contributors")
List<Contribution> getContributions(@Param("owner") String owner
, @Param("repo") String repo);
- 修改main程序
service.getContributions("alibaba","nacos");
网友评论