单体架构也可叫单体系统或单体应用,是一种把系统所有的功能模块耦合在一个应用的架构方式。
从Java的角度看,有Spring全家桶一站式解决方案和相关的生态比较丰富(国外有GitHub,国内有Gitee,相应的开源框架非常多)。
从PHP的角度看,PHP是Web开发中最好的语言(至于为什么说它是Web开发中最好的语言,我想原因有三个,第一个是通吃方案(网站开发、App后端、小程序等);第二个许多国内外的网站建设都是基于PHP,早期的淘宝也是如此;第三个容易上手的。)
所有的技术选型都离不开一个基本的原则,那就是业务,分布式微服务技术选型也不例外,技术服务于业务,合适的技术框架对业务支撑非常关键。我在2020年写过这样一篇文章,其中关于对技术的思考提到过,感兴趣的朋友可以阅读这篇文章:
2020年的一些思考和总结:
https://www.cnblogs.com/youcong/p/13779683.html
以我曾经在某创业公司对EduSoho二次开发为例:
从业务相关性的角度,当时我们做的是编程教育项目,EduSoho是一个在线教育解决方案,业务性与我们完美契合。
从框架流行度,EduSoho是基于PHP开发,前面我提到过PHP是Web开发最好的语言,而EduSoho使用的PHP框架是Symfony,Symfony的框架流行度,以GitHub下图为例说明:
从中可以看出该框架非常流行,start非常多。
从学习曲线来看,我觉得Symfony还是蛮简单,感兴趣的朋友,可以参考我这篇文章学习:
Symfony之入门学习:
https://www.cnblogs.com/youcong/p/11143879.html
只要熟悉Symfony,二次开发EduSoho并不难。
从文档上来看,Symfony框架资料非常多(网上有各种各样的博文),对应的EduSoho官网方面的资料也非常多。
从社区支持上来看,如果Symfony出现任何问题,通过搜索引擎不能解决的话,可以去GitHub给开源维护者提issue,详细说明问题,一般都能得到回答(前提把问题说清楚,英文不会也不怕,可以借助翻译工具)。
从单元测试上来看,Symfony本身就支持单元测试,不仅仅是PHP相关的框架,Java和Go对应的Web开发框架均支持单元测试。
从可扩展性上来看,Symfony发展至今能有这么多关注(前面的Github截图),说明国内外有不少公司在用它,只要很多公司在用可扩展性自然不差(可扩展性指能适应业务的变化)。
从许可证上来看,EduSoho减少当时我们编程教育项目的从0到1开发的时间,只要项目能够盈利,花钱买许可证也是没问题的,结果我们在C城果然拿下了第一笔订单。
组件化是一种高效的处理复杂应用系统,更好地明确功能模块作用的方式。目的是为了解耦,把复杂系统拆分成多个组件,分离组件边界和责任,便于独立升级和维护。
这里只列举两个例子(实际的例子非常多):
我的回答是只能慢慢来,一点点慢慢抽取出来(一定要在读懂代码的前提下进行),封装为组件,组件可按照功能区分(公共组件、通信组件、日志组件、权限组件、具体业务组件等)。
另外还有一点,二次开发和老项目的组件化是相通的,如下:
分布式是指数据和程序可以不位于一个服务器上,而是分散到多个服务器,以网络上分散分布的地理信息数据及受其影响的数据库操作为研究对象的一种理论计算模型。
之所以要用分布式,最关键的是服务器性能问题,单台服务器性能比较有限,综合利用多台服务器,能够提高整体的性能。
分布式要考虑的问题有如下:
简而言之可以概括为两大问题,一个是数据的一致性,另一个是服务的稳定性。
集群是指一组独立的计算机系统构成的一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信。应用程序可以通过网络共享内存进行消息传送,实现分布式计算功能。通俗一点来说,就是让若干台计算机联合起来工作(服务),可以是并行的,也可以是做备份。
之所以要集群,是因为如下三个方面:
集群需要考虑哪些问题( 最关键的是:是否有必要集群 )?
微服务架构指的是将大型复杂系统按功能或者业务需求垂直切分成更小的子系统,这些子系统以独立部署的子进程存在,它们之间通过轻量级的、跨语言的同步(比如REST,gRPC)或者异步(消息)网络调用进行通信。
对于Java而言技术选型组合如下:
上面这三种是比较常见的。
当然了,分布式微服务的技术选型不局限某一类编程语言。
以我当初在某创业公司做的编程教育平台项目为例,涉及的编程语言就有四个,分别为Python、Java、PHP、JavaScript(Node.js、Vue.js、TypeScript等)。至于这些编程语言所涉及的框架组件就更多了。对我在创业公司做项目经历感兴趣的朋友可以阅读我的这篇文章: 一位北漂在创业公司的两年
从单体架构到分布式微服务架构,基本上我都参与了,有从0到1,也有二次开发,还有从1到2再到3的版本迭代。所遇到的问题很多很多,当时在做这些设计方案的时候,有很多都没有考虑周到,导致最后代码落地的时候非常糟,这些都是教训,接下来我会将这些教训一一总结然后分享出去。