使用Feign远程调用快速入门

1,262 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

在这里插入图片描述 ** Feign是一个声明式的http客户端,官方地址: github.com/OpenFeign/f… 其作用就是帮助我们优雅的实现http请求的发送,解决.上面提到的问题。** 在这里插入图片描述 @TOC

1.远程调用

1.1 引入依赖

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

1.2 开启自动装配功能

在这里插入图片描述

@EnableFeignClients

1.3 创建客户端接口

在这里插入图片描述

//请求服务的昵称
@FeignClient("userservice")
public interface UserClient {
//    定义一个方法,方法的返回值就是你要的结果
    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);

}

1.4 调用方法

	@Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
      // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.用Feign远程调用
        User user = userClient.findById(order.getUserId());
        // 3.封装user到Order
         order.setUser(user);
        // 4.返回
        return order;
    }

同时Feign还集成了负载均衡的功能。 在这里插入图片描述 它调用了Spring Cloud Netflix-Ribbon方法Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松的将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。 Ribbon内置了7种负载均衡算法,并且保留了扩展,用户可通过实现 IRule接口,实现自定义负载均衡算法,具体内容可以参考我之前的文章,

`BestAviableRule
跳过熔断的Server,在剩下的Server中选择并发请求最低的Server。

ZoneAvoidanceRule
随机选择一个server。

AvailabilityFilteringRule
剔除因为连续链接、读失败或链接超过最大限制导致熔断的Server,在剩下读Server中进行轮询。

RoundRobinRule
roundRobin方式轮询选择server,默认。

RandomRule
随机选择一个server。

RetryRule
可重试的策略,可以对其他策略进行重试。

ResponseTimeWeightedRule
根据响应时间加权,响应时间越短权重越大,被选中的可能性越高。

2.Feign自定义配置

在这里插入图片描述

2.1 方式1

在这里插入图片描述 全局生效方式

feign:
  client:
    config:
      default:
        loggerlevel: FULL

设置FULL会把所有的请求记录输出包括请求体 在这里插入图片描述

2.2 方式2

通过bean的方式来使用 在这里插入图片描述 单独创建一个bean类,在类上添加当前服务的注解也就对当前服务生效。

package cn.itcast.feign.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
@FeignClient("userservice")
public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel(){
        return Logger.Level.BASIC;
    }
}

全局生效设置要在启动类上配置注解。

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

在这里插入图片描述

总结

Feign的日志配置: 1.方式- 是配置文件, feign.client.config.xxx.loggerLevel ①如果xxx是default则代表全局 ②如果xxx是服务名称,例如userservice则代表某服务 2.方式二是java代码配置Logger.Level这个Bean ①如果在@EnableFeignClients注解声明则代表全局 ②如果在@FeignClient注解中声明则代表某服务

3.Feign性能优化

在这里插入图片描述

3.1 引入依赖

        <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

3.2 配置连接池

在这里插入图片描述

方式1

feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

在这里插入图片描述

4.性能优化实践

在这里插入图片描述 缺点就是得在重新写一次方法。

方式2

在这里插入图片描述 优点耦合低。全部封装到一个独立模块中,后面直接调用即可,缺点是会把不必要的方法也封装进来。 在这里插入图片描述 新建一个module 在这里插入图片描述 导入Feign依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

在这里插入图片描述 直接把Feign接口还有实体类和bean都抽取过来 抽取完成后还要引入我们这个类,不然会找不到方法。

        <!--引入feign的统一api-->
        <dependency>
            <groupId>cn.itcast.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决: 方式一:指定FeignClient所在包 @EnapLeFeignClients(basePackages = "cn. itcast . feign. clients")

方式二:指定FeignClient字节码. @EnabLeFeignClients(clients = {UserClient . class})

在这里插入图片描述 如果不指定会导致扫不到包注入失败 在这里插入图片描述