springcloud 入门系列(七)-Feign(声明式服务调用)

SpringCloud系列之声明式服务调用Netflix Feign 在上一章的学习中,我们知道了微服务的基本概念,知道怎么基于Ribbon+restTemplate的方式实现服务调用,接着上篇博客,我们学习怎么基于Feign实现服务调用,请先学习上篇博客,然后再学习本篇博客 Feign是一个声明式的web service客户端,它使得编写web service客户端更为容易。创建接口,为接口添加注解,即可使用Feign。Feign可以使用Feign注解或者JAX-RS注解,还支持热插拔的编码器和解码器。 环境准备: JDK 1.8 SpringBoot2.2.1 Spri 阅读详情

​

前面我们学习了eureka 服务的搭建,以及ribbon,hystrx,分布式开发中很重要的两个功能组件,负载均衡和服务熔断机制来对我们的微服务进行保护。

前面我们在进行eureka 服务进行调用时都是采用RestTemplate 进行封装http服务调用,形成了一套模板的调用方法,实际应用当中,某个我服务提供的服务接口会被我们在多处调用,这时候我们往往会自己封装服务的调用客户端。而springcloud 也为我们提供了这样的服务客户端封装组件-Fegin,

他提供了声明式服务的调用。

下面我们开始动手实践;

新建使用Feign 声明式服务调用的客户端,以后代码只贴出核心相关代码,否则会导致文章篇幅太长,文章被代码所充斥。

pom:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.3.RELEASE</version>
        </dependency>

声明服务:

@FeignClient("HELLOSERVICE")public interface HelloService {​    @GetMapping("hello")    String hello(@RequestParam String name);​}

@FeignClient("HELLOSERVICE")这里 声明了 helloService 服务,注解中的参数名称就是eureka中注册的服务名称,注意这里服务名不区分大小写,建议直接从eureka服务注册中心拷贝。然后我们使用了springmvc 自带的注解@GetMapping进行需要调用的方法声明。

 

controller:

@RestControllerpublic class Controller {​​    @Autowired    private HelloService helloService;​    @GetMapping("feign-hello")    private String test(@RequestParam String name){        return  helloService.hello(name);    }​}

springboot 引导类:

@FeignClient("HELLOSERVICE")
public interface HelloService {

    @GetMapping("hello")
    String hello(@RequestParam String name);

}

@EnableFeignClients 开启feigin声明式服务。

下面我们启动服务,并在浏览器输入:http://localhost:8088/feign-hello?name=alibb

查看输出:

https://mmbiz.qpic.cn/mmbiz_png/StSSauj2rMpUS1b5V8LMILiaicGcT4aeKhmRrpc8Fmqv6nUAIWWDlDibKKrOu2aMQia2B70LIXBesc51Foic400zHQQ/640?wx_fmt=png

我们看到了服务器返回了预期的响应。

不过这里有个小坑点,这里做小说明,我们在进行url传值时,我们的服务提供者和Feign 声明的接口中都必须加@RequestParam注解,否则会爆出405错误。但是我们知道 springmvc 中url传值,不是必须制定@RequestParam注解的,框架自动能够匹配参数。笔者不知道是Feign 作者故意为之还是有其他的考量。

下面我们来介绍下Fegin 的继承特性,我们发现Feign 的客户端代码几乎可以直接从服务实现中复制过来,是否可以进一步进行抽象呢,springcloud Feign 针对此项问题进行了抽象。为了复用接口和 DTO ,我们新建一个helloApi 工程:

pom:

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

请求接口定义:

@RequestMapping("refact")
public interface HelloServiceApi {


    @RequestMapping("/hello1")
    String hello1(@RequestParam String name);

    @PostMapping("/hello2")
    String hello2(@RequestBody User user);

}

DTO定义:

@Data
public class User {
    private String name;
    private Integer age;
}

我们看到这个就是一个请求api 的定义,没有任何特殊之处,下面我们进行服务提供者的修改:

