Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Cloud中如何优雅的使用Feign调用接口
JAVA 项目中接口调用怎么做 ? Httpclient Okhttp Httpurlconnection RestTemplate 上面是最常见的几种用法,我们今天要介绍的用法比上面的更简单,方便,它就是 Feign Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。 Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关
猿天地
2018/04/03
2.9K0
撸了一个 Feign 增强包
最近准备将公司的一个核心业务系统用 Java 进行重构,大半年没写 Java ,JDK 都更新到 14 了,考虑到稳定性等问题最终还是选择的 JDK11。
用户1516716
2020/09/14
5840
撸了一个 Feign 增强包
Spring Cloud OpenFeign - 声明式服务调用
在微服务架构中,服务之间的调用是常见的需求。Spring Cloud OpenFeign是一个基于Spring Cloud的开源项目,提供了一种声明式的、用于HTTP客户端的编程方式,用于实现服务之间的调用。本文将深入探讨Spring Cloud OpenFeign的原理和用法,并结合实际项目场景,介绍如何在微服务架构中使用OpenFeign进行服务调用。
王也518
2023/12/20
2790
[享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香?
代码下载地址:https://github.com/f641385712/feign-learning
YourBatman
2020/02/21
6.2K0
[享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香?
非Spring环境下的Ribbon+Feign使用宝典
Ribbon是一个负载均衡客户端,可以很好的控制http和tcp的一些行为,一般都是Ribbon搭配Feign一起使用;Feign默认集成了ribbon
白石
2019/08/23
1.3K0
SpringCloud原理之feign
前面一节我们学习了一下eureka,我们来回顾一下,首先它是一个cs架构,分为客户端和服务端,
用户9927510
2022/07/29
6430
SpringCloud原理之feign
使用Feign简化Spring Boot微服务间的调用
摘要: 在微服务架构中,服务间的通信是至关重要的。Spring Cloud提供了多种工具,其中Feign是一款声明式的Web服务客户端,能够显著简化服务调用的过程。本文将详细介绍在Spring Boot应用中如何使用Feign进行微服务之间的调用。
用户10862336
2023/11/30
6460
声明式服务调用-Feign
博主在昨天的文章中,提及到项目中选用Eureka作为服务的注册中心,那么今天就应该是开始进行服务的调用, 即认证平台调用数据服务。在之前的文章中我都是很模糊的描述过业务的过程,今天就再叙述一下,也顺便捋一捋自己的业务逻辑。
每天学Java
2020/06/02
7930
SpringCloudAlibaba入门系列(4) - 服务调用Feign和Dubbo
摘要:介绍基于Feign来实现HTTP Restful服务的简化调用和基于阿里巴巴的Dubbo组件来实现RPC远程服务调用。
兜兜转转
2023/03/08
5960
SpringCloudAlibaba入门系列(4) - 服务调用Feign和Dubbo
Spring Cloud Feign工作原理、负载均衡及使用示例
Feign 是一个开源的Java HTTP客户端框架,主要用于简化服务间的HTTP调用,特别是针对微服务架构中的服务间通信。它允许开发者采用声明式的方式来定义HTTP请求,即将HTTP请求抽象成Java接口的方法调用,从而让服务间的调用看起来像是在调用本地方法一样简洁易懂。
用户7353950
2024/04/24
1.1K0
Spring Cloud Feign工作原理、负载均衡及使用示例
微服务(七)——OpenFeign服务调用
官方文档:https://cloud.spring.io/spring-cloud-static/Hoxton.SR1/reference/htmlsingle/#spring-cloud-openfeign
不愿意做鱼的小鲸鱼
2022/09/26
4060
微服务(七)——OpenFeign服务调用
Spring Cloud 学习笔记(4) 声明式服务调用Feign
feign 在默认情况下使用 JDK 原生的 URLConnection 发送HTTP请求,也可以配置更换。
张云飞Vir
2021/05/17
4090
【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战
通过上文,我们掌握了Spring Cloud Alibaba微服务框架的初始环境搭建,并能通过Nacos注册中心的服务注册和发现,配合RestTemplate和Ribbon,实现2个服务之间通过服务名进行远程调用。 实际上,微服务之间的调用还有更简单、更方便、更强大的调用方式,那就是RPC调用!本文所讲的微服务调用组件Feign,正是RPC框架之一! 本文会循序渐进的从Feign讲到OpenFeign,并会讲到Feign核心原理和实际项目使用OpenFeign的通常做法:
天罡gg
2023/03/01
2.9K0
【Spring Cloud Alibaba】(二)微服务调用组件Feign原理+实战
Java学习笔记-微服务(3)-负载均衡及服务调用
LoadBalancer 是 Spring Cloud 官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在 Spring Cloud Connons 中用于替换之前的 Ribbon 组件。相较于 Ribbon ,LoadBalancer 支持 RestTemplate,也支持 WebClient 等。
咸鱼程序员
2025/03/04
820
Java学习笔记-微服务(3)-负载均衡及服务调用
SpringCloud声明式服务调用Feign
1.创建一个SpringBoot工程,这里命名为feign-consumer,然后在pom文件中添加依赖:
林老师带你学编程
2019/05/25
4960
java高级进阶|SpringCloud之服务调用组件Feign
Feign是一个声明式WebService客户端,使用Feign能让编写WebService客户端更加简单,它的使用方式是定义一个接口,然后在上面添加 注解,同时也支持JAX-RS标准的注解,Feign也支持可插拔式的编码器和解码器,Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters,Feign可以与Eureka和Ribbon组合使用以支持负载均衡。只需要你创建一个接口,然后在上面添加注解即可。
码农王同学
2020/07/14
5450
java高级进阶|SpringCloud之服务调用组件Feign
Java一分钟之-Spring Cloud OpenFeign:声明式服务调用
随着微服务架构的普及,服务间的调用变得越来越频繁且复杂。Spring Cloud OpenFeign作为一种声明式的服务调用方式,极大地简化了服务消费者与服务提供者之间的交互过程,提高了开发效率。本文将深入浅出地探讨OpenFeign的核心概念、常见问题、易错点及其规避策略,并通过具体代码示例加深理解。
Jimaks
2024/06/09
2930
Spring Cloud 系列之服务调用 OpenFeign
  Feign 旨在使编写 Java Http 客户端变得更容易。在使用 Ribbon + RestTemplate 时,利用 RestTemplate 对 http 请求的封装处理,形成了一套模版化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign 在 Ribbon 基础上做了进一步封装,由他来帮助我们定义和实现依赖服务接口的定义。在 Feign 的实现下,我们只需创建一个接口并使用注解的方式来配置它,即可完成对服务提供方的接口绑定,简化了使用 Spring cloud Ribbon 时,自动封装服务调用客户端的开发量。与 Ribbon 不同的是,通过 Feign 只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用   Feign 已经停止维护,OpenFeign 是 Spring Cloud 在 Feign 的基础上进一步开发出来替代 Feign 的技术,支持了 SpringMVC 的注解,如 @RequesMapping 等等。OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
Demo_Null
2020/11/11
8400
Spring Cloud 系列之服务调用 OpenFeign
OpenFeign服务调用
Feign 是一个声明式 WebService 客户端。使用 Feign 能让编写Web Service 客户端更加简单。
乐心湖
2020/07/31
6070
OpenFeign服务调用
Feign实现文件上传下载
Feign框架对于文件上传消息体格式并没有做原生支持,需要集成模块feign-form来实现。
编程随笔
2022/04/29
1.3K0
相关推荐
Spring Cloud中如何优雅的使用Feign调用接口
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档