随着互联网浏览越来越大. 传统的 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 组件,实现服务注册与发现为例。

实现逻辑

namespace App\Common;

use ReflectionException;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Bean\Annotation\Mapping\Inject;

use Swoft\Bean\Exception\ContainerException;

use Swoft\Consul\Agent;

use Swoft\Consul\Exception\ClientException;

use Swoft\Consul\Exception\ServerException;

use Swoft\Rpc\Client\Client;

use Swoft\Rpc\Client\Contract\ProviderInterface;

/*** 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;

}

}

服务熔断

在分布式环境下,特别是微服务结构的分布式系统中, 一个软件系统调用另外一个远程系统是非常普遍的。这种远程调用的被调用方可能是另外一个进程,或者是跨网路的另外一台主机, 这种远程的调用和进程的内部调用最大的区别是,远程调用可能会失败,或者挂起而没有任何回应,直到超时。更坏的情况是, 如果有多个调用者对同一个挂起的服务进行调用,那么就很有可能的是一个服务的超时等待迅速蔓延到整个分布式系统,引起连锁反应, 从而消耗掉整个分布式系统大量资源。最终可能导致系统瘫痪。

断路器(Circuit Breaker)模式就是为了防止在分布式系统中出现这种瀑布似的连锁反应导致的灾难。

基本的断路器模式下,保证了断路器在open状态时,保护supplier不会被调用, 但我们还需要额外的措施可以在supplier恢复服务后,可以重置断路器。一种可行的办法是断路器定期探测supplier的服务是否恢复, 一但恢复, 就将状态设置成close。断路器进行重试时的状态为半开(half-open)状态。

熔断器的使用想到简单且功能强大,使用一个 @Breaker 注解即可,Swoft 的熔断器可以用于任何场景, 例如 服务调用的时候使用, 请求第三方的时候都可以对它进行熔断降级

namespace App\Model\Logic;

use Exception;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Breaker\Annotation\Mapping\Breaker;

/*** Class BreakerLogic** @since 2.0** @Bean()*/

class BreakerLogic

{

/*** @Breaker(fallback="loopFallback")** @return string* @throws Exception*/

public function loop(): string

{

// Do something throw new Exception('Breaker exception');

}

/*** @return string* @throws Exception*/

public function loopFallback(): string

{

// Do something }

}

限流、熔断、降级这个强调多少遍都不过分,因为确实很重要。服务不行的时候一定要熔断。限流是一个保护自己最大的利器,如果没有自我保护机制,不管有多少连接都会接收,如果后端处理不过来,前端流量又很大的时候肯定就挂了。

限流是对稀缺资源访问时,比如秒杀,抢购的商品时,来限制并发和请求的数量,从而有效的进行削峰并使得流量曲线平滑。限流的目的是对并发访问和并发请求进行限速,或者一个时间窗口内请求进行限速从而来保护系统,一旦达到或超过限制速率就可以拒绝服务,或者进行排队等待等。

Swoft 限流器底层采用的是令牌桶算法,底层依赖于 Redis 实现分布式限流。

Swoft 限速器不仅可以限流控制器,也可以限制任何 bean 里面的方法,可以控制方法的访问速率。这里以下面使用示例详解

namespace App\Model\Logic;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Limiter\Annotation\Mapping\RateLimiter;

/*** Class LimiterLogic** @since 2.0** @Bean()*/

class LimiterLogic

{

/*** @RequestMapping()* @RateLimiter(rate=20, fallback="limiterFallback")** @param Request $request** @return array*/

public function requestLimiter2(Request $request): array

{

$uri = $request->getUriPath();

return ['requestLimiter2', $uri];

}

/*** @param Request $request** @return array*/

public function limiterFallback(Request $request): array

{

$uri = $request->getUriPath();

return ['limiterFallback', $uri];

}

}

key 这里支持symfony/expression-language表达式, 如果被限速会调用fallback中定义的limiterFallback方法

说起配置中心前我们先说说配置文件,我们并不陌生,它提供我们可以动态修改程序运行能力。引用别人的一句话就是:

系统运行时(runtime)飞行姿态的动态调整!

我可以把我们的工作称之为在快速飞行的飞机上修理零件。我们人类总是无法掌控和预知一切。对于我们系统来说,我们总是需要预留一些控制线条,以便在我们需要的时候做出调整,控制系统方向(如灰度控制、限流调整),这对于拥抱变化的互联网行业尤为重要。

对于单机版,我们称之为配置(文件);对于分布式集群系统,我们称之为配置中心(系统);

到底什么是分布式配置中心

随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求:

安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏;

时效性:修改配置,需要重启服务才能生效;

局限性:无法支持动态调整:例如日志开关、功能开关;

因此,我们需要配置中心来统一管理配置!把业务开发者从复杂以及繁琐的配置中解脱出来,只需专注于业务代码本身,从而能够显著提升开发以及运维效率。同时将配置和发布包解藕也进一步提升发布的成功率,并为运维的细力度管控、应急处理等提供强有力的支持。

关于分布式配置中心,网上已经有很多开源的解决方案,例如:

Apollo是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。

以Apollo 为例,从远端配置中心拉取配置以及安全重启服务。如果对 Apollo 不熟悉,可以先看Swoft 扩展 Apollo 组件以及阅读 Apollo 官方文档。

以 Swoft 中使用 Apollo 为例,当 Apollo 配置变更后,重启服务(http-server / rpc-server/ ws-server)。如下是一个 agent 例子:

namespace App\Model\Logic;

use Swoft\Apollo\Config;

use Swoft\Apollo\Exception\ApolloException;

use Swoft\Bean\Annotation\Mapping\Bean;

use Swoft\Bean\Annotation\Mapping\Inject;

/*** Class ApolloLogic** @since 2.0** @Bean()*/

class ApolloLogic

{

/*** @Inject()** @var Config*/

private $config;

/*** @throws ApolloException*/

public function pull(): void

{

$data = $this->config->pull('application');

// Print data var_dump($data);

}

}

以上就是一个简单的 Apollo 配置拉取,

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要戳这里

list.action.php,教你利用 PHP 实现高性能微服务部署相关推荐

