Feign:使用接口方式调用服务

一、快速入门

1.引入Feign依赖
 

<!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.实现Feign接口

a.在applaciation类上添加@EnableFeignClients注解,@Import注解@EnableFeignClients告诉框架扫描所有使用注解@FeignClient定义的feign客户端。它又通过注解@Import导入了类FeignClientRegistrar( feign客户端注册器)

b.在orderservice定义Feign客户端接口,该接口指定的是userservice中的一个接口

@FeignClient("userservice")
public interface UserClient {
    @GetMapping("/user/{id}")
    public User getUser(@PathVariable("id") Long id);
}

3.使用Feign接口

@Autowired
   private UserClient userClient;
   @GetMapping("/getUser")
    public User getUser(Long id){
       return userClient.getUser(id);
   }

首先在OrderController中注入userClient,然后使用userClient直接调用其中定义的方法就行。

二、自定义Feign的配置

1.通过配置文件修改

feign:
  client:
    config:
      default: #这里应该制定调用方的名称,default代表全部
        loggerLevel: full # 日志级别

 2.通过配置类修改

public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

添加到@EnableFeignClient注解上或者添加在@FeignClient上

//全局
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
//局部,指定该client的远程调用其它接口的日志级别
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)

图解:

 三、Feign的性能调优

1.Feign的底层客户端实现

a.UrlConnection 默认使用,不支持连接池

b.Apache HttpClient 支持连接池

c.OkHttp 支持连接池

使用UrlConnection不断地开启关闭连接池会导致资源消耗过大,时间消耗过长,所以说我们采用支持连接池的方式。

  <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
feign:
#  client:
#    config:
#      default: #这里应该制定调用方的名称,default代表全部
#        loggerLevel: full # 日志级别
  httpclient:
    enabled: true
    max-connections: 200 # 最大连接数
    connection-timeout: 2000 # 连接超时时间
    max-connections-per-route: 50 # 每个路由最大连接数
    time-to-live: 900000 # 连接空闲时间
    time-to-live-unit: MILLISECONDS # 时间单位

 2.日志级别

        尽量选择none、basic

四、Feign的最佳实践方案

1.controller和FeignClient实现统一接口

优点:我们不用重复代码,可以直接实现接口中的方法,是面向契约的编程思想。

缺点:代码是紧耦合的,并且对SpringMVC中的方法参数是继承不下来的,例如:@PathVariable

2.抽取的思想

优点:我们定义一个新的model,包含一个服务的所有接口的客户端调用,Pojo类,Feign的配置类等。

缺点:我们在导入依赖时,会造成冗余,有我们不需要的代码。

3.抽取的实践

a.新建model:feign-api

b.创建client包,创建暴露的接口对应的client。例如:UserClient

c.创建对应的pojo类

d.创建默认的配置文件,DefaultFeignClientConfiguration类

e.在使用feign-api的项目中引入feign-api的pom依赖。

f.最后需要再使用feign的客户端的@EnableFeignClient中加入clients注解,使UserClients可以被spring扫描到并且注册成bean。

【注】feign的扫包有两种方式:

总步骤图解:

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值