MES中基于WebClient的声明式服务调用框架

2019-04-26 05:03王杨帅
电子技术与软件工程 2019年4期
关键词:调用实例代理

文/王杨帅

1 引言

单体架构的MES在通用性上的不足,很难适应市场需求;各个模块紧密耦合对系统的升级和维护带来了巨大挑战。基于微服架构的MES根据企业的需求按照业务进行服务划分,形成积木式拼接系统,如何做到MES中各个微服务之间有效调用成为了关键。本文提出基于WebClient的声明式服务调用框架,简化了服务间的调用逻辑;调用方只需定义一个HTTP客户端接口就可以实现代理类去实现远程资源调用。

2 MES服务拆分

根据制造企业业务进行建模,一个MES按照业务可以分为订单管理、工艺管理、生产排产、过程管控、质量管理等制造服务。微服务架构的MES灵活地根据业务选择某些制造服务来快速定制一个系统,在实际生产环境中根据客户需求对服务进行增减操作来实现MES的个性化定制,微服务的MES可以缩短开发周期、降低企业维护成本。

3 调用远程服务资源

微服务架构的MES中的各个微服务之间可以通过接口调用的方式来对外提供服务的,所以必须服务间的正常通信。Rest方式的服务调用方式对消费者而言仅需通过一个HTTP客户端就可以远程访问服务资源,对于提供者而言只需在控制层开启Rest功能即可。例如:提供方暴露的接口为/car/{carId}时,消费端只需利用HTTP客户端请求http://IP:port/car/007 就可以获取到服务提供方提供的服务资源。

3.1 同步HTTP客户端实现方式

基于Restful风格的同步HTTP客户端实现方式主要有HttpClient、RestTemplate。

HttpClient提供了基于HTTP协议的客户端工具包,实现了HTTP全部类型的请求方法,同时也支持HTTPS协议。请求远程服务资源时繁琐的步骤,需要根据不同的HTTP请求类型创建请求实例,在通过HttpClient对象去执行请求实例,对获取到的数据还必须进行解析与封装,在获取到远程服务服务资源后还必须关闭相关的链接。

RestTemplate是在客户端访问远程服务的一个核心类,通过提供回调方法和允许配置信息转换器来实现个性化定制功能,可以封装请求对象,也可以对响应对象进行解析。使用其调用远程服务资源时,只需要在业务类中依赖注入RestTemplate实例并调用不同类型的请求方法即可。

3.2 异步HTTP客户端实现方式

WebClient 是一个非阻塞、响应式的HTTP客户核心类,它以响应式被压流的方式执行HTTP请求;非阻塞和响应式特性使其可以用少量的线程数处理高并发的HTTP请求。

4 声明式服务调用框架

利用同步HTTP客户端请求服务资源时都必须手动封装客户端,很容易造成很多重复的编码。本文主要简述基于WebClient实现一个声明式的REST客户端来解决MES中各个微服务之间的异步通信问题,简化MES远程服务资源调用的同时让整个MES实现异步调用远程服务资源。

只需要定义服务接口进行资源调用,具体的实现方式由动态代理实现。该框架利用反射机制去获取服务接口信息,再利用动态代理创建客户端实例,最后将实例动态注册到IOC容器中实现。在消费方只需要依赖注入服务接口实例,并调用具体方法就可以实现远程服务调用。整体架构图如图1所示。

4.1 客户端接口

创建@ Rest 注解,该注解的主要功能是用来声明服务接口用的,它是远程服务客户端接口的唯一标识。远程服务的IP和端口都由它的value属性指定。

利用自定义的Rest注解以及Spring提供的控制层注解来定义客户端接口,该接口中的每一个方法都对应一个远程资源,每个方法的具体实现由动态代理实现。控制层注解的value属性用于指定资源相对路径,同时在方法签名中可以定义请求信息。

4.2 获取接口信息

利用反射机制获取客户端接口类类型,并利用反射机制获取远程资源的服务信息和方法信息。服务信息中包含IP地址和端口信息,方法信息中包含请求信息和响应信息。利用Mono对请求信息进行封装来实现框架支持响应式的调用,响应信息也将用Flux进行封装。WebClient会利用反射获取到的服务信息和方法信息动态创建客户端实例进行远程资源调用。

4.3 动态注册Bean

图1

利用动态代理获取服务接口代理类信息之后,需要利用实例工厂处理器动态注册实例来实现服务接口代理类的注册功能。为了能够在实例工厂中动态注册Bean就必须创建一个实现了实例工厂接口的实现类,并在重写方法实例工厂中动态注册的Bean就可以保证动态注册的bean能被实例工厂处理,并且可以保证其的实例化和初始化总是先于依赖它的bean。

4.4 依赖注入

IOC容器启动时会自动扫描项目中标注有@Rest注解的接口并为其创建代理类,还会将生成的代理注册到IOC容器当中;因此,在需要进行远程调用服务资源的地方只需要利用@AutoWired按照类型依赖注入客户端接口类型的实例并调用实例的方法即可。

5 总结

基于WebClient的声明式服务调用框架极大地简化了MES中远程服务资源的调用,使得车间计划、车间操作、产品报工、产品质检、车间物流、设备维护、设备维修、看板信息、监控等一系列制造执行微服务可以协同工作。在基于HTTP协议的服务通信方面,支持响应式、非阻塞的声明式服务调用框架可以以少量而固定的线程数处理共并发的Http请求,使得整个MES可以在原有硬件资源的情况下承载更高的并发量,进一步提供了MES的性能。

猜你喜欢
调用实例代理
核电项目物项调用管理的应用研究
代理圣诞老人
LabWindows/CVI下基于ActiveX技术的Excel调用
代理手金宝 生意特别好
基于系统调用的恶意软件检测技术研究
复仇代理乌龟君
完形填空Ⅱ
完形填空Ⅰ
利用RFC技术实现SAP系统接口通信
一个村有二十六位代理家长