首先引入api的pom依赖:

      

<dependency>
            <groupId>com.ethan.springclod.api</groupId>
            <artifactId>api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

新建一个Controller 并实现上述接口:

@RestController
@Slf4j
public class HelloFeignController implements HelloServiceApi {
    @Override
    public String hello1(String name) {
        log.info("feign hello1:{}" ,name);
        return "hello world " + name;
    }

    @Override
    public String hello2(User user) {
        log.info("feign hello2:{}" ,user);
        return user.toString();
    }
}

然后启动服务。

在服务调用端我们也作出调整,在pom中同样添加helloservice 的api 依赖,然后创建RefactHelloService:

@FeignClient("HELLOSERVICE")
public interface RefactHelloService extends HelloServiceApi {

}

controller 调整:

   

    @Autowired
    private RefactHelloService helloServiceApi;

    @GetMapping("feign-hello")
    private String test(@RequestParam String name){
        return  helloServiceApi.hello1(name);
    }


    @GetMapping("feign-hello3")
    private String test3(){
        User user = new User();
        user.setName("ethan");
        user.setAge(28);
        return  helloServiceApi.hello2(user);
    }

然后我们启动服务发送请求测试:http://localhost:8088/feign-hello3

https://mmbiz.qpic.cn/mmbiz_png/StSSauj2rMpUS1b5V8LMILiaicGcT4aeKhMgSHUz5xf7zKUP2XUqJlBSibFiaibzHfo6K3DDMCWgzpr7XnpZicic8icRDQ/640?wx_fmt=png

https://mmbiz.qpic.cn/mmbiz_png/StSSauj2rMpUS1b5V8LMILiaicGcT4aeKhPfZKXibh5tMyAMd4YYpDLeZ4FCRvjKIZ7P8hVsIchGB5W3MJ7e80agA/640?wx_fmt=png

看到对应的返回和控制台输出,一切正常。

由此,我们可以通过对外封装api,给调用者调用,可以提高我们的开发效率。

 

本篇关于Feign 介绍到此结束,如有不对之处,欢迎指正!

https://mmbiz.qpic.cn/mmbiz_png/StSSauj2rMpmIK8ar9mNGKzwz57xsibVBmibra1bmQZnicgx5v5fyofianUWWibP2mwT3Yy2E0VkOEMaEFPILHaVHIA/640?wx_fmt=png

 

 

【SpringCloud】服务调用Feign是什么呢,又该如何用呢? 一、Feign的概念 Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可以帮助我们更加便捷、优雅地调用HTTP API。 二、Feign的作用 Feign可以把Rest的请求进行隐藏,伪装成类似SpringMVC的Controller一样。你不用再自己拼接url,拼接参数等等操作,一切都交给Feign去做。 例如之前拼接URL的形式: 使用feign,不用这中拼接url... 阅读详情

相关推荐

springcloud使用feign进行远程服务调用

声明式服务调用SpringCloud Feign Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用,和ribbon都属于springcloud生态内客户端调用组件,与ribbon使用起来稍有差异,下面通过一个简单的demo演示一下feign的使用 1、添加pom依赖 <parent> <groupId>org.spring...

congge 3766

SpringBoot引入OpenFeign,不使用注册中心

【前言】 最近接到一个功能需求,需要对接对第三方平台的api,在设计整个系统架构的时候,想将现在的单体项目拆分成微服务,*****************,单独引入OpenFeign组件简化服务通信方式,也为了更好的支持后续向微服务的转变! 很多人以为OpenFeign必须依赖于注册中心,其实不然,接下来演示跳过注册中心,完成服务器间的通信 项目目录结构 feign-demo:root目录 api:api层,供消费者使用 consumer:服务消费者 provider:服务生产者 相关代码 api @Fe

wind_chasing_boy的博客 1万+

在昇腾910B服务上部署搭建适配PDF解析工具Mineru2.5开源项目

