Spring Cloud Ribbon 和 Spring Cloud Hystrix 在微服务中实现了客户端负载均衡的服务调用以及通过断路器来保护微服务应用。这两者作为基础工具类框架广泛地应用在各个微服务的实现中,不仅包括我们自身的业务类微服务,也包括一些基础设置类微服务(比如网关)。在实践中,这两个框架的使用几乎是同时出现的。那么是否有更高层次的封装来整合这两个基础工具,有就是Spring Cloud Fegin。基于 Netflix Feign 实现,除了整合上面两个强大的功能之外,还提供了一种声明式的 Web 服务客户端定义方式。

一、是什么


Fegin 是一个声明式 WebService客户端。使用 Fegin能让编写 Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解即可,同时支持 JAX-RS标准的注解。Feign 也支持可拔插式的编码器和解码器。SpringCloud 对 Feign 进行了封装,使其支持了 Spring MVC 标准注解和 HttpMessageConverters(Http请求/响应与Java对象之间的转换)。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。可参考官网:https://github.com/OpenFeign/feign

大家目前都习惯面向接口编程,比如 WebService 接口,比如DAO接口,这个已经是规范。通过接口+注解获得调用服务应该是我们最喜欢的。所以就出现了Feign,它就可以满足上面的需求

二、能干什么


Fegin 指在使编写 Java Http客户端变的容易。使用 Ribbon+RestTemplate 时,利用 RestTemplate对http 请求的封装处理,形成了一套模板化的调用方式。但实际开发中,由于对服务的依赖调用可能不止一处,往往一个接口会被多出调用,所以通常会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以 Fegin 在此基础上做了进一步封装,由它来帮助我们定义和实现依赖服务接口的定义。在 Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(以前是Dao接口上面添加Mapper 注解,现在是一个微服务接口上面标注一个 Feign 注解),即可完成服务提供方的接口绑定,简化使用 Spring Cloud Ribbon 时,自动封装服务调用客户的开发量。

三、案例


【1】根据 microservicecloud-consumer-dept-80(客户端) 创建 microservicecloud-consumer-dept-feign 微服务;
【2】修改 microservicecloud-consumer-dept-feign 模块的 pom.xml 文件中添加 feign;

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

【3】修改 microservicecloud-api 工程(公共的工程,相当于common,其他的子系统也可以调用此接口)
   ①、修改 pom.xml

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

②、在公共 microservicecloud-api 模块添加 DeptClientService 接口,并添加接口方法,这些方法与提供者的接口一模一样。同时在客户端添加  @FeignClient 注解。value=服务提供者暴露的名称,fallbackFactory=

@FeignClient(value = "MICROSERVICECLOUD-DEPT")
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id); @RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list(); @RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}

③、maven clear;
  ④、maven install;

【4】microservicecloud-consumer-dept-feign 工程修改 Controller,添加上一步新建的 DeptClientService 接口;

@RestController
public class DeptController_Consumer{
@Autowired
private DeptClientService service; @RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return this.service.get(id);
} @RequestMapping(value = "/consumer/dept/list")
public List<Dept> list()
{
return this.service.list();
} @RequestMapping(value = "/consumer/dept/add")
public Object add(Dept dept)
{
return this.service.add(dept);
}
}

【5】microservicecloud-consumer-dept-feign 工程修改主配置类,通过 @EnableFeignClients 注解开启 Spring Cloud Feign 的支持功能。

@EnableFeignClients(basePackages= {"com.zzx.springcloud"})
public class DeptConsumer80_Feign_App
{

四、请求压缩


Spring Cloud Feign 支持对请求和响应进行 GZIP 压缩,以减少通信过程中的性能损耗。我们只需两个参数设置,就能开启请求于响应的压缩功能:

feign.compression.request.enabled=true
feign.compression.response.enabled=true

同时,我们还能对请求压缩做一些更细致的配置,比如压缩的请求数据类型,并设置请求压缩的大小下限,只有超过这个大小才会对其进行压缩:

feign.compression.request.enabled=true
#下面两个其实也是它的默认值
feign.compression.request.mime-type=text/xml,application/xml,application/json
feign.compression.request.min-request.size=2048

五、 日志配置


Spring Cloud Feign 在构建被 @FeignClient 注解修饰的客户端时,会为每一个客户端都创建一个 feign.Logger 实例,我们可以利用该日志对象的 DEBUG 模式来帮组分析 Feign 的请求细节。可以在 application.yml 配置文件中使用 logging.level.<FeignClient> 的参数配置格式来开启指定 Feign 客户端的 DEBUG 日志,其中 <FeignClient> 为 Feign 客户端定义接口的完整路径,比如:

Logging.level.com.zzx.springcloud.DeptClientService=DEBUG

这样还不够,由于 Feign 客户端默认的 Logger.Level 对象定义为 NONE 级别,该级别不会记录任何 Feign 调用过程的信息,所以我们需要调整它的级别,针对全局的日志级别,可以在应用主类中直接加 Logger.Level 的 Bean 创建。也可以通过实现配置类来实现,然后在具体的 Feign 客户端来指定配置类以实现是否要调整不同的日志级别::

@configuration
public class FullLogConfiguration{
@Bean
Logger.Level feignLoggerLevel(){
return Logger.Level.FULL;
}
} @FeignClient(name="",configuration=FullLogConfiguration.class)
public interface xxx{
}

对于 Feign 的 Logger 级别主要有下面4类,可根据实际需要进行调整使用:
【1】NONE:不记录任何信息;
【2】BASIC:仅记录请求方法、URL 以及相应状态码和执行时间;
【3】HEADERS:除了记录 BASIC 级别的信息之外,还会记录请求和响应的头信息;
【4】FULL:记录所有请求于响应明细,包括头信息、请求体、元数据等;

六、总结:Feign 集成了 Ribbon


利用 Ribbon维护了 MicroServiceCloud-Dept 的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与 Ribbon不同的是,通过 Feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。关于Feign 的熔断机制 fallback 在 Hystrix 中进行说明;
博客链接】:链接

