【导言】
选择并坚持合适的编程语言至关重要,编程语言的更换意味着高昂的学习成本和不增值的系统重构。面对业务交付周期变短、业务高并发压力,向微服务演进成为软件架构师的共同选择。业界已有的微服务框架往往只支持Java,基于PHP、.Net的应用该如何拥抱微服务?Service Mesh,被誉为下一代微服务,提供一种透明的微服务网络代理,以SiderCar模式将PHP应用以零侵入方式实现微服务架构演进。
【正文】
在智慧城市的大浪潮之下,文思海辉推出SaaS化的HiFM智慧楼宇管理方案,涵盖了人、物、环境等多个元素,业务流程包括预算管理、系统检测、工单管理、预算管理、供应商管理、资产管理、问题管理等。HiFM智慧楼宇管理方案进一步提升楼宇管理的自动化水平,也让现代楼宇系统具备环境监测、能耗监控、设备智能监控等能力,成为更智慧的楼宇管理中枢。这也要求楼宇管理系统能够更灵活、快速的满足个性化业务场景的要求。
PHP和微服务,是否是一场错配?
PHP语言具有运行高效、部署快速、扩展库功能强大、且HiFM智慧楼宇管理系统的研发团队具有多年的PHP语言研发经验,能够快速、准确地实现复杂的业务需求,因此HiFM系统首选PHP语言作为系统的主开发语言。
HiFM系统由数十个功能模块组成,业务模块耦合性高。随着系统功能不断丰富,复杂性不断提升,系统体量越来越大,维护和升级成本不断攀升。HiFM系统作为面向企业用户的SaaS解决方案,需要对接大量企业已有的业务系统,这使得系统变得越发臃肿。为了减小耦合性,HiFM系统启用了前后端分离的模式,更为轻巧快速的PHP框架,但这并未从根本上解决所有问题。而从长远来看,HiFM系统必将扩展更多边缘模块,对接更多的个性化业务系统,这对系统架构提出严峻挑战。
我们决定选用微服务架构解决这些难题。微服务技术带来的好处不言而喻,独立开发、独立部署、独立发布、去中心化管理,支持高并发高可用,支持丰富技术栈,企业可以根据需要灵活技术选型。
但深入分析之后发现:PHP 需要 Nginx 和 PHP-FPM(或类似工具)来实现进程和连接池管理等功能。这意味着部署基于PHP语言的微服务,PHP-FPM 和 Nginx 也必须一起运行。这浪费了系统资源,也降低了扩展的效率,也带来配置复杂性的问题。优化单 PHP 实例已经很头大了,因为需要了解和配置 PHP,PHP-FPM 和 Nginx 这一堆组合,我们无法想象最终在弹性的 Kubernetes 环境中配置多个 PHP 栈的痛苦情形,完全不知道在同一台机器上运行了哪些服务。
既然我们已经致力于以软件架构的优化整体提升应用的快速发布、快速上线,那么因为语言而增加更多长期开销、配置和管理复杂,就是得不偿失的。
重构PHP应用是唯一的选择吗?
CSE Mesher改变PHP和微服务无法兼容的现状
CSE(Cloud Service Engine)是一款华为云推出的微服务引擎,基于华为公司的大型系统微服务化积累的最佳实践构件,提供了微服务SDK,服务注册,配置和治理中心,帮助开发人员实现微服务应用的快速构建、治理运维。
CSE Mesher是Service Mesh模式的一种实现,将负载均衡、服务发现、熔断、运行时动态路由等能力抽象成将一层透明网络代理。正因为其作为独立运行透明代理的特点,CSE Mesher可以使得多种编程语言的应用,如PHP, .NET,NodeJS都能够快速转向微服务或者云原生应用,开发者无需修改原有的业务代码,以一种自然的机制扩展应用负载,自由混编,并因地制宜选择虚拟机或容器部署。
基于CSE Mesher,在很短的周期内就实现了HiFM系统的零侵入式微服务架构改造,其实现步骤包含以下三个环节:
1、范围明确与功能剥离:明确业务系统的边界,形成多个独立的微服务,如上图所示。这里包括如下两点:
1) 将原本耦合的工作流拆分出来,采用更适合的PHP微服务框架;
2) 对相关功能模块进行重组,将之前的高耦合的模块联动方式修改为各个微服务之间的RESTful服务调用方式。
在拆分的过程中,需要根据以下原则来分析权衡:
1) 软件发布频率:如果某部分功能经常变动,变动过程不希望现存的主要服务受到影响甚至断服,那么这部分功能就要拆出来,成为独立的微服务;
2) 系统复用:如果某部分功能适合作为API server发布出来供其他调用者调用,建议成为独立的微服务;
3) 业务相关性和独立性:拆分时要考虑业务逻辑的独立性,比如购物车,支付,评论服务,上图例子中很好地诠释了这一点;
4) 团队:在调整架构时还要考虑人力的重新分配,通常用2 pizza team来衡量一个微服务的团队人力是否合适。
2、接入微服务注册中心:这里描述的是基于华为云CSE微服务引擎的实现。其中,Mesher(即:微服务引擎透明代理)只要求进行最小化的配置即可接入,具体包括如下几个要点:
1) 给服务设置名字,以便在运行时让其他服务寻址
2) 使用mesher作为http_proxy 即运行命令exporthttp_proxy=
3) 告诉mesher,服务本地监听地址,比如127.0.0.1:3000
4) 最终,在运行时,当你想要访问一个API时,只需要通过服务名+API路径,即可访问
3、运用微服务治理实现系统的弹性和高可用:微服务治理能力确保系统能够在大话务量峰值场景下也能为企业用户提供更加优质的服务,包括:限流,熔断降级,容错,负载均衡策略,通过系统配置和智能算法,确保系统运行时的高可用。
【结语】
通过以上三步,改造后的HiFM系统有效提高系统容错能力以及稳定性,具备熔断降级与限流的自服务治理能力,同时也使用标准OpenAPI契约,便于免修改多系统对接。
更重要的是,整个改造过程中,无需将原有PHP代码使用其他编程语言重构,也无需对PHP业务代码因改造而实施修改。
简单三步即可享受微服务架构带来的业务快速开发快速上线、系统资源弹性、去中心化管理、系统高并发高可用,完全无需关心分布式架构带来的复杂性和以及引入的技术问题。