从浅入深 学习 SpringCloud 微服务架构(六)Feign(2)
一、feign 的配置:
1、从 Spring Cloud Edgware 开始,Feign 支持使用属性自定义 Feign。
对于一个指定名称的 FeignClient(例如该 Feign Client 的名称为 feignName)。
2、Feign 支持如下配置项:
feign:
client:
config:
feignName: ## 定义 Feginclient 的名称
connecttimeout: 5000 # 相当于Request.Options
readTimeout: 5000 # 相当于 Request.options
1oggerLevel: ful1 # 配置Feign的日志级别,相当于代码配置方式中的 Logger
errorDecoder: com.example.simpleErrorDecoder # Feign 的错误解码器,相当于代码配置方式中的 Errordecoder
retryer: com.example.simpleRetryer # 配置重试,相当于代码配置方式中的 Retryer
requestInterceptors: # 配置拦截器,相当于代码配置方式中的 RequestInterceptor
-com.example.FooRequestInterceptor
- com.example.BarRequestInterceptor
decode404: false
3、feign 配置项 参数说明:
feignName : FeginClient 的名称。
connectTimeout : 建立链接的超时时长。
readTimeout : 读取超时时长。
loggerLevel : Fegin的日志级别。
errorDecoder : Feign的错误解码器。
retryer : 配置重试。
requestInterceptors : 添加请求拦截器。
decode404 : 配置熔断不处理404异常。
二、 Feign 和 Ribbon 的联系与区别:
1、Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡的工具。
它可以在客户端配置 RibbonServerList (服务端列表),
使用 HttpClient 或 RestTemplate 模拟 http 请求,步骤相当繁琐。
2、Feign 是在 Ribbon 的基础上进行了一次改进,是一个使用起来更加方便的 HTTP 客户端。
feign 采用接口的方式,只需要创建一个接口,然后在上面添加注解即可,
将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建 http 请求。
然后就像是调用自身工程的方法调用,而感觉不到是调用远程方法,使得编写客户端变得非常容易。
3、负载均衡
Feign 中本身已经集成了 Ribbon 依赖和自动配置,
因此我们不需要额外引入依赖,也不需要再注册 RestTemplate对象。
另外,我们可以通过 ribbon.xx 来进行全局配置。
也可以通过服务名 .ribbon.xx 来对指定服务配置。
三、feign 负载均衡测试
1、运行(eureka_service, order_service)两个启动类 和两个 product_service,进行测试
浏览器地址栏输入:http://127.0.0.1:9000/
会发现 product_service 有两个端口 9001 和 9011。
浏览器地址栏输入:http://127.0.0.1:9001/product/1
正常输出 mysql 数据库的第一条记录:
浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1
正常输出 mysql 数据库的第一条记录:
2、启动了两个 shop_service_product,重新测试
可以发现使用 Ribbon 的轮询策略进行负载均衡。
# IDEA2019 如何打开 Run Dashboard 运行仪表面板
浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1
多刷新几次,会发现,输出界面采用轮询的方式。
四、feign 请示压缩 和 打印 fegin 日志
1、Spring Cloud Feign 支持对请求和响应进行 GZIP 压缩,
以减少通信过程中的性能损耗。通过配置参数即可开启请求与响应的压缩功能。
也可以对请求的数据类型,以及触发压缩的大小下限进行设置。
feign:
compression:
request:
enabled: true # 开启请求压缩
mime-types: text/html,application/xml,application/json # 设置压缩的数据类型,默认此几个类型。
min-request-size: 2048 # 设置触发压缩的大小下限,默认 2048。
response:
enabled: true # 开启响应压缩
2、fegin 日志配置:
# 配置 feign 日志的输出:
# 日志配置:
# NONE:不输出日志,
# BASIC:适用于生产环境追踪问题,
# HEADERS:在BASIC基础上记录请求和响应头信息,
# FULL:记录所有。
feign:
client:
config:
service-product: # 需要调用的服务名称
loggerLevel: FULL
logging:
level:
djh.it.order.feign.ProductFeignClient: debug
3、在消费都子工程(子模块) order_service 中,application.yml 配置文件中,
配置 fegin 日志,进行测试。
## spring_cloud_demo\order_service\src\main\resources\application.yml
server:
port: 9002 #端口
# port: ${port:9002} # 启动端口设置为动态传参,如果未传参数,默认端口为 9002
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
# url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
username: 'root'
password: '012311'
application:
name: service-order #服务名称
jpa:
database: MySQL
show-sql: true
open-in-view: true
eureka: # 配置 Eureka
client:
service-url:
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true # 使用 ip 地址注册
instance-id: ${spring.cloud.client.ip-address}:${server.port}
# 配置 feign 日志的输出:
# 日志配置:NONE:不输出日志,BASIC:适用于生产环境追踪问题,HEADERS:在BASIC基础上记录请求和响应头信息,FULL:记录所有。
feign:
client:
config:
service-product: # 需要调用的服务名称
loggerLevel: FULL
logging:
level:
djh.it.order.feign.ProductFeignClient: debug
4、运行(eureka_service, product_service, order_service)三个启动类 ,进行测试
浏览器地址栏输入:http://127.0.0.1:9002/order/buy/1
在 idea 控制台 Console 中查看日志信息。