 ----架构师资料,关注公众号获取----

SpringCloud Fegin 负载均衡的更多相关文章

  1. SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

    一,问题 采取eureka集群.客户端通过Ribbon调用服务,Ribbon端报下列异常 java.net.UnknownHostException: SERVICE-HI java.lang.Ill ...

  2. SpringCloud 服务负载均衡和调用 Ribbon、OpenFeign

    1.Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的-套客户端―负载均衡的工具. 简单的说,Ribbon是Netlix发布的开源项目,主要功能是提供客户端的 ...

  3. SpringCloud 客户端负载均衡:Ribbon

    目录 Ribbon 介绍 开启客户端负载均衡,简化 RestTemplate 调用 负载均衡策略 Ribbon 介绍 Ribbon 是 Netflix 提供的一个基于 Http 和 TCP 的客户端负 ...

  4. SpringCloud服务负载均衡实现原理01

  5. SpringCloud服务负载均衡实现原理02

  6. SpringCloud负载均衡笔记

    SpringCloud的负载均衡组件用的是Ribbon,这个东西就是服务消费者.它只是一个配置用的中转器,放在 Zuul 和 Eureka Client 之间用来转发的,它里面写了好多规则,用来指定负 ...

  7. SpringCloud的入门学习之概念理解、Ribbon负载均衡入门

    1.Ribbon负载均衡,Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端.负载均衡的工具. 答:简单的说,Ribbon是Netflix发布的开源项目,主要功能 ...

  8. SpringCloud:Ribbon负载均衡

    1.概述 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端       负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客 ...

  9. SpringCloud学习笔记(五):Ribbon负载均衡

    简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套 客户端 负载均衡的工具 .(重点:客户端) 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提 ...

  10. SpringCloud与微服务Ⅵ --- Ribbon负载均衡

    一.Ribbon是什么 Sping Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户 ...

随机推荐

  1. UR #3 核聚变反应强度( gcd )

    tags: -分解质因数 , gcd 题目大意 给定\(n\)个数,求\(a_1\)与\(a_i\)次小公约数 分析 易知次小公约数是\(\gcd\)的因数,于是用\(\gcd\)除去它的最小质因子即 ...

  2. 手动导入jar

    mvn install:install-file -Dfile=D:\java_tools\maven\maven-repository\cn\afterturn\easypoi-base-cy\4. ...

  3. WKWebView与JS的交互

    转载:https://www.jianshu.com/p/253e76a74b38 用普通的UIWebView和JS交互 大概核心代码是这样的 - (void)setupWebView{ self.w ...

  4. PHP Redis - String (字符串)

    string 是 Redis 最基本的类型,与Memcached类似,一个 key 对应一个 value string 类型是二进制 安全的.这意味着 Redis 的 string 可以包含任何数据. ...

  5. pnn模型 待整理

    https://blog.csdn.net/qq_18293213/article/details/90262378?spm=1001.2101.3001.6650.5&utm_medium= ...

  6. Django框架搭建web项目(三)

    参考官网文档:https://docs.djangoproject.com/zh-hans/4.0/intro/tutorial02/ 在生成的app中进行数据库表设计. 1.在路径H:\myproj ...

  7. Java基础Day6-面向对象

    一.面向对象编程(Object-Oriented Programming, OOP) 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据. 从认识论的角度:先有对象后有类.对象是具体 ...

  8. 4组-Beta冲刺-3/5

    一.基本情况 队名:摸鲨鱼小队 组长博客:https://www.cnblogs.com/smallgrape/p/15600609.html github链接:https://github.com/ ...

  9. 如何跳出forEach循环

    for(let ii in this.listData){ console.log("提交前数据",ii) try{ this.listData[ii].forEach((el,i ...

  10. OSIDP-多处理器和实时调度-10

    多处理器调度 多处理器系统分类: 1.松耦合.分布式多处理器(集群):一系列相对自治的系统组成,每个处理器有属于自己的内存和I/O通道. 2.专用处理器:有一个通用的主处理器,专用处理器由主处理器控制 ...