  1. java 熔断机制_利用Spring Cloud实现微服务- 熔断机制

    2. 代码实现及验证 本次代码实现对RestTemplate和Feign两种微服务调用场景下,使用Hystrix验证Spring Cloud的熔断机制. 2.1 RestTemplate的微服务调用场 ...

  2. 利用Diferencia和Java微服务进行分接比较测试

    本文要点 在微服务体系结构中,许多服务可能同时在(相对)独立地演化,而且通常非常迅速.要获得这种架构风格的全部价值,服务必须能够独立发布. 通常很难验证新服务(或服务的新版本)没有对当前的应用程序造成 ...

  3. 马蜂窝如何利用 APISIX 网关实现微服务架构升级

    作者:董红帅,马蜂窝微服务体系建设以及基础服务能力建设专家. 马蜂窝作为旅行社交平台,是数据驱动的新型旅行电商.基于十余年的内容积累,马蜂窝通过 AI 技术与大数据算法,将个性化旅行信息与来自全球各地 ...

  4. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统. 项目完整源码下载 https://github ...

  5. 利用ogg微服务版将oracle同步到kafka

    ogg微服务版可以再界面上配置抽取.复制进程,不必进入到shell中进行配置,并且图形化界面可以看到更多信息. 系统架构 源端安装ogg for oracle 19C , 目标端安装ogg for b ...

  6. 24岁秃头程序员教你微服务交付下如何持续集成交付,学不会砍我

    微服务如何持续集成交付 在微服务架构下,每一个微服务都是职责单一的,可独立部署单元,但是众多分散的微服务也带来了代码共享.微服务功能依赖.版本管理等复杂问题,微服务需要解决配置管理.服务持续集成.持续 ...

  7. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)......

    手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 原文: 手把手0基础项目实战(一)--教你搭建一套可自动化构 ...

  8. 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)

    2019独角兽企业重金招聘Python工程师标准>>> 本文你将学到什么? 本文将以原理+实战的方式,首先对"微服务"相关的概念进行知识点扫盲,然后开始手把手教你 ...

  9. 华为表哥手把手教你利用Jenkins持续集成iOS项目,教不会我花式拉翔!!!

    手把手教你利用Jenkins持续集成iOS项目: 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了一个APP ...

最新文章

  1. 使用Truffle时遇到的问题和解决方法
  2. Python新型字符串格式漏洞分析
  3. Farbic区块链PHP SDK
  4. 27行代码AC_迷宫 2017年第八届蓝桥杯A组第一题(暴力、仿迷宫)
  5. 创新工场董事长兼首席执行官 李开复 发 言 稿
  6. Atcoder 084D - Small Multiple(最短路径+思维)
  7. C#实现二维码功能,winform 以及 asp.net均可以用
  8. c语言火车票管理系统360问答,C语言 车票管理系统 前面一点点的程序,不知道报错是什么意思,可以解释一下吗?代码的具体问题是什么...
  9. 2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
  10. SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
  11. C++ STL string字符串替换 replace函数的使用
  12. https 单向认证和双向认证配置
  13. 2021-2022 AI工程师薪水趋势:美国、印度、加拿大等
  14. python写的串口助手_Python实现的简单的单片机串口助手程序
  15. doxygen 注释规范_Doxygen简明注释语法
  16. 单片机led灯闪烁实验总结_这样处理家中LED灯和节能灯关了还是微亮或闪烁的故障...
  17. C++剖析 cout<<“hello world“<<endl;
  18. 【适配】521- 移动端开发各种兼容适配问题(屏幕、图像、字体与布局等)
  19. 微软office即点即用服务能关闭吗?_技术贴:关于OFFICE各版本的下载安装卸载以及激活方法大全...
  20. 互联网站规划与设计.txt

热门文章

  1. 第七课、Qt中的坐标系统------------------狄泰软件学院
  2. Spring Boot集成Jasypt安全框架
  3. java 浅拷贝和深拷贝
  4. MYSQL 添加外键报错
  5. iOS游戏开发教程资源
  6. 我所有的博客都在这里了,拿出来晒晒~~
  7. 从程序详解拒绝服务***
  8. MVC UpdateModel的未能更新XXXXX的类型模型
  9. 网页中嵌入Excel控件
  10. PHP的SAPI【web server与应用程序沟通的标准泛称】:CGI、FastCGI 【web server与应用程序的具体标准】及其对应程序PHP-CGI PHP-FPM【具体的程序应用】