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实现服务之间的调用,方式配置很简单、扩展性强。



















