http客户端Feign

http客户端Feign

RestTemplate方式调用存在问题:

  • 代码可读性差,编程体验不统一
  • 参数复杂的URL难以维护

Feign是一个声明式的客户端,作用就是帮我们优雅的实现http请求的发送

基于Feign的远程调用

1.导入依赖坐标

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

2.开启注解

@EnableFeignClients

3.使用Feign客户端

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

}

主要是基于SpringMVC注解来声明远程调用的信息

@Autowired
private UserClients userClients;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);

        //用Feign远程调用
        User user = userClients.findById(order.getUserId());

        //3.封装User到Order
        order.setUser(user);
        // 4.返回
        return order;
    }

自定义Feign的配置

类型
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过htt请求发送
feign.Contract支持的注解格式默认是SpringMVC的注解
feign.Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般我们需要配置的是日志级别

配置Feign日志有两种方式:

方式一:配置文件方式

1.全局生效:

feign:
 client:
   config:
     default:
       loggerLevel: FULL

2.局部生效:

feign:
 client:
   config:
     userservice: #这里配置具体的服务
       loggerLevel: FULL

方式二:java代码方式,需要声明一个bean(BASIC基本信息)

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

1.如果是全局配置,则把他放到@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)注解中

2.如果是局部配置,则把它放到@FeignClient这个注解中,是针对某个服务的

@FeignClient(value = "userservice",configuration = DefaultFeignConfig.class)

在这里插入图片描述

日志级别 尽量使用basic

Feign的性能优化

连接池配置

引入httpclient依赖

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

配置连接池

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

Feign的最佳实践

方式一(继承):给消费者的FeignClient和提供者的controlller定义统一的父接口作为标准

方式二(抽取):将FeignClint抽取为独立模块,并把接口有关的POJO、默认的配置都放到这个模块中,提供给所有消费者使用

1.创建一个model,命名为feign-api,然后引入feign的starter依赖

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

2.将order-service中编写的UseClient、User、DefaultFeignConfiguration都复制到feign-api项目中

3.在order-service中引入feign-api的依赖

<dependency>
    <groupId>cn.itcast.demo</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

4.修改order-service中所有与上述三个组件有关的import部分,改成feign-api中的包

报错:

ield userClients in cn.itcast.order.service.OrderService required a bean of type ‘cn.itcast.feign.clients.UserClients’ that could not be found.

定义的FeignClient不在 SpringBootApplication的包扫描范围时,这些FeignCllient无法使用

方式一:指定FeignClient所在包

@EnableFeignClients( basePackages = "cn.itcast.feign.clients") 

方式二:指定FeignClient字节码

@EnableFeignClients(clients = UserClients.class)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值