Ribbon、Feign是什么?
2022-09-22 22:46:59

目录
[TOC]

什么是负载均衡?

loadbalance.png

什么是Ribbon?

一句话概括

微服务之间的负载均衡调用工具

即A服务可以通过Ribbon(进行负载均衡调用),来请求B服务

详细

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括后续我们将要介绍的Feign,它也是基于Ribbon实现的工具。

如何使用Ribbon?

Ribbon一般是基于SpringCloud来使用的,主要分为两大步即可:

  1. 服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
    (本篇主要介绍Ribbon,这里不详细解释)

  2. 服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
    这里具体分为三小步
    (下面是简单的调用设计,不同的设计和配置也会导致代码不同)
    2.1 主程序入口类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @SpringBootApplication
    @EnableEurekaClient
    @EnableDiscoveryClient
    public class RibbonTESTApplication {

    public static void main(String[] args) {
    SpringApplicationBuilder(RibbonTESTApplication .class);

    }


    @Bean // 将返回RestTemplate 的放到容器中
    @LoadBalanced // 标注此注解后,RestTemplate就具有了客户端负载均衡能力
    RestTemplate restTemplate() {
    return new RestTemplate();
    }

    }

    2.2 ProductClientRibbon Ribbon客户端(实际调用其他服务的类)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Component
    public class ProductClientRibbon {

    @Autowired
    RestTemplate restTemplate;

    public List<Product> listProdcuts() {
    return restTemplate.getForObject("http://PRODUCT-DATA-SERVICE/products",List.class);
    }

    }

    2.2 服务类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Service
    public class ProductService {
    @Autowired
    ProductClientRibbon productClientRibbon;

    public List<Product> listProducts(){
    return productClientRibbon.listProdcuts();

    }
    }

    上面介绍了三小步。再看一下图来梳理一下调用的过程
    ribbon1.png

以上就是对Ribbon的简单介绍,总结一下就是:

  1. 向注册中心注册服务
  2. 配置restTemplate
  3. 用restTemplate进行调用其他服务

什么是Feign?

一句话概括

Feign是在Ribbon上进行了改进,采用接口+注解的方式来进行调用

详细

Feign 是一个声明式的 Web Service 客户端。它的出现使开发 Web Service 客户端变得很简单。使用 Feign 只需要创建一个接口加上对应的注解,比如:@FeignClient 注解。 Feign 有可插拔的注解,包括 Feign 注解和 AX-RS 注解。Feign 也支持编码器和解码器,Spring Cloud Open Feign 对 Feign 进行增强支持 Spring Mvc 注解,可以像 Spring Web 一样使用 HttpMessageConverters 等。

  Feign 是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。接下来介绍一下 Feign 的特性,具体如下:

可插拔的注解支持,包括 Feign 注解和AX-RS注解。
支持可插拔的 HTTP 编码器和解码器。
支持 Hystrix 和它的 Fallback。
支持 Ribbon 的负载均衡。
支持 HTTP 请求和响应的压缩。Feign 是一个声明式的 WebService 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而不需要开发者针对 Feign 对其进行整合。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。Feign 会完全代理 HTTP 的请求,在使用过程中我们只需要依赖注入 Bean,然后调用对应的方法传递参数即可。

如何使用Feign?

  1. 引入pom
    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. 启动类加入如下注解
    1
    2
    //开启 Feign 扫描支持
    @EnableFeignClients
  3. Feign接口编写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @FeignClient(name = "github-client", url = "https://api.github.com")
    public interface GitHubFeign {

    @RequestMapping(value = "/search/repositories",
    method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    String searchRepo(@RequestParam("q") String q);

    }

  4. 入口Controller编写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    @RestController
    @RequestMapping(
    value = "/github",
    produces = MediaType.APPLICATION_JSON_UTF8_VALUE
    )
    public class GitHubController {

    @Resource
    private GitHubFeign gitHubFeign;

    @RequestMapping(value = "/search/repositories",method = RequestMethod.GET)
    String searchRepo(@RequestParam("q") String q) {
    return gitHubFeign.searchRepo(q);
    }

    }

    再来用图梳理一下调用的过程
    feign1.png

@FeignClient 注解

name:指定 Feign Client 的名称,如果项目使用了 Ribbon,name 属性会作为微服务的名称,用于服务发现。
url:url 一般用于调试,可以手动指定 @FeignClient 调用的地址。
decode404:当发生404错误时,如果该字段为 true,会调用 decoder 进行解码,否则抛出 FeignException。
configuration:Feign 配置类,可以自定义 Feign 的 Encoder、Decoder、LogLevel、Contract。
fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口。
fallbackFactory:工厂类,用于生成 fallback 类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
path:定义当前 FeignClient 的统一前缀。

权限问题

后面再补充..

文章由本人总结,并参考了以下博客:
Ribbon详解
spring cloud各个微服务之间如何相互调用(Feign、Feign带token访问服务接口)
HowJ的Ribbon和Feign教程

Prev
2022-09-22 22:46:59
Next