声明式服务调用Feign

一、Feign介绍

1、什么是feign? ​

feign是springcloud提供的声明式的http客户端,工作在consumer端 ​

feign支持springmvc注解 ​

feign集成了ribbon也支持负载均衡

2、feign启动器 ​

spring-cloud-starter-openfeign

二、feign入门案例

注意:@FeignClient("服务名") 服务名不支持下划线!否则会报错

1、创建feign_provider ​ ... ...

2、创建feign_interface ​

1)pom.xml ​ openfeign、springcloud_common ​

2)feign接口 ​

package com.bjpowernode.xxx;

@FeignClient("服务名")  
public interface UserFeign{

    @RequestMapping("/getUserById/{id}") //请求的url
    public User getUserById(@PathVariable("id") Integer id);

}

3、创建feign_consumer

1)pom.xml feign_interface

2)controller

public class ConsumerController {

    @Autowired
    private UserFeign userFeign;//代理类

}

3)app启动类

@EnableFeignClients

三、feign原理

1、将feign接口扫描到spring容器:

​@EnableFeignClients开启feign注解扫描:FeignClientsRegistrar.registerFeignClients()扫描为@FeignClient标识的接口生成代理类,并把代理类交给spring容器管理;

2、为接口的方法创建RequestTemplate ​

当consumer调用feign代理类时,代理类会调用SynchronousMethodHandler.invoke()创建RequestTemplate(url,参数,httpMethod);

3、发出请求 ​

发请求时会通过RequestTemplate创建Request对象,然后client(HttpClient、OkHttp、UrlConnect)使用Request对象发送请求

由于http每次需要三次握手四次分手,所以推荐使用http连接池:

优化:
    client 默认使用的是DefaultClient 可以更换为HttpClient
    在consumer引入http连接池依赖即可 效率更高
    <!--http连接池-->
    <dependency>
         <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
    </dependency>

四、feign接口传参

1、?传参 ​ @RequestParam("id")

2、restful传参 ​ @PathVariable("id")

3、pojo传参 ​ @RequestBody

五、feign优化

1、开启feign日志 ​

feign:
  client:
    config:
      default:
        loggerLevel: full #开启feign的日志 前提:com.bjpowernode.feign包下的日志输出级别必须为debug
logging:
  level:
    com.bjpowernode.feign: debug

2、http连接池

<!--http连接池-->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>

3、gzip压缩

server:
  port: 80
  compression:
    enabled: true #开启浏览器<----->consumer的gzip压缩
feign:
  compression:
    request:
      enabled: true
    response:
      enabled: true #consumer<------>provider的gzip压缩

4、feign超时

#方式一:
ribbon: #设置所有服务的超时时间
  ConnectionTimeout: 5000
  ReadTimeout: 5000

#方式二:
feign:
  client:
    config:
      feign-provider: #服务名 设置某个服务的超时时间
      ConnectionTimeout: 5000
      ReadTimeout: 5000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值