首页 > 其他分享 >Feign-基于Feign远程调用(八)

Feign-基于Feign远程调用(八)

时间:2024-01-10 14:25:02浏览次数:31  
标签:FeignClient feign 调用 http Feign order 注解 远程

1 Feign 替代 RestTemplate

RestTemplate 方式调用存在的问题

使用RestTemplate发起远程调用的代码:

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

存在下面的问题:

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

2 Feign的介绍

Feign是一个声明式的http客户端,官方地址:http://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上述问题。

3 定义和使用Feign客户端

使用Feign的步骤如下:

  1. 引入依赖

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

  2.在order-service的启动类添加注解开启Feign的功能:

@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
   public static void main(String[] args){
      SpringApplication.run(OrderApplication.class,args);  
   }          
}

 使用Feign的步骤如下:

  3.编写Feign客户端

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

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

  • 服务名称:userservice
  • 请求方式:GET
  • 请求路径:/user/{id}
  • 请求参数:Long id
  • 返回值类型:User

  4.使用Feign客户端代替RestTemplate

@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId){
  //1 查询订单
  Order order = orderMapper.findById(orderId);
  //2 利用Feign发起http请求,查询用户
  User user = userClient.findById(order.getUserId());
  //3 封装user 到 order
  order.setUser(user);
  //4 返回
  return order;
}

总:

Feign的使用步骤:

  • 引入依赖;
  • 添加@EnableFeignClients注解;
  • 编写FeignClient接口;
  • 使用FeignClient中定义的方法代替RestTemplate

4 自定义Feign的配置

  1. Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:

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

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

  2. 配置Feign日志的两种方式:

方式一:配置文件方式

  • 全局生效:
feign:
  client:
    config:
      default: #这里用default就是全局配置,如果写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL  #日志级别
  • 局部生效
feign:
  client:
    config:
      userservice: #这里用default就是全局配置,如果写服务名称,则是针对某个微服务的配置
        loggerLevel: FULL  #日志级别

方式二:java代码的方式

  • 需要先声明一个Bean:
public class FeignClientCongiguration {
  @Bean
  public Logger.Level.feignLogLevel(){
    return  Logger.Level.BASIC;
  }
}
  • 而后如果是全局配置,则把它放到@EnableFeignClients这个注解中:
@EnableFeignClient(defaultConfiguration = FeignClientConfiguration.class)
  • 如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "userservice",configuration = FeignClientConfiguration.class)

5 Feign的性能优化

Feign底层的客户端实现:

  • URLConnection:默认实现,不支持连接池;
  • Apache HttpClient:支持连接池;
  • OKHttp:支持连接池;

因此优化Feign的性能主要包括:

  • 使用连接池代替默认的URLConnection;
  • 日志级别,最好使用basic或none。

总:

Feign的优化:

  • 日志级别尽量用basic;
  • 使用HttpClient或OKHttp代替URLConnection;
    • 引入feign-httpClient依赖;
    • 配置文件开启httpClient功能,设置连接池参数。

6 Feign的最佳实践

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

  • 服务紧耦合;
  • 父接口参数列表中的映射不会被继承;

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

不同包的FeignClient的导入有两种方式:

  • 在@EnableFeignClients注解中添加basePackages,指定FeignClient所在的包;
  • 在@EnableFeignClients注解中添加clients,指定具体FeignClient的字节码。

标签:FeignClient,feign,调用,http,Feign,order,注解,远程
From: https://www.cnblogs.com/daytoy105/p/17956004

相关文章

  • C# 调用WebService 笔记
    最近开发工作涉及到一些关于webService调用的问题,因为太久没有做过这部分,踩了一点坑,做个笔记记录一下,避免下次踩坑。说明C#调用webService基本有两种方法,一种是静态调用,也就是添加到服务引用,还有一种方式是动态引用,动态引用的主要思路是通过url将DLL下载到本地,然后进行调用,这里......
  • Qt QProcess进程间调用及交互通信,完整示例
    1.概述使用Qt进行应用程序开发,主要是通过QProcess类用于启动外部程序并与其进行通信.1.1.运行进程要启动进程,需要运行的程序的名称和命令行参数作为参数传递给start()。参数以QStringList形式提供。start()方法原型:voidstart(constQString&program,constQStringList&a......
  • Docker 开放远程访问
    当我们需要打包docker镜像但又不想在本地安装docker时,我们就可以连接远程服务器上的docker,使用它来打包进行。在idea中可以使用docker插件,方便快捷管理远程服务器上的docker容器。但这一切的前提是服务的docker开放了远程访问端口。方式一:直接暴露便捷/usr/lib/systemd/system/doc......
  • uniapp调用相机
    uni.chooseImage({count:1,//默认9sizeType:['original','compressed'],//可以指定是原图还是压缩图,默认二者都有sourceType:['album','camera'],//album从相册选图,camera使用相机success:function(res){console.log(JSON.stringify(res.temp......
  • EasyCVR如何通过调用API接口查询和下载设备录像?
    EasyCVR是基于各种IP流媒体协议传输的视频汇聚和融合管理平台,采用了开放式的网络结构,支持高清视频的接入和传输、分发。在录像与回看功能方面,可视化监控云平台EasyCVR不仅支持录像的检索与回看,还支持下载、分享,包括下载云端录像和设备录像。今天我们就来介绍下,EasyCVR视频监控系统......
  • 记一次JSF异步调用引起的接口可用率降低
    前言本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程,主要介绍了排查思路和JSF异步调用的流程,希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF1,7.5-HOTFIX-T6版本。起因问题背景1.广告投放系统是典型的I/O密集型(I/......
  • 微服务架构服务间调用如何规范
    目前微服务架构应用非常普遍,我们在获得其带来的优势的同时,需要思考是否解决了其带来的问题。在以往学习SpringBoot的过程中,就遇到关于Service循环依赖的问题。微服务架构中服务间相互依赖的问题仍然十分普遍,针对这个问题,我咨询过公司的架构师,他们的回答是无法解决/避免。显然上述......
  • elixir erlang 简单调用学习
    实际上基于elixir的mix进行erlang以及elixir的互调用开发处理是很方便的,mix直接就包含了构建erlang代码同时对于代码的互调用,只要使用符合语言格式要求就行了,以下是一个简单的互调用学习项目准备项目结构 ├──README.md├──lib│├──a.ex│└──er_app......
  • C# 调用 Python (.exe) 程序
      C#调用Python有常见的四种方法,之所以选择这种,是因为相对简单,并且出错率低、适用范围广  熟悉Python开发的人都知道,在写Python程序时免不了有使用第三方库,这里也是调用python程序最容易出错的地方  当然.exe的方式也造成了最大的性能损失下面以终端程序为例核心代码usi......
  • C 语言函数完全指南:创建、调用、参数传递、返回值解析
    C语言中的函数函数是一段代码块,只有在被调用时才会运行。您可以将数据(称为参数)传递给函数。函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。预定义函数事实证明,您已经知道什么是函数了例如,main()是一个函数,用于执行代码,printf()也是一个函数,用于向屏......