> 文章列表 > 使用OpenFeign实现接口访问

使用OpenFeign实现接口访问

使用OpenFeign实现接口访问

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