本文介绍了在昇腾910B服务器上部署开源PDF解析工具Mineru2.5的过程。首先从昇腾社区下载mindie镜像并运行容器,安装系统依赖。针对部署过程中遇到的多个报错问题(如torchvision与torch版本不匹配、昇腾软件栈与NumPy 2.0不兼容等),提供了具体解决方案和兼容版本。通过设置环境变量、安装指定版本的Python依赖包,成功部署Mineru项目并下载模型。最后运行测试,验证了在NPU设备上运行pipeline的可行性。整个过程详细记录了版本适配和错误处理方法,为类似部署场景提供了参考

一起加油吧 2163

Spring cloud多模块开发下Feign的使用,以及@FeignClient注入bean找不到异常解决

一、关于Feign 在微服务架构开发是,我们常常会在一个项目中调用其他服务,其实使用Spring Cloud Rbbon就能实现这个需求,利用RestTemplate 的请求拦截来实现对依赖服务的接口调用, 但是实际项目中对服务依赖的调用可能不止于 一 处,往往 一 个接口会被多处调用,所以我们通常都会针对各个微服务自行封装 一 些客户端类来包装这些依赖服务的调用。 这个时候我们会发现,由于 R...

Yore - Home 14万+

三维点云孔洞修复(附Python代码和公共点云数据集链接)

(1)物体自身缺失(2)物体自身形状复杂,很多凹凸面不够规则甚至存在空腔,空腔内部无法被三维激光扫描仪扫描到(3)物体部分区域对激光扫描不敏感,未被扫描上(4)扫描仪的扫描稳定性。

yanghl1215的博客 6948

Elsevier投稿避坑指南:Ocean Engineering论文格式要求详解(附Checklist模板)

本文详细解析Elsevier旗下期刊Ocean Engineering的投稿格式要求与常见陷阱,提供实用的Checklist模板。涵盖文章类型确认、作者贡献声明、图表规范、数据声明等关键环节,帮助研究者高效通过格式审查。特别强调LaTeX排版细节、图表分辨率要求及现代伦理声明规范,助力海洋工程领域学者顺利投稿。

weixin_33734785的博客 1478

SpringBoot集成Seata分布式事务OpenFeign远程调用

SpringBoot集成Seata分布式事务OpenFeign远程调用

Meta39的博客 1188

给硬件工程师的UCIe软件配置入门:从寄存器表到实战调试,一篇讲透

本文为硬件工程师提供UCIe软件配置的全面指南,从寄存器表解析到实战调试技巧,涵盖链路训练、错误排查等关键环节。通过详细代码示例和分层诊断法,帮助工程师快速掌握UCIe寄存器访问机制,提升异构集成开发效率。

weixin_30268921的博客 312

SpringCloud之Seata

Seata组件是Spring Cloud Alibaba提供的处理分布式事务的组件。那何为分布式事务呢?在微服务环境下,假设有3个服务,A、B、C服务,A的某个方法,方法逻辑是通过OpenFeign调用B服务的方法,再通过OpenFeign调用C服务的方法,最后再执行自身的业务逻辑,对数据库执行操作。那如果在对数据库执行操作时出现异常,此时要进行回滚,即调用B服务的方法和调用C服务的方法中,对数据库的操作,要进行回滚。如果没有分布式事务的介入,B、C服务对数据库的操作是无法回滚的。

gs2436的博客 1228

RK3588 C++ MeloTTS 推理

本文介绍了基于RK3588平台和RKNN工具链实现的端侧语音合成(TTS)系统。该系统支持中英文混合输入处理,通过自动合并英文单词、转换标点符号等方式预处理文本,并将其转换为音素和声调序列。核心推理流程包含编码器、中间处理和解码器三个阶段:编码器将音素序列转为隐藏状态,中间处理调节音调和语速,解码器生成最终波形。代码示例展示了输入数据设置和模型推理过程,利用RK3588内置NPU实现高效语音合成。该系统展现了在边缘计算设备上实现复杂AI任务的能力。

