PHP的开发效率高。无需编译,开发调试速度快。
团队在PHP方面积累的经验丰富:
成熟的轻量级框架:Web框架QFrame,数据库QFrameDB,服务内部调用SDK:PepperClient,异步消息队列SDK:ProcessClient等
丰富的LNMP调优经验。
成熟的持续集成:发布系统。
HULK团队提供稳定高效的私有云解决方案:基于LNMP架构下的 Web服务管理:机器管理,Nginx等配置管理,MySQL、Redis等存储服务。
服务治理代码和业务代码耦合度高,不通用。使用Nginx + Lua + 降级代码。降级代码写到业务代码中,新增降级需要新写代码,没有一套通用降级,治理方案,耦合度高,影响业务稳定性。
团队维护成本高。服务是分模块的,大家各自维护各自的服务,底层没有核心模块,不同服务之间充斥着重复代码,各自为战,复用性不足。举例:错误码很多服务是重叠的。
服务升级的技术成本很大。举例:经济系统虚拟货币服务分库提升支付能力,因没有成熟的组件, 需要人肉手写分库代码,更需要长时间的回归测试,压力测试才能上线。
服务扩容速度慢,需要申请资源,部署,测试,上线。
服务优化,提升单机性能受限框架上限。受限于LNMP每个请求独享一个进行,同步IO的机制而变得艰难,可以选择更换框架为swoole,选择异步Redis的库,这都需要大量的基础调研、测试、业务代码会被改的面目全非,项目周期会冗长。
整个后端的微服务做到了分拆:用户、直播、消息、经济系统、云控等,项目的开发效率高,但是维护的工作对工程师的能力要求极高,治理、服务扩容、缩容、技术升级等问题还是困难重重,步履维艰。而Java体系的Spring Cloud在服务注册发现、熔断限流、服务网关、分布式配置等一道解决,而不是在PHP方案上自己找开源去拼凑重构,这方面Java更成熟和成体系,而且Java体系在新兴的微服务架构Service Mesh中融合更好。
Dubbo:https://dubbo.apache.org
Spring Cloud Alibaba:https://github.com/alibaba/spring-cloud-alibaba
成熟稳定,社区热度极高,相关资料很多,问题方便解决;
极大地提高了开发效率:使用注解、约定优于配置原则,大大减少了Spring Bean的配置文件;
方便部署,项目可独立打成jar包,无需依赖Web容器;
与微服务相关框架方便集成,几个注解搞定注册中心、配置中心等集成;
提供运行时的应用监控,actuator监控健康;
方便集成第三方http、gRPC组件,跨语言与PHP和Go项目交互。
选择MyBatis,相对于Hibernate更轻便灵活,相对Spring JdbcTemplate功能更强大,使用mybatis-generator可以根据表反向生成model,提升开发效率。
选择Undertow:
Undertow在高负载情况下性能和稳定性要明显优于Tomcat;
比Tomcat更轻便。
选择安装阿里开源的代码规约扫描插件:Alibaba Java Coding Guidelines,能规范大家代码风格,检测潜在的异常,提前发现问题。
activity-java活动业务包
activity-core活动核心包
common-core公共包
pepper-client花椒client包
pepper-statistics花椒统计监控包
pepperbus-client花椒消息总线client包
集成Code Review插件,方便代码审核;
CI/CD自动发布部署,项目.gitlab-ci.yml文件配置好后,当开发分支合并到测试分支,自动编译打包、运行测试用例、部署到测试环境,正式环境发布、回滚也是轻松在Web界面点击几个按钮完成;
集成Kubernetes。
使用OpenFeign作为成为一个轻量级REST API客户端,很方便访问其它http接口,加个配置Hystrix和一个熔断实现类就可以实现熔断;
使用SLF4J的MDC生成TraceId为了未来构建全链路监控做基础;
基于注解+ Springel + Redis实现防并发、幂等性等。
对外Gateway网关;
注册中心Euerka;
配置中心;
日志服务;
服务治理中心;
Wayne + Kubernetes容器化。
应用程序间通讯的中间层
轻量级网络代理
应用程序无感知
解耦应用程序的重试/超时、监控、追踪和服务发现