原创不易,请多多支持!对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项目实践相关推荐

  1. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  2. 本地方法接口和本地方法栈

    本地方法接口 什么是本地方法? 一个Native Method就是一个Java调用非Java代码的接口.一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C. ...

  3. JVM---本地方法接口和本地方法栈

    本地方法接口 什么是本地方法? 简单地讲,一个 Native Method 是一个 Java 调用非 Java 代码的接囗.一个 Native Method 是这样一个 Java 方法:该方法的实现由 ...

  4. Java虚拟机(七)——本地方法接口与本地方法栈

    文章目录 本地方法接口 什么是本地方法? 为什么要使用本地方法? 本地方法栈 本地方法接口 什么是本地方法? 一个Native Method(本地方法)就是一个Java调用非Java代码的接口,,该方 ...

  5. JVM之本地方法接口和本地方法栈

    本地方法接口和本地方法栈 1.什么是本地方法? 简单地讲,一个Native Method是一个Java调用非Java代码的接囗.一个Native Method是这样一个Java方法:该方法的实现由非J ...

  6. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架(上)

    作者|mghio 编辑|包包 前言  在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改 ...

  7. 设计模式 工厂方法_使用工厂方法模式设计最佳实践

    设计模式 工厂方法 在前面的"设计模式"示例中,我们解释了当今常用的"工厂"模式. 在本节中,我们将了解具有更多抽象的更高级的解决方案. 该模式称为工厂方法设计 ...

  8. mockito mock void方法_一文让你快速上手 Mockito 单元测试框架

    前言 在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用.为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多 ...

  9. python字符串equals方法_编写equals方法

    我们知道List是一种有序链表:List内部按照放入元素的先后顺序存放,并且每个元素都可以通过索引确定自己的位置. List还提供了boolean contains(Object o)方法来判断Lis ...

最新文章

  1. phpMyAdmin FTP iptables Selinux
  2. 静脉识别实现初步发展 多模态或成未来趋势
  3. Xilinx 推出 reVISION,继续拓展机器学习市场
  4. APL开发日志--2012-11-08
  5. mysql从青铜到王者_青铜到王者,快速提升你MySQL数据库的段位!
  6. Leetcode--287. 寻找重复数(Java)
  7. 《iOS 6核心开发手册(第4版)》——2.11节秘诀:构建星星滑块
  8. 关爱程序员,从产品经理做起!
  9. mex 里面调用matlab函数
  10. Spring 事务模型
  11. 牛b硬件信息修改大师_太好玩了!Github 上的这个库也能帮你逛 B站!
  12. Mybatis使用order by语句
  13. 菜菜的刷题日记 | 215. 数组中的第K个最大元素
  14. linux编译poco静态库,Xcode 编译poco c++静态库
  15. 使用python替换word文档部分内容
  16. stm32通过ESP8266连接互联网服务器,手机通过网页实现远程控制灯亮灭
  17. 如何为YouTube启用暗模式
  18. 什么蓝牙耳机的延迟最低?2022延迟最低的蓝牙耳机推荐
  19. 观复嘟嘟:职场是个技术活-马未都
  20. 我的勇者服务器维护3月5日,《我的勇者》高能国漫联动开启!

热门文章

  1. mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI
  2. java概述与基础知识
  3. 云为 | 提供海外 IT 人才派遣、猎头、人力资源外包服务
  4. Qt编程之QTreeWidget使用方法
  5. C++ 的关键字(保留字)完整介绍
  6. C#编程语言之常见的异常类型
  7. 阿里云学生计划领取攻略
  8. 关于数据集 使用PutCollect后m_Recordset-Update();数据集更新报错的问题
  9. tensorflow安装教程
  10. rpm卸载mysql和php_CentOS 6.5 卸载mysql和php