使用OpenFeign实现接口访问

news/2024/12/22 14:08:59/

1. 引言

在微服务横行的年代,后端根据业务的不一样分成了很多单独运行的服务,比如在物联网中,根据业务拆分为定时服务、设备控制等服务。当前端想控制设备时,其请求首先到其对应的后端服务,后端服务再调用设备控制服务,才能实现业务需求。

在这里插入图片描述

图1 控制设备流程图

接下来例举一个实际的场景,后端服务如何去调用设备控制服务接口。

2. 实现的方式

2.1 HTTP请求方式

在业务层访问服务的时候,最常使用的协议就是HTTP协议,因此在访问其他服务,就可以模拟HTTP实现服务请求。http包含headerbody,因此在模拟中,就需要构造一个headerbody

在后端服务中提供了多种方法:HttpClientRestTemplete

在我之前的文章中介绍了RestTemplate的方式,大家可以参考:如何在后端去访问第三方API

2.2 OpenFeign方式

FeignSpringcloud组件中的一个轻量级RestfulHTTP服务客户端,并内置了Ribbon,可以实现客户端负载均衡。

OpenFeignSpringcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping 等。OpenFeign@FeignClient可以解析SpringMVC@RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

因此在定义接口上非常的方便,接下来进行介绍一个demo,以下的代码都需写在后端服务上。

2.2.1 在SpringBoot项目中引入注解

pom.xml文件中添加注解,这里需要注意和SpringBootSpringCloud的版本进行对应。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2.2 新建接口,定义好想要访问的RESTful

定义一个bean,控制设备的入参

public class ControlParam{// 设备idString applianceId;// 控制的命令Map command;
}

@FeignClient注解中,定义设备控制服务的地址,本demo定义为本地服务的8081端口。在client目前只有设备控制的接口,可以根据业务的需要进行扩展,比如需要设备状态查询接口。

@FeignClient(name = "example-service", url = "http://localhost:8081")
public interface ExampleClient {@PostMapping("/device/control")String control(ControlParam controlParam);
}
2.2.3 在启动类上添加注解
@SpringBootApplication
@EnableFeignClients
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
2.2.4 在后端服务中暴露接口,提供给APP使用
@RestController
public class ExampleController {@Autowiredprivate ExampleClient exampleClient;@PostMapping("/control")public String contrlExample(@RequestBody ControlParam controlParam) {return exampleClient.control(controlParam);}
}

如上,通过4个步骤就可以使用OpenFeign实现服务间的接口调用。其具体访问路径为:

  • APP访问Controller暴露的接口"/control"接口
  • contrlExample方法中通过ExampleClient去调用设备控制服务

结语

以上介绍了如何使用OpenFeign实现服务之间的调用,方式配置很简单、扩展性强。


http://www.ppmy.cn/news/51876.html

相关文章

实战之redis进行模糊查找

剧情回顾&#xff1a; 一般&#xff0c;我们都是用keys abc。但是这个会进行全局的搜索&#xff0c;会阻塞redis进程。 解决方法&#xff1a; 使用scan替代keys *。 SCAN的关键词&#xff1a;渐进式迭代。通过游标指定下一次迭代的位置&#xff0c;如果返回的游标为0&#x…

LVS+Keepalived群集

目录 一、Keepalived概述二、Keepalived服务重要功能三、VRRP通信原理四、Keepalived工具4.1 keepalived体系主要模块及作用4.2 keepalived服务的工作原理 五、keepalived脑裂及解决办法5.1 keepalived脑裂5.2 脑裂的原因5.3 解决对策 六、Keepalived的部署七、LVSKeepalived高…

java反序列化 cc链6 分析

前言 这里分析完cc1的两个以后&#xff0c;白日梦佬又介绍了cc6链&#xff0c;最主要的是这个链子不受jdk的版本影响&#xff0c;甚至不受cs版本的影响&#xff0c;这么说就是cs大部分都是可以使用cc链6&#xff0c;而且这个链子要简洁的很多&#xff0c;我一听这个好啊&#x…

Shell知识点(2)

1.转义 某些字符在 Bash 里面有特殊含义&#xff08;比如$、&、*&#xff09;。 $ echo $date$ 输出$date不会有任何结果&#xff0c;因为$是一个特殊字符 如果想要原样输出这些特殊字符&#xff0c;就必须在他们前面加上反斜杠&#xff0c;使其变成普通字符 $ echo \$…

Golang中的一些关键字(defer、:=、go func())

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 defervar与 : 的区别var:二者区别 go func de…

字节超全学习流程图流出,100天涨薪10k,从功能测试到自动化测试

今年年初&#xff0c;由于经济压力让我下定决心进阶自动化测试&#xff0c;已经24的我做了3年功能测试&#xff0c;坐标广州薪资定格在8k&#xff0c;可能是生活过的太安逸&#xff0c;觉得8000的工资也够了。 但是生活总是多变的&#xff0c;女朋友的突然怀孕&#xff0c;让我…

SpringBoot配置文件

什么是配置文件 如下图&#xff1a; SpringBoot项目中会有一个自带的配置文件&#xff0c;它是properties后缀的。 配置文件的作用 配置文件是用来配置项目中的一些重要数据的。 如&#xff1a;数据库连接信息、项目的启动端口、日志等等。 如果没有这些信息&#xff0c;S…

操作系统之调度

目录 什么是调度 进程调度的时机、切换、过程与方式 调度器/调度程序 调度算法 先来先服务算法 短作业优先算法 高响应比优先算法 时间片轮转算法 优先级调度算法 多级反馈队列调度算法 什么是调度 调度的三个层次 高级调度 中级调度 低级调度 总结如下&#xff1a; …