一、改造背景
1、针对单体架构的web应用,底层依赖单一数据库。
2、单体应用显示出的痛点如下
1)宕机频繁:由于各个模块都部署在一起,所以任何模块之一出现问题都会导致整个应用崩溃。
2)启动慢:单体应用越来越大,导致应用启动速度越来越慢,长达十几分钟。
3)修复慢:开发效率低,由于模块之间耦合,本地调试,启动非常耗时,修复问题非常耗时。
3、改造过程需要以业务作为出发点,以用户为中心
1)提高用户满意度,通过容器平台方式提高系统应用稳定性和可用性。
2)加快功能实现,提高开发效率,帮助开发团队更快、更好地完成软件功能的开发、测试和发布。
二、改造范围
1、由于应用系统在数据层面的耦合度很高,所以需要循序渐进来完成整个改造过程:
从业务角度进行分拆,从非关键点功能开始,逐步扩大试点范围。
2、具体在确定要进行拆分的服务/模块/组件时,规则如下:
1)相对独立(业务独立,数据独立),对其他模块影响小。
2)三层架构(展示层,业务逻辑层,数据访问层)。
3)展示层可以通过反向代理从单体应用分流到微服务。
4)业务逻辑层可以通过RESTful/RPC客户端从进程内函数调用分流到微服务远程调用。
5)数据层由于耦合度高,暂保持原样,需要注意微服务操作的数据库表和调用存储过程是相对独立。避免与单体应用同时操作相同数据导致冲突。
3、一般改造过程,优先改造以下几种典型模块/服务比较适合开始进行微服务改造:
1)用户/账号管理
2)鉴权和session管理
3)偏好设置/配置
4)通知和通信服务
5)照片/多媒体/元数据
6)任务队列处理
三、改造目标
1、预期效果
1)提高系统可靠性和可用性 现有的架构下,模块之间相互影响,且存在单点失败问题,链条上任何模块、物理机、运行时中间件出问题导致整个系统无法继续工作; 改造后,微服务之间相互独立,互不影响,且每个微服务应用可部署至少两份,分布在不同的物理机上,极大的降低宕机风险。 (图以tomcat为例,实际情况可适用其他类似web应用。)
2)提高业务响应能力 改造后开发效率会有很大提高:拆分成微服务后启动速度会加快,所以本地开发调试也更省时;使用kubesphere容器平台的自动化部署除了加快速度,还能有效减少手工误操作。
3)运行环境容器化 图以tomcat/spring为例,实际情况可适用其他web容器,比如Express/Node,IIS/.NET,Ruby on Rails等。
四、改造要求
1、业务要求 需要对即将改造的模块有深刻的理解,包括:内部逻辑,边界,与其他模块的交互,使用的数据/存储过程是否与其他模块有交叉。
2、技术要求(以java为例,其他语言需替换为相应的技术栈)
1)必备项:熟练掌握java,spring MVC,SQL
2)使用过以下一项或多项:
Spring Boot (简化开发)
Spring cloud(理解微服务)
Log4j/slf4j(日志设计,帮助分布式错误排查)
OpenFeign(RESTful远程调用)
RESTful API/JSON(微服务接口设计)
SVN/Git (代码版本管理)
Ant/Maven/Gradle(可重复自动构建)
Swagger(API文档管理)
JMS等消息处理(消息中间件)
Redis/Memcached(分布式缓存)
Nginx等负载均衡
jUnit/Powermock/Mockito/Wiremock等框架(自动化测试)
Kibana(分布式日志查询)
CI/CD(持续集成和部署)
Docker(容器化)
Kubernetes(容器编排)
Linux常用命令
iptables等防火墙(网络问题排查)
五、其他问题
1、各个服务接口文档统一入口 随着微服务化改造的推进,各服务的API接口也越来越多,用户需要一个统一的接口文档入口进行查看,降低不同部门之间的沟通成本。此时可采用swagger进行聚合。
2、应用启动慢 单体应用由于越来越大,不可避免的启动速度越来越慢。 短期方案可考虑:性能调优、确定瓶颈、并进行针对性的优化。 长期方案还是微服务化改造,把模块分拆以后,每个应用的可部署包体积会大幅减少,从而达到理想的启动速度。
3、与其他系统/平台集成
集成方式有几种:
1)开发平台完全运行在kubesphere:所有组件和平台本身都是支持容器化,所有组件和平台本身支持安装在kubernetes上。
2)开发平台仅把应用部署在Kubesphere:需要开发平台对接kubesphere,包括开发平台上的应用可以容器化,开发平台上的应用可以打包成K8S格式。
3)开发平台仅把依赖的第三方组件部署在Kubesphere
KubeSphere自带应用仓库,可以一键部署标准组件,比如zookeeper,Tomcat等,只需要开发平台与Kubesphere网络互通即可。但如开发平台使用的是修改过的组件,则需要开发平台将此组件容器化并与K8S适配才可以使用。