1. 引言
在微服务横行的年代,后端根据业务的不一样分成了很多单独运行的服务,比如在物联网中,根据业务拆分为定时服务、设备控制等服务。当前端想控制设备时,其请求首先到其对应的后端服务,后端服务再调用设备控制服务,才能实现业务需求。
接下来例举一个实际的场景,后端服务如何去调用设备控制服务接口。
2. 实现的方式
2.1 HTTP请求方式
在业务层访问服务的时候,最常使用的协议就是HTTP协议,因此在访问其他服务,就可以模拟HTTP实现服务请求。http
包含header
和body
,因此在模拟中,就需要构造一个header
和body
。
在后端服务中提供了多种方法:HttpClient
,RestTemplete
。
在我之前的文章中介绍了RestTemplate
的方式,大家可以参考:如何在后端去访问第三方API
2.2 OpenFeign方式
Feign
是Springcloud
组件中的一个轻量级Restful
的HTTP
服务客户端,并内置了Ribbon
,可以实现客户端负载均衡。
OpenFeign
是Springcloud
在Feign的基础上支持了SpringMVC
的注解,如@RequestMapping
等。OpenFeign
的@FeignClient
可以解析SpringMVC
的@RequestMapping
注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
因此在定义接口上非常的方便,接下来进行介绍一个demo
,以下的代码都需写在后端服务上。
2.2.1 在SpringBoot项目中引入注解
在pom.xml
文件中添加注解,这里需要注意和SpringBoot
和SpringCloud
的版本进行对应。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2.2 新建接口,定义好想要访问的RESTful
定义一个bean
,控制设备的入参
public class ControlParam{
// 设备id
String 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 {
@Autowired
private ExampleClient exampleClient;
@PostMapping("/control")
public String contrlExample(@RequestBody ControlParam controlParam) {
return exampleClient.control(controlParam);
}
}
如上,通过4个步骤就可以使用OpenFeign
实现服务间的接口调用。其具体访问路径为:
APP
访问Controller
暴露的接口"/control"
接口- 在
contrlExample
方法中通过ExampleClient
去调用设备控制服务
结语
以上介绍了如何使用OpenFeign
实现服务之间的调用,方式配置很简单、扩展性强。