您现在的位置是:首页 > 正文

Spring Cloud Alibaba 整合OpenFeign

2024-01-30 22:31:23阅读 0

前面的文章我们写过一篇Spring Cloud Alibaba 怎么做服务调用,当时说的Spring Cloud 内建两种实现方法,分别是 @LoadBalanced RestTemplate 以及 OpenFeign。那么今天我们就来聊一聊OpenFeign。

一、OpenFeign是什么

OpenFeign是一个声明式的web服务客户端,它让编写web服务客户端变的非常容易,只需要创建一个接口并在接口上添加注解即可。openFeign的前身是Feign,后者目前已经停更了,openFeign是SpringCloud在Feign的基础上支持了Spring MVC的注解,并通过动态代理的方式产生实现类来做负载均衡并进行调用其他服务。

Feign目的就是为了使编写Java Http客户端变的更加容易。我们在使用Ribbon+RestTemplate时做服务调用时,如果被调用的服务参数比较复杂,我们在构造url时就会非常麻烦,而通过feign的话,我们只需要写一个接口,加上Spring MVC的注解,就可以实现服务调用,大大简化了我们的代码,并且增加了代码的统一性,可读性。

Feign默认集成了Ribbon客户端,我们在使用Feign做服务调用的时候会自动加上负载均衡,所以所有针对Ribbon的配置在Feign上依然是有效地。同时我们也可以脱离Ribbon来做调用。

二、OpenFeign的组成

接口 作用 默认值
Feign Builder Feign的入口 Feign Builder
Client Feign底层用什么去请求 和 Ribbon配合时:Load BalancerFeignClient
不和 Ribbon配合时 :feign Client Default
Contract 契约,注解支持 SpringMvcContract
Encoder 编码器,用于将对象转换成HTTP请求消息体 SpringEncoder
Decoder 解码器,将响应消息体转换成对象 ResponseEntity Decoder

三、OpenFeign怎么用

jar包引入

我们在micro-consumer模块的pom文件中增加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
加注解

启动类上增加@EnableFeignClients注解
在这里插入图片描述

增加接口

这里我们给要引用的服务增加一个接口,这里我给接口命名为MicroProviderFeign,这里我们使用Spring MVC的注解来配置接口
在这里插入图片描述

服务调用

我们修改之前用RestTemplate做的服务调用,引入上面增加的接口,然后调用接口方法
在这里插入图片描述

测试OK!

四、OpenFeign的配置

Feign默认支持两种配置方式,java代码配置与属性方式配置。因为两种方式支持的配置项不完全一样,这里我分配给两种方式列一个表格,来展示它支持的配置项。优先级 属性方式 > 代码配置

代码方式
配置项 作用
Logger.Level 指定日志级别
Retryer 指定重试策略
ErrorDecoder 指定错误解码器
Request.Options 超时时间
Collection 拦截器
SetterFactory 用于设置Hystrix的配置属性,Feign整合Hystrix才会用
属性方式

这里我直接把官网的yaml粘贴过来

feign:
  client:
    config:
      feignName:
        connectTimeout: 5000 #连接超时时间
        readTimeout: 5000 #读取超时时间
        loggerLevel: full #日志级别
        errorDecoder: com.example.SimpleErrorDecoder #错误解码器
        retryer: com.example.SimpleRetryer #重试策略
        requestInterceptors:
          - com.example.FooRequestInterceptor #拦截器
        decode404: false #是否对404错误码解码
        encoder: com.example.SimpleEncoder #编码器
        decoder: com.example.SimpleDecoder #解码器
        contract: com.example.SimpleContract #契约

五、OpenFeign日志配置

Feign默认是不打印日志的,我们可以通过代码方式或者属性方式来配置日志级别

Logger.Level的值
描述
NONE 不打印日志(默认)
BASIC 只打印请求方法、RUL、状态码和执行时间(推荐生产环境使用)
HEADERS 打印请求/响应头的基本信息
FULL 打印所有信息
代码方式配置

修改FeignClient接口的日志级别为DEBUG,只有在接口的日志级别为DEBUG时才会生效

logging.level.com.gideon.consumer.feign.MicroProviderFeign=DEBUG

增加Feign的配置类
在这里插入图片描述
测试
在这里插入图片描述

属性方式

修改application.properties

logging.level.com.gideon.consumer.feign.MicroProviderFeign=DEBUG
feign.client.config.default.logger-level=basic

测试
在这里插入图片描述
这里我配置的是basic,可以看到只是输出了method url status code execution time

六、OpenFeign客户端配置

