一款轻量级的声明式http调用工具!
前沿
项目中我们经常会使用HTTP工具向外部的REST接口发送请求,大家一般使用Okhttp,或者java的HttpClient发起,今天给大家介绍一款轻量级声明式的Http库(FeignClient),使用起来会使我们的项目代码更整洁,利于维护!
快速开始
Feign是spring cloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。 但是在某些项目中,由于遗留原因,整个系统并不是spring cloud项目,甚至不是spring项目,而使用者关注的重点仅仅是简化http调用代码的编写。 如果采用httpclient或者okhttp这样相对较重的框架,对初学者来说编码量与学习曲线都会是一个挑战,而使用spring中RestTemplate,又没有配置化的解决方案,由此想到是否可以脱离spring cloud,独立使用Feign。
引入依赖
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-core</artifactId>
<version>8.18.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.netflix.feign/feign-gson -->
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-gson</artifactId>
<version>8.18.0</version>
</dependency>
定义接口
public interface OuterService {
@RequestLine("GET /requesr/list?name={name}")
@Headers("Authorization: Basic {token}")
String request(@Param(value = "name") String name,@Param(value = "token") String token);
}
通过@RequestLine指定HTTP请求方式及URL地址,@Param指定参数,可以在url或者header中使用{参数名}去填充请求参数。
配置类
OuterService service = Feign.builder()
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "http://127.0.0.1:8085");
开始调用
service.request("test","ad12hj3bhj1b23hj1b2");
json序列化
在项目中,我们发起的Http请求往往都是json格式,feign同样提供基于json的对象转换工具,方便我们直接以对象形式交互。
接口层面指定header:
@Headers({"Content-Type: application/json","Accept: application/json"})
指定Encoder跟Decoder
## 指定Gson序列化。也可以使用Jackson序列化(引入其依赖)
OuterService service = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "http://127.0.0.1:8085");
支持我们完成声明式Http接口调用
使用拦截器
在配置代理类时可以自定义拦截器
OuterService service = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.requestInterceptor(template -> {
// template 可以获取/修改body,header等信息
})
.options(new Options(1000, 3500))
.retryer(new Retryer.Default(5000, 5000, 3))
.target(OuterService.class, "http://127.0.0.1:8085");
注解详解
@RequestLine("GET /messages/detail")
指定请求方式跟请求URL
## get请求
@RequestLine("GET /messages/detail?msg_ids={msgIds}")
## post请求
@RequestLine("POST /messages/detail?msg_ids={msgIds}")
@Param("name")
绑定参数别名,可以在RequestLine/body/headers等注解中通过{参数名}去获取值。
@Headers({"Accept:/", "Accept-Language: zh-cn"})
指定请求header
@Body("{name}")
指定请求返回body值为请求参数name
@QueryMap
只能标注在方法参数上。用于传递多个查询值,拼接在URL后面,只能标注在Map类型的参数前面,否则报错。
@HeaderMap
同上,只是用在Header上而已
END
欢迎关注公众号! 公众号回复:
入群
,扫码加入我们交流群!
阅读更多文章
一款轻量级的声明式http调用工具!的更多相关文章
- Spring Cloud 2-Feign 声明式服务调用(三)
Spring Cloud Feign 1. pom.xml 2. application.yml 3. Application.java 4. Client.java 简化RestTemplate调 ...
- springcloud-feign组件实现声明式的调用
11.使用feign实现声明式的调用 使用RestTemplate+ribbon已经可以完成对服务端负载均衡的调用,为什么还要使用feign? @RequestMapping("/hi&qu ...
- Spring Cloud Feign 声明式服务调用
目录 一.Feign是什么? 二.Feign的快速搭建 三.Feign的几种姿态 参数绑定 继承特性 四.其他配置 Ribbon 配置 Hystrix 配置 一.Feign是什么? 通过对前面Sp ...
- spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- SpringCloud系列-利用Feign实现声明式服务调用
上一篇文章<手把手带你利用Ribbon实现客户端的负载均衡>介绍了消费者通过Ribbon调用服务实现负载均衡的过程,里面所需要的参数需要在请求的URL中进行拼接,但是参数太多会导致拼接字符 ...
- 6.使用Feign实现声明式REST调用
使用Feign实现声明式REST调用 6.1. Feign简介 Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单. Feign提供了H ...
- Spring Cloud Feign声明式服务调用(转载)+遇到的问题
转载:原文 总结: 1.pom添加依赖 2.application中填写正确的eureka配置 3.启动项中增加注解 @EnableFeignClients 4.填写正确的调用接口 通过原文使用Fei ...
- 声明式服务调用:Spring Cloud Feign
最近在学习Spring Cloud的知识,现将声明式服务调用:Spring Cloud Feign 的相关知识笔记整理如下.[采用 oneNote格式排版]
随机推荐
- 「TcaplusDB知识库」概念(表、键、记录、索引)
TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差异.本文将详细介绍TcaplusDB表.记录.索引这三个数据库中常用术语在TcaplusDB中的概念与意义. 术语\概念 ...
- vue:表格中多选框的处理
效果如下: template中代码如下: <el-table v-loading="listLoading" :data="list" element-l ...
- PAT-1043(Is It a Binary Search Tree)JAVA实现
Is It a Binary Search Tree PAT-1043 主要涉及到根据前序遍历序列片段是否是一颗二叉树,这里有一个小tip就是插入序列就是二叉树的前序遍历序列. 第二个是会对排序二叉树 ...
- CentOS7 安装 MySQL Cluster 7.6.7
引用自:http://lemonlone.com/posts/mysql-ndb-cluster-install/ 仅做备份和配置文件更改 1.先在VMware中安装 CentOS-7-x86_64- ...
- Flask-SQLAlchemy使用
Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展. 官方文档:https://flask-sqlalchemy.palletsprojects.c ...
- JAVA中枚举Enum详解
1.关键字:enum.枚举可以定义成单独的文件,也可以定义在其他类内部. 枚举在类内部的示例: public class EnumInner { public static void main(Str ...
- 关于ORACLE数据库跨库调用序列的解决办法
问题 ORACLE 数据库 用户1 xscg 有序列 seq_S_ATTACHMENT_INFO.nextval 我要在 用户2 xsds 里面调用 ...
- VSCode 微信小程序扩展开发
写在前面 为什么要开发这个扩展呢,是因为微信开发者工具自身不支持页面引入组件的跳转,人工根据引入组件路径查看对应代码的方式,效率偏低.就形如这样的json文件,引入了多个组件,比如要查看 " ...
- java 集合 的理解
1.对象的存储:①数组(基本数据类型 & 引用数据类型) ②集合(引用数据类型) >数组存储数据的弊端:长度一旦初始化以后,就不可变:真正给数组元素赋值的个数没有现成的方法可用. 2.集 ...
- rman全备脚本
cat rman_back.sh #!/bin/bash source /home/oracle/.bash_profile rman log=/u01/backup/backupall_rman ...