当前位置: 首页 > news >正文

http客户端Feign

Feign替代RestTemplate

RestTemplate方式调用存在的缺陷

        String url="http://userservice/user/"+order.getUserId();User user = restTemplate.getForObject(url, User.class);

代码可读性差,变成体验不统一;

参数复杂的时候URL难以维护。

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

添加注解,启动类上,这里我们针对的主要就是消费者得服务。

@EnableFeignClients 

书写工具类

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

信息:服务名称,请求方式,请求路径,请求路径,返回值类型

将之前得RestTemplate对象注解掉。

    @Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 4.返回User user = userClient.findById(order.getUserId());order.setUser(user);return order;}

小结

        引入依赖        -->        添加注解        -->        编写FeignCLient接口        -->        方法替代

自定义配置Feign

修改配置类型

我拿日志配置的设置举例。 

配置文件方式

feign:client:config:
#      default: #全局配置
#        loggerLevel: FULLuserservice:  #针对某个微服务配置loggerLevel: FULL #日志级别

Java代码方式

先声明Bean

public class FeignClientConfiguration {@Beanpublic Logger.Level feignLogLevel(){return  Logger.Level.BASIC;}
}

全局配置

在主启动类得这个注解

@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)

针对每个提供者服务配置

在client的工具类中的注解

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

使用优化

底层客户端实现:

        URLConnection:默认实现,不支持连接池

        Apache HttpClient :支持连接池

        OKHttp:支持连接池

优化的性能主要是:

        使用连接池代替默认的URLConnection

        日志级别,最好用basic或none

使用方式

我拿httpclient举例

        <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>

配置文件修改

feign:client:config:
#      default: #全局配置
#       loggerLevel: FULL
#      userservice:  #针对某个微服务配置
#       loggerLevel: FULL #日志级别httpclient:enabled: true   #开启支持max-connections: 200  #最大连接数max-connections-per-route: 50 #每个路径的最大连接数

总结

        日志级别尽量用basic,我使用的是java代码方式,不是配置文件方式,你可以看到,我的配置文件日志级别注释掉了。

        使用HttpClient或OKHttp代替URLConnection

                导依赖

                配置文件开启功能,设置参数。

最佳实践

消费者的FeignClient在远程调用提供者的服务时,需要每次都要书写这个类,如果有100个消费者服务需要调用的话是不是很麻烦呢?将其抽取出来,只需要书写一次,在需要时直接导包就可以。

方式————抽取

 将FeignClient、POJO、Feign的默认配置都抽取出来成为一个项目,供所有消费使用。

步骤

定于moule,导入feign的starter依赖。

将将提供者的Cllent、FeignConfiguration、需要的实体类移植到该模块中。

在需要的消费者中引入该模块的依赖,并把那些不必要的类和包斩掉。

将消费者中的import更新为该模块的依赖。

重启测试。

新模块的 

对于之前的消费者,不需要的部分删去。

 可以看到没有那些类和文件了。

导依赖的时候很简单。

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

需要注意的

当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient无法使用。有两种方式解决: 方式一:指定FeignClient所在包

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

原来消费的配置文件中也不能有关于feign的配置了,需要全部注释掉,那该怎末办呢,还有之前的httpclient,那就不能使用了呀,我觉得有两种方式

一:放到抽取出来的那个公共模块里面去;

二:在nacos的管理端,针对某个服务写配置文件,你可以试试

http://www.lryc.cn/news/28102.html

相关文章:

  • 如何在Java中使用枚举类:从入门到进阶
  • 操作系统(1.2)--引论
  • 【Linux】 shell if的[]和[[]]区别
  • 利用flask解析海康摄像头视频
  • ./docker-compose.yml‘ is invalid
  • Java 流程控制
  • 边界无限入选首届“网络安全高成长性企业”并荣获“勇创之星”
  • SpringBoot项目的快速创建方式(包含第一个程序的运行)
  • linux下设置定期执行需要root权限的sh文件
  • 认识异或运算
  • 内容提供者的简单使用
  • Modelsim 操作结构和流程
  • vue和react有什么不同
  • js求解《初级算法》28. 找出字符串中第一个匹配项的下标
  • VAE--part1
  • 备战四级!!!
  • sizeof与strlen练习
  • 知识图谱的介绍
  • 【Redis】Redis高级客户端Lettuce详解
  • Qt——自定义界面之QStyle
  • 指针和数组面试题(逐题分析,完善你可能遗漏的知识)
  • centos7搭建nfs挂载日志目录完整步骤
  • 三、JavaScript
  • 深圳大学计软《面向对象的程序设计》实验11 多继承
  • 并发变成实战-原子变量与非阻塞同步机制
  • sql数据库常用操作指令
  • 4-1 定时任务的示例10个
  • 外贸建站多少钱才能达到预期效果?
  • 【Java学习笔记】5.Java 基本数据类型
  • InnoDB 死锁和问题排查