揭秘CMP 5.0:微服务应用开发框架之SkyStack

前言

在过去的十余年里面,软件开发行业逐渐分成了两个领域,一部分是企业应用开发,为客户开发,软件要安装到企业客户自己的资源上,客户负责运维(或者通过技术支持),一部分是互联网软件,为自己开发,自己开发并运维一套软件通过网络给最终用户使用。同时,这两个领域使用的技术栈也逐渐分化,前者主要关注功能实现,标准化,易安装,易运维,后者主要关注高并发,高可用,高性能及纵向伸缩性等。

随着微服务概念的提出,这两个领域似乎又形成了一个合流,都在微服务化。这里体现在:

由于SaaS 的兴起,使得一些企业应用厂商也开始采用互联网模式,遇到用户规模的问题。同时企业应用很难纯 SaaS 化,面对大客户的时候,势必面临私有部署的问题,所以必须探索一种既能支撑用户规模,同时要能方便私有化部署的架构。为了解决这些问题,我们在即将发布的SkyForm CMP5.0产品开发上使用了微服务应用架构。

微服务介绍

微服务出现之前,有很大一部分开发商都采用单体应用开发方式,我们先看一下微服务架构和传统开发中的单体应用架构的区别。

1.  微服务与单体应用的区别

单体应用特点:代码完全共享,数据库共享,整体部署,笨重,功能紧耦合,局部修改整体更新。

1.1单体应用

揭秘CMP 5.0:微服务应用开发框架之SkyStack

单体应用

单体应用的优点:部署简单

单体应用的缺点:维护性差,伸缩性差,开发成本高,技术选型困难,资源利用率底,故障全局性

1.2微服务

微服务特点:代码分离,功能解耦,数据独立,独立部署,轻量,局部修改局部更新

微服务的优点:维护性高,伸缩性强,开发成本底,技术选型简单,资源利用率高,故障隔离

微服务的缺点:部署复杂,说是缺点有点勉强,部署复杂可以通过运维手段可以解决,这里就不做过多讨论了。

 揭秘CMP 5.0:微服务应用开发框架之SkyStack

微服务

2.  微服务架构模式

揭秘CMP 5.0:微服务应用开发框架之SkyStack

以上两张图的区别:右图中出现了一个Api网关,其主要作用包括:统一路由,统一鉴权,统一流控,统一协议,统一防攻击等。可见  有了Api网关微服务架构才算完整。

下图中加入了服务发现功能,这个是微服务的核心功能。

揭秘CMP 5.0:微服务应用开发框架之SkyStack

细心的读者可能发现了一个问题,Api网关是不是容易成为整个应用的瓶颈呢?答案是肯定的。不过这里给出了解决方案,请看下面:

通过使用Keepalived方式可以解决Api网关单点故障的问题,同时下图也是微服务的运行架构。

揭秘CMP 5.0:微服务应用开发框架之SkyStack

微服务之间的调用分为:同步调用和异步调用。

1)  同步调用:即时性较好,部署简单,但存在强耦合问题。同步调用一般采用内部通信的RPC,不过你要关注它的码流、序列化效率、线程模型是否高效、地址透明化等问题,减少内部通信的延迟。

2)  异步调用:服务之间的依赖关系充分解耦,同时可以处理较耗时的复杂业务,一般可以通过消息中间件或异步线程方式来实现。

根据不同的应用场景选择不同的调用方式,在实际的应用开发中,两种调用模式都是同时混用的。

SkyStack框架

我们对微服务做了简单的介绍,那么我们怎样快速开发一个微服务呢,下面开始介绍公司的自研框架Skystack。

1.  SkyStack产生背景

1)  软件设计原则:高内聚,低耦合,抽象共性,高度封装

2)  敏捷迭代,快速交付,应对万变的需求

3)  服务化设计,配置化开发

4)  云化驱动:横向扩展(集群),纵向扩展(分布式),Z向扩展(用户数据特性)

5)  最终目标:提高劳动生产率,保证产品质量

2.  SkyStack微服务框架技术栈

揭秘CMP 5.0:微服务应用开发框架之SkyStack

3.  SkyStack特点

1)  前后端分离,后端分层开发,层次清晰且意义明确,降低耦合度,提高复用率

2)  以服务化开发,业务功能以服务设计为驱动,开发团队结构,实现并行开发

