抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

PHP 与微服务如何共存?

2020 年 4 月 03 日

PHP与微服务如何共存?

选择并坚持合适的编程语言至关重要,编程语言的更换意味着高昂的学习成本和不增值的系统重构。面对业务交付周期变短、业务高并发压力,向微服务演进成为软件架构师的共同选择。业界已有的微服务框架往往只支持 Java,基于 PHP、.Net 的应用该如何拥抱微服务?Service Mesh,被誉为下一代微服务,提供一种透明的微服务网络代理,以 SiderCar 模式将 PHP 应用以零侵入方式实现微服务架构演进。


在智慧城市的大浪潮之下,某 IoT 服务商推出 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.将原本耦合的工作流拆分出来,采用更适合的 PHP 微服务框架;


2.对相关功能模块进行重组,将之前的高耦合的模块联动方式修改为各个微服务之间的 RESTful 服务调用方式。


在拆分的过程中,需要根据以下原则来分析权衡:


软件发布频率:如果某部分功能经常变动,变动过程不希望现存的主要服务受到影响甚至断服,那么这部分功能就要拆出来,成为独立的微服务;


系统复用:如果某部分功能适合作为 API server 发布出来供其他调用者调用,建议成为独立的微服务;


业务相关性和独立性:拆分时要考虑业务逻辑的独立性,比如购物车,支付,评论服务,上图例子中很好地诠释了这一点;


团队:在调整架构时还要考虑人力的重新分配,通常用 2 pizza team 来衡量一个微服务的团队人力是否合适。


接入微服务注册中心:这里描述的是基于华为云 CSE 微服务引擎的实现。


其中,Mesher(即:微服务引擎透明代理)只要求进行最小化的配置即可接入,具体包括如下几个要点:


1.给服务设置名字,以便在运行时让其他服务寻址;


  1. 使用 mesher 作为 http_proxy 即运行命令 export http_proxy=;

  2. 告诉 mesher,服务本地监听地址,比如 127.0.0.1:3000;

  3. 最终,在运行时,当你想要访问一个 API 时,只需要通过服务名+API 路径,即可访问。


运用微服务治理实现系统的弹性和高可用:


微服务治理能力确保系统能够在大话务量峰值场景下也能为企业用户提供更加优质的服务,包括:限流,熔断降级,容错,负载均衡策略,通过系统配置和智能算法,确保系统运行时的高可用。


通过以上三步,改造后的 HiFM 系统有效提高系统容错能力以及稳定性,具备熔断降级与限流的自服务治理能力,同时也使用标准 OpenAPI 契约,便于免修改多系统对接。


更重要的是,整个改造过程中,无需将原有 PHP 代码使用其他编程语言重构,也无需对 PHP 业务代码因改造而实施修改。


简单三步即可享受微服务架构带来的业务快速开发快速上线、系统资源弹性、去中心化管理、系统高并发高可用,完全无需关心分布式架构带来的复杂性和以及引入的技术问题。


本文转载自华为云产品与解决方案公众号。


原文链接:https://mp.weixin.qq.com/s/m2R0E1z6zJ-3y-ZmsRrsAg


2020 年 4 月 03 日 13:48941

评论

发布
暂无评论
发现更多内容

c语言简介

Geek_f510ff

c C语言

我与声网Agora

june

基于matlab的控制系统与仿真3-根轨迹、bode图、Nyquist图

AXYZdong

matlab 2月春节不断更

华为云PB级数据库GaussDB(for Redis)解析第二期:Redis消息队列Stream的应用探讨

华为云开发者社区

数据库

设计模式之代理模式

Geek_7cf491

Java 设计模式 代理模式

kafka consumer group

Eric

BFF (Backend for frontend)避坑指南

码猿外

架构 微服务 BFF

python与c++区别之print

沈阳

数据中心架构设计比较

程序员成长第十五篇:编码的注意事项

石云升

程序员成长 28天写作 2月春节不断更

cobra-强大的CLI应用程序库

happlyfox

golang GitHub cli 28天写作 2月春节不断更

Windows下JMeter分布式压测环境搭建

行者AI

Jmeter

CPU高速缓存与极性代码设计

华为云开发者社区

缓存 数据 cpu 存储

数据驱动业务增长的底层逻辑2.0

小飞象@木木自由

产品 数据分析 运营 业务增长

新病毒兼容M1芯片,已经感染3万台Mac

Geek_b0cff7

2019年度CMMI V2.0性能报告

渠成CMMI

产品 项目管理 性能 质量 CMMI

话题讨论 | 如何看待公司发开工红包?

happlyfox

话题讨论 28天写作 2月春节不断更 话题王者 红包

Mybatis association关联查询

フェイト ゼロ

Idea快捷键操作

刘大明

IDEA

容器 & 服务:Docker应用的Jenkins构建

程序员架构进阶

Docker 容器化 七日更 28天写作 2月春节不断更

以AI之名 | 给千万级合同管理安上“AI”,华为商务经理工作量大解放!

华为云开发者社区

人工智能 华为 合同 商务 合同管理

浅谈Python中遇到extend和append,该怎么区别使用

莫陌默

Python 列表 函数

字节码角度分析i++和++i的区别

现实中游走

Java 字节码

效率工具分享-Quicker

十天、

效率 效率工具 工具 工具软件

带你快速了解Flutter的发展和应用

anyRTC开发者

flutter 音视频 WebRTC 跨平台 sdk

可能是Java Stream的最佳实践(一)

ES_her0

28天写作

windows10+python3.8.0(anaconda)+MeCab安装总结

lauqasim

Python Mecab 日文分词

华云·云场景应用详解|安超DCM给数据中心“做主”

华云数据

Python入门-位运算

123568

Python 入门 位运算

Elasticsearch入门,这一篇就够了

知南茶温暖

Spark Shuffle 内部机制(三)

hanke

大数据 spark 数据 开源框架

Study Go: From Zero to Hero

Study Go: From Zero to Hero

PHP与微服务如何共存?-InfoQ