前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring MVC项目使用Feign声明式服务调用

Spring MVC项目使用Feign声明式服务调用

作者头像
suveng
发布于 2019-09-17 02:24:43
发布于 2019-09-17 02:24:43
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

  • Spring MVC项目使用Feign声明式服务调用
    • 什么是声明式服务调用?
    • 为什么要使用声明式服务调用?
    • Feign声明式web客户端
    • SpringMVC集成Feign客户端
      • 1.引入maven依赖
      • 2. 创建接口,声明接口方法
        • 1.封装返回实体
        • 2.声明参数
        • 3.声明接口
        • 4.服务接口调用
      • 3.更多的用法

Spring MVC项目使用Feign声明式服务调用

什么是声明式服务调用?

拆分成 声明式 服务调用

什么声明式?

可以从编程范式入手了解:

编程范式:

  • 命令式编程(Imperative Programming)
  • 声明式编程(Declarative Programming)
  • 函数式编程(Funational Programming)
  • 面向对象编程(Object-oriented Programming)

声明式编程范式:声明式编程表明想要实现什么目的,应该做什么,但是不指定具体怎么做。

注: 非官方解释

声明式服务调用: 声明调用的URL地址,请求方式,和返回结果,但具体如何调用交给底层实现.

为什么要使用声明式服务调用?

  1. 对系统使用方,通过设计声明式的接口,开发者无需关心底层实现,而更多的关注上层业务
  2. 对系统实现方,通过声明式的接口,上层使用者接口相对稳定前提下,系统可以不断的迭代优化
  3. 对整个系统而言,能够更系统的收集更多信息,能够依据策略进行系统行为优化,提升系统效率

Feign声明式web客户端

使用Feign,只需要声明一个接口即可,不需要关心传参、发送请求、获取响应内容、关闭连接等细节,Feign全部帮我们做好了。

SpringCloud集成了Feign组件,使得SpringCloud服务间调用变得更简单,方便

这里并不是SpringCloud的项目,那如何引入Feign到普通的SpringMVC项目中呢?

SpringMVC集成Feign客户端

1.引入maven依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-core -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-core</artifactId>
    <version>10.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-gson -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-gson</artifactId>
    <version>10.2.0</version>
</dependency>

2. 创建接口,声明接口方法

这里使用YesAPI作为第三方服务调用测试

这里以全国大学接口为例:

可以根据大学名称、学校类型、所在省份、所在城市等搜索大学

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
请求(查找全部师范大学):
http://api.yesapi.cn/?s=App.Common_University.Search&school_name=师范&app_key={你的app_key}&sign={动态签名}

返回:
{
    "ret": 200,
    "data": {
        "err_code": 0,
        "err_msg": "",
        "schools": [
            {
                "school_name": "北京师范大学",
                "school_province": "北京",
                "school_level": "本科",
                "school_website": "http://www.bnu.edu.cn/",
                "school_city": "北京市"
            }...
        ]
    },
    "msg": "当前请求接口:App.Common_University.Search"
}
1.封装返回实体

可以看到小白开放平台是有统一返回体的,我们可以封装起来,也可以直接用Object或者Map来接收数据.我选择数据封装.

YesResponse.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class YesResponse<T> {
    private Integer ret;
    private String msg;
    private T data;
}

YesUniversity.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class YesUniversity {
    private String err_code;
    private String err_msg;
    private List<School> schools;
}

School.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class School {
    private String school_name;
    private String school_province;
    private String school_level;
    private String school_website;
    private String school_city;
}
2.声明参数

既然是声明式服务调用,必须先声明再调用,结果已经声明了,接下来就是声明参数了,我依然选择数据封装;

可以从上面的请求示例看到,需要3个参数.

YesVo.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
public class YesVo {
    private String school_name;
    private String app_key;
    private String sign;
}
3.声明接口

参数和结果都已经封装好了,接下来就是声明服务接口了

一般是根据对方的uri命名接口

Yes.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Yes {
    @RequestLine("POST /?s=App.Common_University.Search")
    YesResponse<YesUniversity> appCommonUniversitySearch(@QueryMap YesVo vo);
}

