http方法_像本地方法一样调用http服务,feign框架springboot项目实践
原创不易,请多多支持!对Java技术感兴趣的童鞋请关注我,后续技术分享更精彩。
概述
微服务在如今后台系统建设上大行其道,各子服务间接口交互方式,http请求协议又是首选。而相比远程方法调用的rmi接口形式,http服务对接口消费方会产生更大的接入成本。有没有两全其美,合二为一的方案?服务交互既满足通用的http协议,又能减少服务消费方的接入成本。
答案揭晓,netflix公司开源的feign框架即为该问题的完美解决方案。本文将带领大家,通过使用feign框架,在springboot项目中,实现和远程方法调用一样的本地方法调用效果。
环境
- spring-boot 2.1.0.RELEASE
- spring-cloud Greenwich.SR2
feign框架是基于springcloud发布的,所以项目中请添加和springboot匹配的springcloud包。注意spring-boot 最好不低于2.1.0.RELEASE版本,因为低版本依赖的feign某些功能缺失,将损失服务client jar包发布时接口构建灵活性。
依赖
项目中添加相关依赖
springboot依赖
springcloud依赖
openfeign依赖
项目结构
risk-control-app:服务提供方项目模块。
risk-control-app-client:服务提供方对外开放的client接口模块。
risk-control-app-consume:服务消费方模块。
接口服务定义
由于服务接口是对外开放的,并以client jar文件方式集成到使用端。
在risk-control-app-client模块中定义,UserResource和ProdResource两个服务。
在ProdResource接口定义服务接口。
@FeignClient是feign框架提供的注解。通过该注解定义的接口,在服务调用时框架会自动转换为http请求,调用远程对应服务。
name属性:为feign客户端唯一标示,若微服务接入了注册中心,name对应服务注册名。
contextId属性:服务上下文标示,有时对外开放服务可能是多个接口,不同接口可以通过该属性加以区分。比如ProdResource和UserResource不同的资源。
注意feign老版本是没有contextId属性的,这意味着老版本的feign框架,服务提供方对外的接口输出文件只能有一个,因为FeignClient注解对应的name不能重复,没有contextId区分,FeignClient实例将无法初始化。
url属性:定义FeignClient访问的接口服务地址。主要用于微服务未接入注册中心的场景。若以接入注册中心,该属性可以不定义。
细心的朋友可能发现了,demo中name和url的赋值,使用了spring属性注入的方式,而不是直接写死。这样有一个好处,不同环境的FeignClient引用时,只需集成端配置文件修改相关值,无需服务提供方重新编译打包,提高配置的灵活性。
UserResource方式和ProdResource类似,不再累述。
接口服务实现
接口服务实现在risk-control-app模块中。引入risk-control-app-client依赖。并添加ProdController和UserController实现。结构如下:
接口实现如下:
接口服务消费方
risk-control-app-consume模块作为服务消费方,在项目中添加risk-control-app-client依赖,即可像调用本地方法样调用远程http服务。
application.yml配置文件中添加远程服务设置。在服务启动时能动态注入@FeignClient实例的name和url值。
入口Application类中添加EnableFeignClients注解,启用Feign。basePackages值为Feign client扫描的包路径。
业务实现类中直接添加服务资源组件属性,在方法逻辑中即可像直接调用本地方法一样,调用远程的http服务。
到此所有demo完成,是不是感觉so easy,http服务调用瞬间简单了起来。
总结
本文介绍了Feigin框架在springboot项目中的使用。通过实例讲解了,如何将http对外服务以rmi方式提供给消费端使用。定义主要步骤如下:
- 接口分模块构建,便于对外提供client jar文件分发。接口通过@FeignClient注解标注。
- 基于接口实现服务端逻辑。
- 消费端通过接口的client jar依赖,使用具体接口服务方法。
http方法_像本地方法一样调用http服务,feign框架springboot项目实践相关推荐
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...
- 本地方法接口和本地方法栈
本地方法接口 什么是本地方法? 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C. ...
- JVM---本地方法接口和本地方法栈
本地方法接口 什么是本地方法? 简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗.一个 Native Method 是这样一个 Java 方法:该方法的实现由 ...
- Java虚拟机(七)——本地方法接口与本地方法栈
文章目录 本地方法接口 什么是本地方法? 为什么要使用本地方法? 本地方法栈 本地方法接口 什么是本地方法? 一个Native Method(本地方法)就是一个Java调用非Java代码的接口,,该方 ...
- JVM之本地方法接口和本地方法栈
本地方法接口和本地方法栈 1.什么是本地方法? 简单地讲,一个Native Method是一个Java调用非Java代码的接囗.一个Native Method是这样一个Java方法:该方法的实现由非J ...
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)
作者|mghio 编辑|包包 前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...
- 设计模式 工厂方法_使用工厂方法模式设计最佳实践
设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...
- mockito mock void方法_一文让你快速上手 Mockito 单元测试框架
前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...
- python字符串equals方法_编写equals方法
我们知道List是一种有序链表:List内部按照放入元素的先后顺序存放,并且每个元素都可以通过索引确定自己的位置. List还提供了boolean contains(Object o)方法来判断Lis ...
最新文章
- phpMyAdmin FTP iptables Selinux
- 静脉识别实现初步发展 多模态或成未来趋势
- Xilinx 推出 reVISION,继续拓展机器学习市场
- APL开发日志--2012-11-08
- mysql从青铜到王者_青铜到王者,快速提升你MySQL数据库的段位!
- Leetcode--287. 寻找重复数(Java)
- 《iOS 6核心开发手册(第4版)》——2.11节秘诀:构建星星滑块
- 关爱程序员,从产品经理做起!
- mex 里面调用matlab函数
- Spring 事务模型
- 牛b硬件信息修改大师_太好玩了!Github 上的这个库也能帮你逛 B站!
- Mybatis使用order by语句
- 菜菜的刷题日记 | 215. 数组中的第K个最大元素
- linux编译poco静态库,Xcode 编译poco c++静态库
- 使用python替换word文档部分内容
- stm32通过ESP8266连接互联网服务器,手机通过网页实现远程控制灯亮灭
- 如何为YouTube启用暗模式
- 什么蓝牙耳机的延迟最低?2022延迟最低的蓝牙耳机推荐
- 观复嘟嘟:职场是个技术活-马未都
- 我的勇者服务器维护3月5日,《我的勇者》高能国漫联动开启!
热门文章
- mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI
- java概述与基础知识
- 云为 | 提供海外 IT 人才派遣、猎头、人力资源外包服务
- Qt编程之QTreeWidget使用方法
- C++ 的关键字(保留字)完整介绍
- C#编程语言之常见的异常类型
- 阿里云学生计划领取攻略
- 关于数据集 使用PutCollect后m_Recordset-Update();数据集更新报错的问题
- tensorflow安装教程
- rpm卸载mysql和php_CentOS 6.5 卸载mysql和php