feign默认使用的UrlConnection去发送请求,但是他同时还支持OkHttpClientApacheHttpClient,并且后两个客户端是支持连接池的,所以Feign的性能也会得到优化。这里我们配置下ApacheHttpClient

加依赖
 <dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>
写配置
#feign修改为httpclient客户端
feign.httpclient.enabled=true
#feign连接池最大连接数
feign.httpclient.max-connections=100 
#feign连接池单个路径的最大连接数
feign.httpclient.max-connections-per-route=20 

七、OpenFeign配置最佳实践

  • 尽量使用属性配置,属性方式实现不了的情况下再考虑用代码配置
  • 在同一个微服务内尽量保持单一性,比如统一使用属性配置,不要两种方式混合使用,增加定位代码的复杂性

网站文章

  • maven html文件 404,simple spring web maven 项目无法发布到tomcat下(404异常)

    当前位置:我的异常网» Java Web开发»simple spring web maven 项目无法发布到tomcat下(4simple spring web maven 项目无法发布到tomcat下(404异常)www.myexceptions.net网友分享于:2015-10-21浏览:0次simple spring web maven 项目无法发布到tomcat下(404错误)...

    2024-01-30 22:31:15
  • html页面基于ajax按钮60秒倒计时

    基于ajax按钮动态刷新倒计时 var count = 60;//声明全局变量 $(function(){ var starttime = $.cookie(&quot;registertime&quot;);//取上次点击按钮发送验证码的时间 if(starttime){//判断是否在该浏览器点击过该按钮 var curtime = new Date().fo...

    2024-01-30 22:31:08
  • SpringBoot读取properties配置文件

    application.properties #map 第一种方式 data.person.name=zhangsan data.person.sex=man data.person.age=11 d...

    2024-01-30 22:30:39
  • 不同语言程序 zmq 通信遇到的问题

    工作中用到了golang写一个opc 客户端,从opc server获取数据,并格式化成内部通用格式,屏蔽外差异。用到了golang的zmq ,作为 publish server。以前客户端是用python写的,用的是subscribe模式。但是有一个问题,python 的zmq 的发送接收有很多方法,send(), send_json(), send_multipart(),而golang...

    2024-01-30 22:30:32
  • linux下java代码中执行R代码或函数(二)

    前言以下代码在redhat 6.4,jdk 1.7,R 3.1.2下运行通过。在linux下使用rJava比在windows下繁琐一些,如果初次调用,会遇到各种问题。作为一个经典的插件,请坚信这些问题都可以找到解决方案,你需要的就是耐心地google一个又一个关键字。未完待续。。。引用文章参考以下博客,感谢原作者的分享: [1] 终于搞定Java调用R了 [2] 安装rJava包失败处理方法

    2024-01-30 22:30:25
  • kudu-列式存储管理器-第三篇

    1、kudu-分区方式 为了提供可扩展性,Kudu 表被划分为称为 tablets 的单元,并分布在许多 tablet servers 上。行总是属于单个 tablet 。将行分配给 tablet 的方法由在表创建期间设置的表的分区决定。 kudu提供了3种分区方式: 1.1、Range Partitioning ( 范围分区 ) 1.1.1、Range Partitioning ( 范围...

    2024-01-30 22:29:55
  • sql语句使用in条件查询时结果为多个mybatis返回一个的问题分析

    sql语句使用in条件查询时结果为多个mybatis返回一个的问题分析

    sql语句使用in条件查询时结果为多个mybatis返回一个的问题分析

    2024-01-30 22:29:48
  • 调度、模型、同步与任务——阿里云大数据数仓建设性能优化方案

    调度、模型、同步与任务——阿里云大数据数仓建设性能优化方案

    摘要: 对于阿里云大数据数仓建设性能优化而言,主要可以从调度优化、模型优化、同步优化以及任务优化这四个方面着手。其实,对于性能优化而言,最终还是会归结到“资源”之上,所以资源是否足够,分配是否合理也是...

    2024-01-30 22:29:41
  • SublimeText3: ImportError: No module named ‘urllib2′ 热门推荐

    使用sublime text的同学一般会装package control这个插件,这个插件是管理插件的功能,先安装它,再安装其他插件就方便了。 console安装命令: import urllib2,os;pf=&#39;Package Control.sublime-package&#39;;ipp=sublime.installed_packages_path();

    2024-01-30 22:29:06
  • strictfp关键字和clone()方法

    strictfp关键字和clone()方法

    strictfp 关键字<strict float point (精确浮点)>1.可以用在哪里接口类方法2.有什么作用?使用 strictfp 关键字声明一个方法时,该方法中所有的float和doub...

    2024-01-30 22:28:57