3)  支持多语言国际化,根据业务场景支持分域切库

4)  异常统一处理机制:针对核心业务异常统一处理,标准化输出,支持多语言异常信息

5)  根据数据模型反向生成DAO源代码,且支持灵活扩展

6)  任意业务相关参数都是可配置的,即一切皆可配置

7)  部署灵活,任意服务都可独立部署,不依赖于任何容器,即任意云化部署

8)  严格按照开发规范设计,持续集成,降低软件维护成本

9)  ”填空题式“开发,节省大量开发工作量的同时,同时保证了产品质量。

4.  SkyStack组件介绍

skystack-base:微服务接口开发所依赖的基础组件

skystack-common:提供一些常用工具及公共类

skystack-core:skystack框架本身所依赖组件,扩展模块所依赖的核心模块

skystack-dbdriver:数据库访问所依赖的核心组件,内部使用mybatis

skystack-auth:api网关层统一处理用户的认证及权限

skystack-log:业务层统一处理业务日志的核心组件

skystack-web:提供基于socket或http的web服务,底层基于netty

skystack-rest:rest开发框架,用于开发rest服务,被wsg使用

skystack-wsg:api网关层所依赖的核心组件,提供请求路由及协议转换

skystack-dubbo:提供dubbo服务所使用的核心组件

skystack-ut:业务层做单元测试所要依赖的组件

skystack-httpclient:调用rest服务时所使用的开发组件,能够以面向对象方式调用rest服务,具有高效,快捷,易维护等特点。

skystack-generator:微服务开发手脚架,用于快速生成微服务代码框架,以便快速开发。 

5.  微服务应用开发的手脚架

为了快速开发和标准化工程,可以使用skystack-generator组件进行快速生成,具体步骤如下:

1)  通过使用skystack-generator组件生成微服务工程,可以在eclipse里面完成或通过命令行完成。生成的微服务工程包括:xxx,xxx-api,xxx-app,xxx-dubbo,xxx-pack,每个工程的意义如下:

ü  xxx:微服务的父工程

ü  xxx-api:微服务的接口工程

ü  xxx-app:微服务的核心业务工程

ü  xxx-dubbo:微服务发布dubbo服务的工程

ü  xxx-pack:微服务的打包工程

2)  将上述生成的微服务工程导入到eclipse中

3)  基于所生成的微服务工程编写自己的业务代码,同时进行单元测试

4)    对xxx工程(父工程)进行maven install,在xxx-pack工程的target目录下生成了一个打包好的压缩包(tar,zip等),将这个压缩包解压到任何机器的任意目录,进入bin下执行start即可。微服务的部署不会依赖任何第三方的服务器中间件(底层基于netty),只要有JDK8及以上版本即可。

揭秘CMP 5.0:微服务应用开发框架之SkyStack

在上面的图中可以看到,开发微服务应用只需在应用插槽中加入新的应用即可。底层的所有技术细节都被SkyStack所屏蔽,这些对开发人员都是透明的,因此开发人员只需关注核心业务开发,使他们的工作重点更加内聚,从而产出高质量、高效率的软件得到保障。

6.  微服务应用开发架构全景图

下图是微服务应用开发架构全景图,逻辑上分为七层:数据层、访问层、业务层、接口层、服务层、网关层及展现层。每一层都有明确的职责,蓝色模块代表核心业务,也是开发人员需要交付的,整个开发都是需要依赖SkyStack框架的。

揭秘CMP 5.0:微服务应用开发框架之SkyStack

总结

本质上,微服务的目的是想以一种架构模式,应对软件所服务的用户的规模增长及多变的复杂业务。没有微服务架构之前,大多数应用是以单体模式出现的,只有当规模或业务增长到一定程度,单体架构满足不了伸缩需求的时候,才考虑拆分。而微服务的目标是在一开始的时候就按照这种架构实现,是一种面向未来的架构,也就是说用开始的选择成本降低以后的重构成本。

在实际开发中,SkyStack的很多功能特性还需要后续升级完善,例如与Kubernetes的融合等。关于微服务的使用这里借用一句话:用经济学的观点来说,微服务是技术投资,单体应用是技术债务,技术有余力,那可以投资以期待未来收益,没余力那就只能借债支持当前业务,等待未来还债。