J。 199

遥感影像建筑物变化检测

遥感影像建筑物变化检测

yilvyangguang520的博客 423

nacos+seata+openfeign实现调用远程服务接口时,依赖注入失败

新版本 (2020+):Spring Cloud 移除了 Ribbon,改用 Spring Cloud LoadBalancer 依赖变为 spring-cloud-starter-loadbalancer(或 spring-cloud-loadbalancer, 此时 @LoadBalanced 的底层实现是 Spring Cloud LoadBalancer。所以调用远程服务无法实现负载均衡=>无法调用远程接口,就间接导致,无法注入远程接口对应的Feign客户端对象。

2301_80934770的博客 952

流媒体之LL-HLS 低延时HLS协议

LL-HLS协议通过扩展了HLS协议,为实时直播场景提供了更丰富的功能,如延迟控制、播放列表增量更新、阻止播放列表重新加载等。同时客户端可以更灵活地控制播放列表的加载和播放,以适应各种场景和需求。LL-HLS在直播中的延时可以控制在3s内, 但是即使这样, 还是不如RTMP, RTSP等协议的实时性。

技术控的笔记 3364

【微服务架构】SpringCloud(四):声明式服务调用 Feign

接上面例子,此例子和上面例子实现的功能一样。记得两者取一个即可。说明用属性而不是用属性中的configuration。定义拦截器@Override} } 配置文件feign:client:config:再次访问,测试Ok。扩展feign:client:config:通用配置feign:client:config:default:属性配置比Java代码优先级高。也可通过配置设置java代码优先级高。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

11、机器学习中的聚类与隐马尔可夫模型

本文介绍了机器学习中的两种重要方法:聚类算法和隐马尔可夫模型(HMM)。聚类作为无监督学习的代表,适用于发现无标签数据中的结构,常见算法包括K-均值和自组织映射(SOM),并在传感器数据分析等场景中展现应用价值。隐马尔可夫模型则是一种可解释的序列模型,用于从观测数据中推断隐藏状态,广泛应用于语音识别、自然语言处理和生物信息学等领域。文章详细讲解了HMM的核心概念如马尔可夫性质、转移与发射概率,并通过TensorFlow实现了前向算法,展示了其计算观测序列概率的动态规划思想。最后对比了两类方法的应用场景,展望

garlic的博客 179

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringCloud核心组件Feign声明式服务调用

在import orgimport orgGetMapping;import org在这个接口中,我们使用了注解来声明这是一个Feign客户端,name属性指定了要调用的服务名称。注解定义了HTTP GET请求的URL,用于从URL中获取参数。Feign支持多种编码器和解码器,我们可以通过实现Encoder和Decoder接口来自定义数据的序列化和反序列化方式。例如,如果我们想要使用。

kkchenjj的博客 1343

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SpringCloud Feign声明式服务调用模块

说明Feign是一个声明式REST的Web服务客户端。它使得Web服务客户端的写入更加方便。使用Feign创建一个界面并对其进行注释;具有可插拔注释支持,包括Feign注释和JAX-RS注释;支持可插拔编码器和解码器;它基于NetFlix Feign实现,整合了Ribbon和Hystrix两者在SpringCloud Feign的实现下,我们只需创建一个接口并以注解的方式配置它,即可完成对服务提供...

芸灵fly的博客 2700

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SpringCloud入门3---Feign(服务调用组件)

SpringCloud入门1---简介 SpringCloud入门2---Eureka(服务发现组件) SpringCloud入门3---Feign(服务调用组件) SpringCloud入门4---Hystrix(熔断器组件) SpringCloud入门5---Zuul(服务网关) 第三篇,我们对SpringCloud中Feign(服务发现组件)做一下简单的介绍: 1、Feign简介...

u014526891的博客 1万+

SpringCloud之声明式服务调用Feign