如上,一个服务接口已经声明好了,因为这里使用的是post请求,@QueryMap可以把对象转为body体的参数,@RequestLine可以声明其服务路径

4.服务接口调用

通过service层的封装,可以把一些业务逻辑写在里面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class YesService {
    public YesResponse<YesUniversity> appCommonUniversitySearch(){
        Yes yes=Feign.builder().decoder(new GsonDecoder()).target(Yes.class,"http://api.yesapi.cn");
        YesVo yesVo=new YesVo();
        yesVo.setSchool_name("师范");
        yesVo.setApp_key("你的app_key");
        yesVo.setSign("你的sign");
        return yes.appCommonUniversitySearch(yesVo);
    }

    public static void main(String[] args) {
        YesService yesService = new YesService();
        YesResponse<YesUniversity> yesUniversityYesResponse = yesService.appCommonUniversitySearch();
        System.out.println(JSON.toJSONString(yesUniversityYesResponse));
    }
}

那出现400,500这些异常怎么办?

Feign组件考虑到了,Feign封装了一个Exception叫FeignException

结构如下图:这样我们可以通过这个FeignException的内置API达到我们对接服务的效果.

如果是同一个平台的服务,可以直接在对应的接口上增加接口方法:比如Yes接口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestLine("GET ?service={service}&app_key={appKey}&sign={sign}")Result<JokeInfo<String>> res(@Param("service") String service,@Param("appKey") String appKey, @Param("sign") String sign);

如上的GET请求的写法,也是可以支持的.

3.更多的用法

使用Feign还有更多的用法,可以参考其官方的用法,传送门

vice") String service,@Param(“appKey”) String appKey, @Param(“sign”) String sign);

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
**如上的GET请求的写法,也是可以支持的.**

### 3.更多的用法

