简介


什么是HAS?

HAS是⼈性化应⽤服务(Humanized Application Service)的缩写。 所谓⼈性化,是希望HAS能够帮助⼯程师解决快速⾼效搭建企业级应⽤服务,能够尽可能的将时间投⼊到实际业务 逻辑的编写上,⽽不是过多的纠结于架构的选择。
相⽐于goframe,HAS关注的粒度更⼤,⽽不是基础模块编写或库包的封装。相⽐于go micro,HAS希望能够保持灵活性的同时,对业务服务的编写提供更快捷的能⼒和相对统⼀的约束。

使用场景

HAS希望能够解决的应⽤服务场景包括:

  • 向外部提供API服务,外部既包括前端应⽤,也可以包括其他业务系统或组建
  • API可能是基于HTTP(S)的,也可能是基于其他协议,例如TCP/UDP、gRPC,甚⾄于基 于ModBus等的⼯业终端或下位机。也就是说,便携的服务路逻辑可以⽅便的应⽤到不同 的通讯协议上
  • API两端的数据交换格式可能使基于json的,也其他标准格式或者⾃定义格式
    HAS要求在上⾯⼏种场景中核⼼服务不变,也就是尽可能保持业务服务对通信协议及数据交换的中⽴性。

架构

核心组件及调用关系

HAS后端服务的核⼼架构如下图所示:

has-APIServer.png
图1. HAS后端核⼼组件结构图

说明

上图中各个组件后缀的字⺟A/B/X,仅代表不同组件的名称,并不意味具有相 同后缀字⺟的组件具有关联关系。

上图展示了HAS的核⼼组件,以及典型的数据流。图中核⼼组件说明如下:

组件说明
Packer数据打包器。将Service返回的数据封装成Frontend希望的格式(亦即F/B之间约定好的格式
Connector通讯连接器。负责与Frontend的双向通信。Connector向Frontend发送数据时,数据先要先经过Package打包。一个Backend实例可以具有多个Connector,这样一个Backend可以为多个通讯异构的Frontend服务
Router路由器。负责将Frontend请求路由到正确的Service上。此外,Service之间的调用也通过Router路由
Middleware中间拦截器。在请求进入Service之前或者Service处理完饭回之后对请求参数或响应数据进行拦截。 拦截器可以用于验证/限流/日志等目的。
Service服务。实现业务逻辑或其他实际功能的实体,是真正的任务执行单元。
Plugin插件。 与一般对插件的理解不同,HAS中的插件通常不执行具体的任务,而是对一些基础/公共能力的封装,例如数据库访问、内存缓存、第三方支付接口对接等。HAS鼓励将通用基础能力封装成Plugin,以便供其他组件使用。也因为Plugin是可以共享使用的,因此要注意Plugin的重入安全。

服务器

上述所有核心组件,必须注册到某个Server中才能工作。换言之,Server是所有组件的容器。为满足分部署的需要,Server包含两种即普通Server和API Gateway(后续简称Gateway)。事实上,Gateway是一种特殊的Server。具体说明如下:

名称说明
Server服务器。代表了一个进程实例。必须包含Router、Service
GatewayAPI网关。代表了一个进程实例。必须包含Router、Connector、Packer

由于Gateway也是Server,因此也可以包括Service,这样的Gateway就成了一个既能提供API访问能力,也能提供API具体服务能力的完整服务器实例。对于简单的应用服务,即可采用这种服务器架构。图1就是这种服务器的内部结构图。

但是,大量的企业级应用服务,尤其是用户较多、访问较频繁的应用服务,对可靠性、性能等都具有一定要求,因此往往采用的是分布式架构。在这种情况下,Gateway往往只提供API访问能力,并通过Router,将请求路由到正确的提供该API服务的Service上。如前所述,该Service可以根据业务逻辑的需要,调用其他Service。这种模式的架构如下图所示。

has-distributed.png 图2. HAS 分布式后端结构图

说明1

图2 Gateway上标注的(1...M)是指Gateway可以是一个或者多个。换言之可以利用类似Nginx来实现Gateway的负载均衡。

说明2

图2 Server上标注的 (1...N)是指Server可以是一个或者多个,并且每个Server中的Service和Plugin可以相同,也可以不同。相同的Server相当于做负载均衡,不同的Server相当于将Server做业务区隔。例如,可以将资金结算服务放在一个独立的Server上,其他Server上涉及到资金结算的都调用该Server,从而保证资金处理的一致性(如何避免该Server成为瓶颈是另一个问题)。

实体

在HAS中,还有一个重要的概念,即实体(Entity)。实体是HAS可以管理的对象,包括:Connector、Router、Middleware、Service、Plugin、Service、Gateway。

所谓管理是指可以知晓实体的配置、状态,并实时更新实体的配置。HAS提供了实体管理的接口及规范,实体只要实现了相应的接口和规范,可以被纳入HAS监控及管理体系。

关于实体的监控和管理的实现,后续将有专门文章介绍。