0
点赞
收藏
分享

微信扫一扫

SpringCloud系列(六)Feign 客户端的配置及使用

凌得涂 2022-12-22 阅读 119

Feign

1 使用步骤

步骤一: 引入 Feign 客户端依赖;

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

步骤二: 在 consumer-service 的启动类中添加注解 @EnableFeignClients 来开启 Feign 的功能;
在这里插入图片描述
步骤三: 开始编写 Feign 客户端;
我这里是新建了一个 feign 包, 然后在 clients 中声明远程调用的信息, 这里也是基于 Spring 的注解;

@FeignClient("providerservice")  // 服务名称
public interface ProviderClient {
    @GetMapping("/provider/{id}")  // 请求方式及路径
    provider findById(@PathVariable("id") Long id);
}

步骤四: 使用 Feign 客户端来进行发送请求;
对比: 通过代码数量就可以看得出简单了很多!
在这里插入图片描述

@Service
public class ConsumerService {

    @Resource
    private ConsumerMapper consumerMapper;
    @Resource
    private ConsumerClient consumerClient;
    
    public Consumer queryOrderById(Long consumerId) {
        // 1. 查询订单
        Consumer consumer = consumerMapper.findById(consumerId);
        // 2. 用 Feign 远程调用
        Provider provider = consumerClient.findById(consumer.getProviderId());
        // 3. 封装 user 到 Order
        consumer.setProvider(provider);
        // 4.返回
        return consumer;
    }
}

2 自定义使用 Feign

通常还会自定义一些配置来覆盖其默认的配置, 如常用的修改日志的配置; 如下图便是某些配置修改的类型及说明:
在这里插入图片描述
关于具体使用我们以配置 Feign 日志为例子进行说明.

2.1 配置 Feign 日志的两种方式

方式一: 文件配置方式;
在这里插入图片描述

这里的 default 就是全局配置, 如果写的是 consumerservice 则就是对此服务的配置, FULL 为日志级别;

方式二: 使用 java 代码方式; 在 feign 包中加入 config 类, 添加相关的配置; 注意这里要声明一下 bean;

public class DefaultFeignConfiguration {
    @Bean
    public Logger.Level logLevel() {
        return Logger.Level.BASIC;
    }
}

如果是全局配置, 则放在 @EnableFeignClients 这个注解里面:
在这里插入图片描述
如果是局部配置, 就放在 @FeignClient 这个注解中;

@FeignClient(value = "providerservice", configuration = FeignClientsConfiguration.class)
public interface ProviderClient {

    @GetMapping("/provider/{id}")
    Provider findById(@PathVariable("id") Long id);
}

3 Feign 性能优化

关于 Feign 的优化主要体现在使用连接池代替默认的 URLConnection, 其次在日志设置要日志级别最好设置为 BASIC 或者是 NONE;
配置连接池方式:
步骤一: consumerservice 中引入 httpClient 依赖;

        <!--httpClient的依赖 -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

步骤二: 配置连接池;
在这里插入图片描述

4 Feign 最佳实践

方式一: 将消费者的 FeignClient 和 提供者的 controller 定义统一的父接口作为标准, 这样可以使得服务紧密耦合, 父接口参数列表中的映射也不会被继承; 如下图所示:
在这里插入图片描述

方式二 (推荐): 将 Feign 客户端当作业一个独立的模块, 并把所有的配置(如日志级别的配置) / 接口相关的信息等都放在这个模块中, 其实上面我们做的工作就是将 feign 当做一个模块来处理的, 这样可以提供给所有的消费者去使用;
在这里插入图片描述
具体步骤:
在这里插入图片描述

举报

相关推荐

0 条评论