写于:2018-12-28 00:02:37

# Feign

官方文档介绍

Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same HttpMessageConverters used by default in Spring Web. Spring Cloud integrates Ribbon and Eureka to provide a load balanced http client when using Feign

Feign 是一个声明式服务客户端。它简化了服务客户端的书写。而使用 feign 只需要 定义一个接口,并使用注解标注就可以了。这个注解可以使用 fiegn 提供的注解 也可以是 JAX_R5 的注解。Feign 也支持可插拔式的加密解密。Spring Cloud 在 Feign 的基础上增加了 Spring MVC 注解的支持。 Spring Cloud 在 使用feign 时 整合了Ribbon 和eureka 提供 http client 负载均衡请求。

# Feign 与 Ribbon

Feign 对 Ribbon 进行了封装,提供了更好的编程体验。

Ribbon概述Ribbon深入 中 提到 Ribbon 原理就是通过维护一组服务列表列表数据: 服务名-URL+IP端口的映射 ,在使用 服务名拼接 url 访问的时候,帮我们将 服务映射成 ip +port 的方式。

以下是一段使用 服务名访问远程API的简短代码:

@GetMapping("/user/query/{userId}")
    public String demo4(@PathVariable("userId")Long userId){
        String serverName = "provider";
        ResponseEntity<String> forEntity = restTemplate.
            getForEntity("http://" + serverName + "/user/query/" + userId, String.class);
        return forEntity.getBody();
    }

整合了 Ribbon ,由 Ribbon 进行映射拼接,有效的解决了 Http 访问,拼接 url 的窘境,但是代码编写中,仍然避免不了主动进行 url 的拼接。

而 Feign 整合 Ribbon 解决的问题之一就是,通过简单的编码方式实现 url 的自动拼接。

下面通过一个简单案例, Feign 怎么提升了编码体验。

# Feign 整合 RIbbon 案例

# 项目结构如下:

  • feign-ribbon-server

    单纯的 web 服务,提供测试 API /server/api

  • feign-ribbon-client

    Feign 结合 Ribbon 的调用案例

    关键操作:

    依赖- spring-cloud-starter-netflix-ribbonspring-cloud-starter-openfeign

    Application.class 启动追加注解:@EnableFeignClients

    boostrap.properties 配置 serverName.ribbon.listOfServers

# 使用 Ribbon 自己拼接 URL案例

# 使用 Feign 自动拼接 URL 案例

# Feign + Ribbon + Eureka

Feign + Ribbon 简化了开发手动拼接的繁琐,不过直接使 Ribbon 需要手动维护服务实例列表 。

针对该问题,Spring Cloud 同样提供了解决方案,如:Eureka 服务注册中心。根据注册中心的服务实例列表自动更新,解决手动维护服务列表的问题。

# 整合案例

在上面 feign + ribbon 的基础上,增加 eureka 相关代码。

# 项目结构如下

  • feign-ribbon-eureka

    参考 Eureka-概述

  • feign-ribbon-server

    追加依赖 spring-cloud-starter-netflix-eureka-client

    Application.class 追加 @EnableDiscoveryClient

    application.properties 追加 eureka.client.service-url.defaultZone = http://zhixing:zhixing@127.0.0.1:1111/eureka/

  • feign-ribbon-client

    追加依赖 spring-cloud-starter-netflix-eureka-client

    Application.class 追加 @EnableDiscoveryClient

    bootstrap.properties 追加 eureka.client.service-url.defaultZone = http://zhixing:zhixing@127.0.0.1:1111/eureka/

    bootstrap.properties 注释 feign-ribbon-server.ribbon.listOfServers 配置

# Feign + Ribbon + Hystrix

官方文档

Feign 除了对 Ribbon进行封装,还封装了 Hystrix 的支持

# 整合案例

# 项目结构如下

在上述 Feign + Ribbon + Eureka 的代码基础上进行修改

  • feign-ribbon-eureka

    不动

  • feign-ribbon-client

    spring-cloud-starter-openfeign 中已经有 hystrix 相关依赖,所以无需引用依赖

    bootstrap.properties 追加配置 feign 开启 hystirx 功能:feign.hystrix.enabled = true

    hystrix 超时时间改小便与测试 :hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=500

  • feign-ribbon-server

    测试 API 增加睡眠时间模拟超时

# feign-ribbon-server 增加 fallback 相关内容

精彩内容推送,请关注公众号!
最近更新时间: 4/16/2020, 7:40:17 PM