随着互联网浏览越来越大. 传统的 MVC 单一架构随着应用规模的不断扩大,应用模块不断增加,整个应用也显得越来越臃肿,维护起来也更加困难.
我们必须采取措施,按应用拆分,就是把原来的应用按照业务特点拆分成多个应用 。比如一个大型电商系统可能包含用户系统、商品系统、订单系统、评价系统等等,我们可以把他们独立出来形成一个个单独的应用 。多应用架构的特点是应用之间各自独立 ,不相互调用 。
多应用虽然解决了应用臃肿问题,但应用之间相互独立,有些共同的业务或代码无法复用 。
单一应用的解决方案
对于一个大型的互联网系统,一般会包含多个应用,而且应用之间往往还存在共同的业务,并且应用之间还存在调用关系 。除此之外 ,对于大型的互联网系统还有一些其它的挑战,比如如何应对急剧增长的用户,如何管理好研发团队快速迭代产品研发,如何保持产品升级更加稳定等等。
因此,为了使业务得到很好的复用,模块更加容易拓展和维护,我们希望业务与应用分离,某个业务不再属于一个应用,而是作为一个独立的服务单独进行维护 。应用本身不再是一个臃肿的模块堆积,而是由一个个模块化的服务组件组合而成 。
服务化
特点
那么采用服务化给有那些亮点的特色呢 ?
应用按业务拆分成服务
各个服务均可独立部署
服务可被多个应用共享
服务之间可以通信
架构上系统更加清晰
核心模块稳定,以服务组件为单位进行升级,避免了频繁发布带来的风险
开发管理方便
单独团队维护、工作分明,职责清晰
业务复用、代码复用
非常容易拓展
服务化面临的挑战
系统服务化之后, 增加了依赖关系复杂, 也会增加服务与服务之间交互的次数. 在 fpm 的开发模式下. 因为无法常驻内存给我们带来了, 每一次请求都要从零开始加载到退出进程, 增加了很多无用的开销, 数据库连接无法复用也得不到保护, 由于fpm是以进程为单位的fpm的进程数也决定了并发数, 这也是是fpm开发简单给我们带来的问题. 所以说为什么现在互联网平台JAVA比较流行了,.NET和php在这方面都不行 。PHP非内存常驻的就不用说了 。除此之外,还有很多其他问题需要解决 。
那么有没有好的方案呢?答案是有的,它就是-Swoft 。Swoft就是一个带有服务治理功能的RPC框架 。Swoft是首个 PHP常驻内存协程全栈框架, 基于高性能协程swoole打造的一个 PHP界的Spring Boot
Swoft 提供了类似 Dubbo 更为优雅的方式使用 RPC 服务, Swoft 性能是非常棒的有着类似Golang性能, 下面是 对Swoft 性能的压测情况.
文章插图
ab压力测试处理速度十分惊人, 在 i78代CPU, 16GB 内存下100000万个请求只用了5s时间在fpm开发模式下基本不可能达到. 这也足以证明Swoft` 的高性能和稳定性,
优雅的服务治理
服务注册与发现
微服务治理过程中,经常会涉及注册启动的服务到第三方集群,比如 consul / etcd 等等,以 Swoft 框架中使用 swoft-consul 组件,实现服务注册与发现为例 。
实现逻辑
<?php declare(strict_types=1);namespace AppCommon;use ReflectionException;use SwoftBeanAnnotationMappingBean;use SwoftBeanAnnotationMappingInject;use SwoftBeanExceptionContainerException;use SwoftConsulAgent;use SwoftConsulExceptionClientException;use SwoftConsulExceptionServerException;use SwoftRpcClientClient;use SwoftRpcClientContractProviderInterface;/** * Class RpcProvider * * @since 2.0 ** @Bean() */class RpcProvider implements ProviderInterface{/*** @Inject()** @var Agent*/private $agent;/*** @param Client $client** @return array* @throws ReflectionException* @throws ContainerException* @throws ClientException* @throws ServerException* @example* [*'host:port',*'host:port',*'host:port',* ]*/public function getList(Client $client): array{// Get health service from consul$services = $this->agent->services();$services = [];return $services;}}
服务熔断在分布式环境下,特别是微服务结构的分布式系统中, 一个软件系统调用另外一个远程系统是非常普遍的 。这种远程调用的被调用方可能是另外一个进程,或者是跨网路的另外一台主机, 这种远程的调用和进程的内部调用最大的区别是,远程调用可能会失败,或者挂起而没有任何回应,直到超时 。更坏的情况是, 如果有多个调用者对同一个挂起的服务进行调用,那么就很有可能的是一个服务的超时等待迅速蔓延到整个分布式系统,引起连锁反应, 从而消耗掉整个分布式系统大量资源 。最终可能导致系统瘫痪 。
推荐阅读
- nginx系列:常用利用shell统计日志
- 10行代码教你用python鉴黄
- 利用AOP自定义Redis缓存注解
- 教你如何选购红茶,如何选购玻璃茶具
- 删库一定要跑路吗?手把手教你MySQL数据恢复
- 教你一个万能的PPT排版小技巧,简单易学,而且什么场合都能用
- 小三找上门?5招教你优雅面对尴尬
- 教你普洱茶生茶的喝法,几种普洱茶的喝法
- 一款比phpmyadmin更好用的WEB数据库管理工具
- 康师傅废弃茶叶,废弃温州黄汤茶叶的再次利用