Data Base Technique  •
数据库技术Electronic Technology & Software Engineering  电子技术与软件工程• 181【关键词】MES WebClient 声明式服务调用框
1 引言
单体架构的MES 在通用性上的不足,很
难适应市场需求;各个模块紧密耦合对系统的
升级和维护带来了巨大挑战。基于微服架构
的MES 根据企业的需求按照业务进行服务划
分,形成积木式拼接系统,如何做到MES 中
各个微服务之间有效调用成为了关键。本文提
出基于WebClient 的声明式服务调用框架,简
化了服务间的调用逻辑;调用方只需定义一个
HTTP 客户端接口就可以实现代理类去实现远
程资源调用。
2 MES服务拆分
根据制造企业业务进行建模,一个MES
按照业务可以分为订单管理、工艺管理、生产
排产、过程管控、质量管理等制造服务。微服
务架构的MES 灵活地根据业务选择某些制造
服务来快速定制一个系统,在实际生产环境
中根据客户需求对服务进行增减操作来实现
MES 的个性化定制,微服务的MES 可以缩短
开发周期、降低企业维护成本。
3 调用远程服务资源
微服务架构的MES 中的各个微服务之间
可以通过接口调用的方式来对外提供服务的,
所以必须服务间的正常通信。Rest 方式的服
务调用方式对消费者而言仅需通过一个HTTP
客户端就可以远程访问服务资源,对于提供
者而言只需在控制层开启Rest 功能即可。例
如:提供方暴露的接口为/car/{carId}时,消
费端只需利用HTTP 客户端请求IP:port/
car/007 就可以获取到服务提供方提供的服务
资源。
restful接口调用实例3.1 同步HTTP客户端实现方式
基于Restful 风格的同步HTTP 客户端实
现方式主要有HttpClient 、RestTemplate 。
HttpClient 提供了基于HTTP 协议的客户
端工具包,实现了HTTP 全部类型的请求方法,
同时也支持HTTPS 协议。请求远程服务资源
时繁琐的步骤,需要根据不同的HTTP 请求类MES 中基于WebClient 的声明式服务调用框架
文/王杨帅
型创建请求实例,在通过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 利用动态代理获取服务接口代理类信息之后,需要利用实例工厂处理器动态注册实例来实现服务接口代理
类的注册功能。为了能够在实例工厂中动态注册Bean 就必须创建一个实现了实例工厂接口的实现类,并在重写方法实例工厂中动态注册的Bean 就可以保证动态注册的bean 能被实例工厂处理,并且可以保证其的实例化和初始化总是先于依赖它的bean 。4.4 依赖注入IOC 容器启动时会自动扫描项目中标注有@Rest 注解的接口并为其创建代理类,还会将生成的代理注册到IOC 容器当中;因此,在需要进行远程调用服务资源的地方只需要利用@AutoWired 按照类型依赖注入客户端接口类型的实例并调用实例的方法即可。5 总结基于WebClient 的声明式服务调用框架极大地简化了MES 中远程服务资源的调用,使得车间计划、车间操作、产品报工、产品质检、车间物流、设备维护、设备维修、看板信息、监控等一系列制造执行微服务可以协同工作。在基于HTTP 协议的服务通信方面,支持响应式、非阻塞的声明式服务调用框架可以以少量而固定的线程数处理共并发的Http 请求,使得整个MES 可以在原有硬件资源的情况下承载更高的并发量,进一步提供了MES 的性能。参考文献[1]化工生产执行系统MES[M].北京:化学工业出版社,2007.[2]基于MES 的数据采集系统升级改造[J].天津:天津冶金,2018.[3]基于多代理的分布式可集成MES 框架研究[J].北京:设计与研究,2005.
作者简介王杨帅(1993-),男,重庆市人。研究生学历。主要研究方向为制造执行系统、微服务。作者单位
广东工业大学  广东省广州市  510006
图1

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。