谈谈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