谈谈feign

作者: 山东大葱哥 | 来源:发表于2019-05-15 16:54 被阅读10次

Feign的前世今生

Feign是什么?

- Feign是一个Java 的HTTP Client 组件
- 作用: 简化HTTP API的复杂度

Feign的工作机制

  1. 处理注解
  2. 解析参数
  3. 构造http请求模板
  4. 发送请求
  5. 解析响应数据

什么场景下使用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案例实战

需求

  1. 访问 https://api.github.com/repos/OpenFeign/feign/contributors
  2. 获取贡献者信息,包括登录名、贡献量。

引入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>

编写基础代码

  1. 编写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;
    }
}
  1. 开发接口
public interface GithubService {
    List<Contribution> getContributions();
}
  1. 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支持

  1. 接口中增加Feign注解
    @RequestLine("GET")
    List<Contribution> getContributions();
  1. 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 的贡献者信息

代码实现

  1. 修改接口代码
      @RequestLine("GET /repos/{owner}/{repo}/contributors")
          List<Contribution> getContributions(@Param("owner") String owner
                  , @Param("repo") String repo);
  1. 修改main程序
    service.getContributions("alibaba","nacos");

相关文章

网友评论

    本文标题:谈谈feign

    本文链接:https://www.haomeiwen.com/subject/xngdaqtx.html