使用Feign还有更多的用法,可以参考其官方的用法,[传送门](https://github.com/OpenFeign/feign)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js替换html中的字符串,js怎么替换字符串?
在js中,可以使用str.replace()方法来替换字符串。replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串;然后返回一个新的字符串。
全栈程序员站长
2022/08/30
23.9K0
js替换html中的字符串,js怎么替换字符串?
正则表达式入门
前端往往有大量的表单数据校验的工作,采用正则表达式会使得数据校验的工作量大大减轻,如邮箱验证,手机号码,等等。比起用字符串的函数来判断简单,易用。
Daotin
2020/09/16
9060
正则表达式学习笔记
正则表达式 1. 使用正则 创建正则表达式有两种方式,一种是以字面量方式创建,另一种是使用RegExp构造函数来创建。 var expression = / pattern / flags; var expression = new RegExp( pattern / flags ); var expression = new RegExp( patternStr, flags ); // example var regexp = /regexp/g; var regexp = new RegExp('r
糊糊糊糊糊了
2018/05/09
1.4K0
JavaScript正则表达式
正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式,是用于匹配字符串中字符组合的模式。
Leophen
2019/08/23
8410
JS正则表达式完整版
无意中从网上查找到一篇关于正则表达式的好文章,就进行了分享给大家,希望对大家有帮助。
全栈程序员站长
2022/09/17
3.1K0
JS正则表达式完整版
JavaScript正则表达式
正则表达式是一个拆分字符串并查询相关信息的过程。 正则表达式通常被称为一个模式(pattern),是一个用简单方式描述或者匹配一系列符合某个语法规则的字符串。
奋飛
2019/08/15
9620
第三章 正则表达式括号的作用
第三章 正则表达式括号的作用 不管哪门语言中都有括号。正则表达式也是一门语言,而括号的存在使这门语言更为强大。 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准。 括号的作用,其实三言两语就能说明白,括号提供了分组,便于我们引用它。 引用某个分组,会有两种情形:在JavaScript里引用它,在正则表达式里引用它。 本章内容虽相对简单,但我也要写长点。 内容包括: 分组和分支结构 捕获分组 反向引用 非捕获分组 相关案例 1. 分组和分支结构 这二者是括号最直觉的作用,也是最原始的功能。 1.
程序猿DD
2018/02/01
1.7K0
第三章 正则表达式括号的作用
小程序wxs中的时间格式化以及格式化时间和date时间互转
WXS(WeiXin Script)是小程序的一套脚本语言,wxs 与 javascript 是不同的语言,有自己的语法,并不和 javascript 一致。其中包括了很多日常使用的javascript函数,在wxs中都是不能同样使用的。最近在做一个列表的时候,涉及到时间格式化操作。就遇到了这个问题,以前写好了的格式化工具函数直接拷贝到小程序项目的wxs文件中,函数不能正常执行。其中包括了下面的几个错误
fastmock
2022/07/13
5K1
正则表达式
一、概述 正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,有点像字符串的模板,常常用作按照“给定模式”匹配文本的工具。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 JavaScript通过内置对象RegExp支持正则表达式,有两种方式创建正则表达式对象。例如,如果我们想匹配字符串中所有"at"的实例,可以这么写: 第一种:使用字面量,以斜杠表示开始和结束。 var
小胖
2018/06/27
5560
就因为这三个知识点,我彻底学废了”正则表达式“
这些题时常出现在面试中,日常业务也少不了它的身影。搞懂位置,不仅能搞定面试,业务你也将写的飞起
前端胖头鱼
2022/07/24
2K0
就因为这三个知识点,我彻底学废了”正则表达式“
javascript正则表达式 教程_js正则表达式匹配字符串
其实我写这篇文章的话,主要是想自己重新复习一遍正则表达式。我们也知道正则表达式在很多语言中都是通用的,所以学好这个好处很多。接下来,就跟我一起来学习一下正则表达式,从0到入门吧。
全栈程序员站长
2022/11/06
3.4K0
微信小程序避坑指南
 详见官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/client-lib/client.html
smy
2018/11/28
3.3K0
微信小程序避坑指南
RegExp对象
正则表达式描述了字符的模式对象。 当您检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式。 简单的模式可以是一个单独的字符。 更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。 您可以规定字符串中的检索位置,以及要检索的字符类型,等等。
天天_哥
2018/09/29
1.5K0
javascript正则表达式与字符串
说到js正则表达式,js的字符串就是一个绕不开的话题 字符串是正则表达的是一种实践 字符串String支持一些支持正则表达式的方法,昨天提到的replace就是其中之一 它们分别是:
陌上寒
2019/04/02
1K0
javascript正则表达式与字符串
js正则表达式语法大全_JavaScript正则
​ 返回一个数组 [匹配内容,index:匹配的起始位置,input:要匹配的字符串, group:undefined]
全栈程序员站长
2022/11/08
3.6K0
TypeScript 字符串(String)如何使用?
TypeScript 是一种在 JavaScript 基础上构建的编程语言,它为 JavaScript 提供了静态类型检查和更强大的面向对象编程能力。字符串是任何编程语言中不可或缺的基本数据类型之一,而在 TypeScript 中,字符串具有许多强大的特性和功能。本文将详细介绍 TypeScript 字符串的各种特性、用法和最佳实践。
网络技术联盟站
2023/07/06
9840
大厂面试与工作中常见的正则表达式题目
1.采用字面量的写法新建的正则表达式对象在代码编译时就会生成,是平常开发中常用的方式;
前端迷
2019/12/05
1.9K0
大厂面试与工作中常见的正则表达式题目
js 怎么使用正则表达式-JavaScript 正则表达式
  i:ignore case 忽略大小写,默认大小写敏感:ignore case 忽略大小写,默认大小写敏感
宜轩
2022/12/29
2.9K0
正则表达式大全
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" * 匹配前面元字符0次或多次,/b
Hongten
2018/09/18
4.6K0
JavaScript 正则表达式入门教程
正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串 主要分三个部分:基本语法、RegExp对象的方法、JS中支持正则表达式的String对象方法 一、基本语法 在JS中,正则表达式为对象,用如下两种方式定义: 直接量法: /pattern/attributes;创建RegExp对象法:new RegExp(pattern,attributes); var reg=/hi/i;//字面量 var reg=new RegExp('hi','i');//构造函数(参数1:最简单的正则匹配字母hi;参数2:
小古哥
2018/03/08
1.3K0
相关推荐
js替换html中的字符串,js怎么替换字符串?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档