在前面几篇文章中,主要和大家介绍了服务的注册与消费。在介绍过程中,我们从最最原始的手动利用 DiscoveryClient 发现服务开始,手动实现负载均衡,再到最后的自动化配置。相信经过前面几篇文章的学习,大家对微服务之间的调用应该有了一个基本的认知。但是我们前面的所有服务调用都是手动写 RestTemplate 来实现的,大家可能已经发现这样写有点麻烦,每次都要写请求 Url 、配置响应数据类型...

技术无止境 3989

SpringCloud Feign 声明式服务调用

  服务调用有2种方式:rest、rpc,springcloud使用RestTemplate实现rest调用,还可以使用feign进行声明式的远程http服务调用,所谓声明式就是通过服务接口来调用,和rpc相似。   使用feign进行服务调用 feign是一种服务调用方式,自然是在消费者中使用的   1、创建时勾选Spring Cloud Routing -> OpenFeign,或者手动添加依赖 <dependency> <groupId&g

chy-x 的博客 749

SpringCloud系列-利用Feign实现声明式服务调用

点击上方“Java碎碎念”,关注公众号优质文章,第一时间送达上一篇文章《手把手带你利用Ribbon实现客户端的负载均衡》介绍了消费者通过Ribbon调用服务实现负载均衡的...

Java碎碎念 348

声明式服务调用——SpringCloud 之Feign

通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,封装了。只需要定义一个接口,并且通过注解的形式定义好请求模板,就可以项使用本地接口一样,使用。,然后才能发起请求。获得响应体后,还需解析等操作,十分繁琐。,还是使用Http工具包 Apache 的。的话,无论是使用 JDK 自带的。请求调用的轻量级框架,可以以。2、为什么使用feign。框架,那么调用服务需要走。, 都需要自行配置请求。1、feign是什么。

诗人密语 1009

【SpringCloud】Feign 声明式服务调用入门学习

1、什么是 Feign Feign 是 Spring Cloud Netflix 组件中的一个轻量级的 RESTful 的 HTTP 服务客户端,实现了负载均衡和 Rest 调用的开源框架,封装了 Ribbon 和 RestTemplate,实现了 WebService 的面向接口编程,进一步降低了项目的耦合度。 Feign 内置了 Ribbon,用来做客户端负载均衡调用服务注册中心的服务。 Feign 本身并不支持 SpringMVC 的注解,它有一套自己的注解,为了更方便的使用,SpringCloud.

AI 全栈工程师修炼中 395

声明式服务调用SpringCloud Feign

声明式服务调用SpringCloud Feign 前面使用了Ribbon做客户端负载均衡,使用Hystrix做容错保护,这两者被作为基础工具类框架被广泛地应用在各个微服务的实现中。SpringCloudFeign是将两者做了更高层次的封装以简化开发。它基于Netfix Feign实现,整合了SpringCloudRibbon和SpringCloudHystrix,除了提供这两者的强大功能外,还提供了一种声明是的Web服务客户端定义的方式。SpringCloudFeign在NetFixFeign的基础上扩展了

ZHONGZEWEI的博客 225

Spring Cloud | “声明式服务调用“ 客户端 : Feign

目录: "声明式服务调用" 客户端 ( Feign ) : 一、 Feign 简介 二、 Feign 快速入门 : 2.1 第一个 Feign 程序 : (1) 搭建 "Eureka Server" : ① 创建 Eureka Server 项目 ② 全局配置文件( .yml文件 )中添加 "Eureka" ( 服务注册中心 ) 的相关配置信息 ③ 在项目启动类 上添加 @EnableEurekaServer 注解 (2) 搭建 "Eureka Client" 作为 "服务提供者" : ......

m0_70720417的博客 809
上一篇: springcloud 入门系列(六)Hystrix-属性配置
下一篇: springloud 入门系列(八)springcloud zuul(api网关)
feijiing
博客等级 码龄16年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值