微服务:SpringCloud 使用Feign组件
一、之前项目存在的问题
我们这样去调用微服务:
是不是感觉不好啊,怎么可能去拼字符串呢?low爆了对吧。我们的Feign组件就是解决这个问题滴!
二、Feign组件
1、简介
Feign
是
Netflflix
开发的声明式,模板化的
HTTP
客户端,其灵感来自
Retrofifit,JAXRS-2.0
以及
WebSocket.
-
Feign 可帮助我们更加便捷,优雅的调用 HTTP API 。
-
在 SpringCloud 中,使用 Feign 非常简单 —— 创建一个接口,并在接口上添加一些注解,代码就完成了
-
Feign 支持多种注解,例如 Feign 自带的注解或者 JAX-RS 注解等。
-
SpringCloud 对 Feign 进行了增强,使 Feign 支持了 SpringMVC 注解,并整合了 Ribbon 和 Eureka,从而让 Feign 的使用更加方便。
2、项目中实现

项目仍然是这个项目。
首先我们在order-service这里面加入一些依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
创建一个类
package com.springcloud.demo.feign;
import com.springcloud.demo.entity.Product;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "service-product")
public interface ProductFeginClient {
@RequestMapping(value = "/product/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable("id") Long id);
}
这里的@FeignClient中的name就是指定对应的服务,然后方法的requestMapping就是对应的地址,实际上跟我们直接拼url差不多,但是这个就相当于做了一个分离。
创建一个
Feign
接口,此接口是在
Feign
中调用微服务的核心接口
- 定义各参数绑定时,@PathVariable、@RequestParam、@RequestHeader等可以指定参数属 性,在Feign中绑定参数必须通过value属性来指明具体的参数名,不然会抛出异常。
-
@FeignClient :注解通过 name 指定需要调用的微服务的名称,用于创建 Ribbon 的负载均衡器。 所以Ribbon 会把 shop - service - product 解析为注册中心的服务。
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private ProductFeginClient productFeginClient;
@RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
public Product findById(@PathVariable Long id) {
Product product = productFeginClient.findById(id);
return product;
}
}
直接注入调用。启动测试。可以成功!!!
Ribbon
是一个基于
HTTP
和
TCP
客户端
的负载均衡的工具。它可以
在客户端
配置 RibbonServerList(服务端列表),使用
HttpClient
或
RestTemplate
模拟
http
请求,步骤相当繁琐。
Feign
是在
Ribbon
的基础上进行了一次改进,是一个使用起来更加方便的
HTTP
客户端。采用接口的 方式, 只需要创建一个接口,然后在上面添加注解即可 ,将需要调用的其他服务的方法定义成抽象方 法即可, 不需要自己构建http
请求。然后就像是调用自身工程的方法调用,而感觉不到是调用远程方 法,使得编写客户端变得非常容易
3、实现负载均衡
Feign
中本身已经集成了
Ribbon
依赖和自动配置,因此我们不需要额外引入依赖,也不需要再注册 RestTemplate 对象。另外,我们可以像上节课中讲的那样去配置
Ribbon
,可以通过
ribbon.xx
来进行全局配置。
不需要任何设置,默认是轮询的机制。
Feign
的高级配置 :
从
Spring Cloud Edgware
开始,
Feign
支持使用属性自定义
Feign
。对于一个指定名称的
Feign
Client
(例如该
Feign Client
的名称为
feignName
),
Feign
支持如下配置项:
feign:
client:
config:
feignName: #定义FeginClient的名称
# 相当于Request.Options
connectTimeOut: 5000
# 相当于Request.Options
readTimeout: 5000
# 配置Feign的日志级别,相当于代码配置方式中的Logger
loggerLevel: full
# Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
errorDecoder: com.example.SimpleErrorDecoder
# 配置重试,相当于代码配置方式中的Retryer
retryer: com.example.SimpleRetryer
# 配置拦截器,相当于代码配置方式中的RequestInterceptor
requestInterceptors:
- com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false
-
feignName : FeginClient 的名称
-
connectTimeout : 建立链接的超时时长
-
readTimeout : 读取超时时长
-
loggerLevel: Fegin 的日志级别
-
errorDecoder : Feign 的错误解码器
-
retryer : 配置重试
-
requestInterceptors : 添加请求拦截器
-
decode404 : 配置熔断不处理 404 异常
4、请求压缩
Spring Cloud Feign
支持对请求和响应进行
GZIP
压缩,以减少通信过程中的性能损耗。通过下面的参数 即可开启请求与响应的压缩功能:
feign:
compression:
request:
# 开启请求压缩
enabled: true
response:
# 开启响应压缩
enabled: true
同时,我们也可以对请求的数据类型,以及触发压缩的大小下限进行设置:
feign:
compression:
request:
# 开启请求压缩
enabled: true
# 设置压缩的数据类型
mime-types: text/html,application/xml,application/json
# 设置触发压缩的大小下限
min-request-size: 2048
注:上面的数据类型、压缩大小下限均为默认值。
5、日志级别
在消费者那设置
# 设置服务的日志
# NONE:不输出日志
# BASIC:用于生产环境测试追踪问题
# HEADERS:basic的基础上+ 请求头和响应头信息
# FULL:记录所有
feign:
client:
config:
service-product:
loggerLevel: FULL
logging:
level:
com.springcloud.demo.feign.ProductFeginClient: debug
重新启动项目。访问接口,打印输出
源码的话,拿到之前文章的项目,修改一下就可以了
作者:借汝之光,得以光明
来源链接:https://blog.csdn.net/weixin_44588495/article/details/106352908
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。