zoukankan      html  css  js  c++  java
  • Feign 系列(02)Why Feign

    Feign 系列(02)Why Feign

    1. 什么是 Feign

    Feign 的英文表意为“假装,伪装,变形”, 是一个 Http 请求调用的轻量级框架,可以以 Java 接口注解的方式调用 Http 请求,而不用像 Java 中通过封装 HTTP 请求报文的方式直接调用。

    Feign 通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。

    Feign 被广泛应用在 Spring Cloud 的解决方案中,是学习基于 Spring Cloud 微服务架构不可或缺的重要组件。

    Feign 开源项目地址:https://github.com/OpenFeign/feign

    2. Feign 解决了什么问题

    Feign 封装 HTTP 调用流程,面向接口编程。

    Feign 本身很简单,但做了大量的适配工作,这也是这个框架存在的意义。

    在服务调用的场景中,我们经常调用基于 Http 协议的服务,而我们经常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty 等等,这些框架在基于自身的专注点提供了自身特性。而从角色划分上来看,他们的职能是一致的提供 Http 调用服务。具体流程如下:

    图1:Http请求调用过程分析
    sequenceDiagram 客户端 ->> Client框架: 构建请求行(url) 客户端 ->> Client框架: 构建请求头(Header) 客户端 ->> Client框架: 构建请求体(body) Client框架 ->> 服务端: 发送Http请求 Note right of 服务端: 服务端处理请求<br/> 服务端 -->> Client框架: 返回报文 Client框架 -->> 客户端: 提取报文信息,解析成JavaBean Note left of 客户端: 客户端处理业务

    总结: 根据上图的分析可知:要实现 Feign 客户端,主要是将 Method 方法的参数解析成 Http 请求的请求行、请求行、请求体,然后使用 HttpClient 发送请求。但问题:

    • 一是 REST 声明式规范有以下几种:Feign、JAX-RS 1/2、Spring Web MVC 都需要进行适配。这几种声明式注解的适配接口是 feign.Contract
    • 二是 Http 客户端有 JDK 自带的 HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty 等,需要适配。这几种客户端的适配接口是 feign.Client
    • 三是支持负载均衡与熔断。负载均衡 Ribbon 是对 feign.Client 进行包装。熔断 Hystrix 在 HystrixFeign 中自定义 InvocationHandlerFactory 的实现,创建 HystrixInvocationHandler,对 method.invoke 请求做拦截。
    • 四是各种编解码的适配,实现接口 feign.codec.Decoderfeign.codec.Encoder

    2.1 REST 声明式规范

    表1:Feign、JAX-RS 1/2、Spring Web MVC 声明式规范
    REST框架 使用场景 请求映射注解 请求参数
    JAX-RS 客户端声明、
    服务端声明
    @Path @*Param
    Feign 客户端声明 @RequestLine @Param
    Spring Web MVC 服务端声明 @ReqeustMapping @RequestParam

    总结: 这几种规范,其中 Feign 已经适配了 JAX-RS 1/2 和 Feign 自带的注解规范。Spring Cloud Open Feign 进一步适配了 Spring Web MVC 的注解规范。

    2.1.1 Feign(默认)

    GitHub github = Feign.builder()
        .decoder(new GsonDecoder())
        .target(GitHub.class, "https://api.github.com");
    

    2.1.2 JAX-RS

    maven 依赖:feign-jaxrsfeign-jaxrs2

    GitHub github = Feign.builder()
        .contract(new JAXRSContract())
        .target(GitHub.class, "https://api.github.com");
    

    2.2 多Http客户端支持

    2.2.1 OkHttp

    maven 依赖:feign-okhttp

    GitHub github = Feign.builder()
        .client(new OkHttpClient())
        .target(GitHub.class, "https://api.github.com");
    

    2.3 负载均衡与熔断

    2.3.1 Hystrix

    maven 依赖:feign-hystrix

    GitHub github = HystrixFeign.builder()
        .target(GitHub.class, "https://myAppProd");
    

    2.3.2 Ribbon

    maven 依赖:feign-ribbon

    GitHub github = Feign.builder()
        .client(RibbonClient.create())
        .target(GitHub.class, "https://myAppProd");
    

    2.4 编解码器

    2.4.1 Gson

    maven 依赖:feign-gson

    GitHub github = Feign.builder()
        .encoder(new GsonEncoder())
        .decoder(new GsonDecoder())
        .target(GitHub.class, "https://api.github.com");
    

    2.4.2 Jackson

    maven 依赖:feign-jackson

    GitHub github = Feign.builder()
        .encoder(new JacksonEncoder())
        .decoder(new JacksonDecoder())
        .target(GitHub.class, "https://api.github.com");
    

    2.4.3 JAXB

    maven 依赖:feign-jaxb

     Api api = Feign.builder()
         .encoder(new JAXBEncoder())
         .decoder(new JAXBDecoder())
         .target(Api.class, "https://apihost");
    

    2.4.4 SOAP

    maven 依赖:feign-soap

    Api api = Feign.builder()
        .encoder(new SOAPEncoder(jaxbFactory))
        .decoder(new SOAPDecoder(jaxbFactory))
        .errorDecoder(new SOAPErrorDecoder())
        .target(MyApi.class, "http://api");
    

    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    python 异常处理
    python 文件
    python 面向对象程序设计基础
    python 数据结构与算法
    python中的基本数据结构
    关于python程序设计流程(未完结)
    python的字典(dict)的键值对存储规则
    python中字符串的方法及注释
    Element.requestFullscreen()方法
    oncontextmenu 事件
  • 原文地址:https://www.cnblogs.com/binarylei/p/11561456.html
Copyright © 2011-2022 走看看