本篇文章为大家展示了Spring MVC中怎么使用Feign调用声明式服务,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
对系统使用方,通过设计声明式的接口,开发者无需关心底层实现,而更多的关注上层业务
对系统实现方,通过声明式的接口,上层使用者接口相对稳定前提下,系统可以不断的迭代优化
对整个系统而言,能够更系统的收集更多信息,能够依据策略进行系统行为优化,提升系统效率
使用Feign,只需要声明一个接口即可,不需要关心传参、发送请求、获取响应内容、关闭连接等细节,Feign全部帮我们做好了。
SpringCloud集成了Feign组件,使得SpringCloud服务间调用变得更简单,方便
这里并不是SpringCloud的项目,那如何引入Feign到普通的SpringMVC项目中呢?
<!-- 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>
这里使用YesAPI作为第三方服务调用测试
这里以全国大学接口为例:
可以根据大学名称、学校类型、所在省份、所在城市等搜索大学
请求(查找全部师范大学): 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" }
可以看到小白开放平台是有统一返回体的,我们可以封装起来,也可以直接用Object或者Map来接收数据.我选择数据封装.
YesResponse.java
@Data public class YesResponse<T> { private Integer ret; private String msg; private T data; }
YesUniversity.java
@Data public class YesUniversity { private String err_code; private String err_msg; private List<School> schools; }
School.java
@Data public class School { private String school_name; private String school_province; private String school_level; private String school_website; private String school_city; }
既然是声明式服务调用,必须先声明再调用,结果已经声明了,接下来就是声明参数了,我依然选择数据封装;
可以从上面的请求示例看到,需要3个参数.
YesVo.java
@Data public class YesVo { private String school_name; private String app_key; private String sign; }
参数和结果都已经封装好了,接下来就是声明服务接口了
一般是根据对方的uri命名接口
Yes.java
public interface Yes { @RequestLine("POST /?s=App.Common_University.Search") YesResponse<YesUniversity> appCommonUniversitySearch(@QueryMap YesVo vo); }
如上,一个服务接口已经声明好了,因为这里使用的是post请求,@QueryMap可以把对象转为body体的参数,@RequestLine可以声明其服务路径
通过service层的封装,可以把一些业务逻辑写在里面
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接口
@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);
上述内容就是Spring MVC中怎么使用Feign调用声明式服务,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。