이 기사에서는 PHP를 사용하여 마이크로서비스를 구현하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
서비스 거버넌스에 대해 이야기하는 이유
인터넷 브라우징이 점점 더 커지면서 전통적인 MVC 단일 아키텍처는 애플리케이션의 규모가 지속적으로 확장되고 애플리케이션 모듈이 계속 증가하며 전체 애플리케이션은 점점 더 비대해지고 유지 관리도 어려워집니다.
애플리케이션별 분할, 즉 비즈니스 특성에 따라 원본 애플리케이션을 여러 애플리케이션으로 분할하는 조치를 취해야 합니다. 예를 들어 대규모 전자상거래 시스템에는 사용자 시스템, 제품 시스템, 주문 시스템, 평가 시스템 등이 포함될 수 있습니다. 이를 별도의 애플리케이션으로 분리할 수 있습니다. 다중 애플리케이션 아키텍처의 특징은 애플리케이션이 독립적이며 서로 호출하지 않는다는 것입니다.
여러 애플리케이션이 비대해진 애플리케이션 문제를 해결하지만 애플리케이션은 서로 독립적이며 일부 공통 비즈니스나 코드는 재사용할 수 없습니다.
대형 인터넷 시스템의 경우 일반적으로 여러 응용 프로그램이 포함되어 있으며 응용 프로그램 간에 공통 서비스가 있는 경우가 많으며 응용 프로그램 간에 호출 관계도 있습니다. 또한 대규모 인터넷 시스템에는 사용자의 급속한 성장을 처리하는 방법, 제품 개발을 빠르게 반복하기 위해 R&D 팀을 관리하는 방법, 제품 업그레이드를 보다 안정적으로 유지하는 방법 등 다른 과제도 있습니다.
따라서 비즈니스를 재사용하고 모듈을 쉽게 확장하고 유지 관리할 수 있도록 비즈니스와 애플리케이션을 분리하여 특정 비즈니스가 더 이상 애플리케이션에 속하지 않고 별도로 유지 관리되기를 바랍니다. 독립적인 서비스. 애플리케이션 자체는 더 이상 부풀려진 모듈 스택이 아니라 모듈식 서비스 구성 요소로 구성됩니다.
그럼 Servitization
사용의 뛰어난 기능은 무엇인가요?服务化
给有那些亮点的特色呢 ?
系统服务化之后, 增加了依赖关系复杂, 也会增加服务与服务之间交互的次数. 在 fpm
的开发模式下. 因为无法常驻内存给我们带来了, 每一次请求都要从零开始加载到退出进程, 增加了很多无用的开销, 数据库连接无法复用也得不到保护, 由于fpm
是以进程为单位的fpm
的进程数也决定了并发数, 这也是是fpm
开发简单给我们带来的问题. 所以说为什么现在互联网平台Java
比较流行了,.NET
和PHP
在这方面都不行。PHP非内存常驻
的就不用说了。除此之外,还有很多其他问题需要解决。
你可以想象一下常驻内存给我们带来的好处 比如
只启动框架初始化 如果常驻内存我们只是在启动的时候处理化框架初始化在内存中,专心处理请求
连接复用,有些工程师并不能特别理解,如果不用连接池,来一个请求就发一个连接怎么样?这样就会导致后端资源连接过多。对一些基础服务来说,比如 Redis,数据库,连接是个昂贵的消耗。
那么有没有好的方案呢?答案是有的,而且很多人都在用这个框架,它就是-Swoft
。Swoft
就是一个带有服务治理
功能的RPC框架。Swoft
是首个 PHP常驻内存协程全栈框架, 基于 Spring Boot
fpm
개발 모드에서는 메모리에 상주할 수 없기 때문에 프로세스가 종료될 때까지 각 요청을 처음부터 로드해야 하므로 서비스 간 상호 작용 수가 많이 늘어납니다. 쓸데없는 오버헤드가 발생하고 데이터베이스 연결을 재사용할 수 없으며 보호할 수도 없습니다. fpm
은 프로세스를 기반으로 하기 때문에 fpm
의 프로세스 수에 따라 이는 fpm
개발의 단순성으로 인해 발생하는 문제이기도 합니다. 그렇다면 현재 인터넷 플랫폼인 Java
가 더 인기 있는 이유는 .NET입니다. code> 및 <code> PHP
는 이와 관련하여 작동하지 않습니다. 말할 필요도 없이 PHP는 메모리에 상주하지 않습니다
. 그 외에도 해결해야 할 문제가 많이 있습니다. 🎜Swoft
를 사용하고 있습니다. Swoft
는 서비스 거버넌스
기능을 갖춘 RPC 프레임워크입니다. Swoft
는 Spring Boot
🎜에서 제안한 구성에 대한 관례라는 핵심 개념을 기반으로 하는 최초의 PHP 상주 메모리 코루틴 풀 스택 프레임워크입니다.Swoft
는 Dubbo
와 유사한 RPC
서비스를 사용하는 보다 우아한 방법을 제공합니다. Swoft
의 성능은 매우 뛰어납니다. 좋습니다. Golang
성능과 유사하게 다음은 내 PC
에서 Swoft
성능에 대한 스트레스 테스트입니다. > 스트레스 테스트 i78 세대
CPU의 처리 속도는 매우 놀랍습니다. 16GB
메모리는 100000<code>10,000개의 요청에만
5초기본적으로fpm개발 모드에서는 도달할 수 없는 시간입니다. 이는
Swoft`,Swoft
提供了类似 Dubbo
更为优雅的方式使用 RPC
服务, Swoft
性能是非常棒的有着类似Golang
性能, 下面是我的PC
对Swoft
性能的压测情况.
ab
压力测试处理速度十分惊人, 在 i78代
CPU, 16GB
内存下
100000万个请求只用了
5s时间在
fpm开发模式下基本不可能达到. 这也足以证明
Swoft` 的高性能和稳定性,
微服务治理过程中,经常会涉及注册启动的服务到第三方集群,比如 consul / etcd 等等,本章以 Swoft 框架中使用 swoft-consul 组件,实现服务注册与发现为例。
实现逻辑
<?php declare(strict_types=1);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
的熔断器可以用于任何场景, 例如 服务调用的时候使用, 请求第三方的时候都可以对它进行熔断降级
<?php declare(strict_types=1);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 里面的方法,可以控制方法的访问速率。这里以下面使用示例详解
<?php declare(strict_types=1);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
분산 환경, 특히 마이크로서비스 구조의 분산 시스템에서는 소프트웨어 시스템이 다른 원격 시스템을 호출하는 경우가 매우 일반적입니다. 이 원격 호출의 수신자는 다른 프로세스이거나 네트워크의 다른 호스트일 수 있습니다. 이 원격 호출과 프로세스 내부 호출의 가장 큰 차이점은 원격 호출이 시간 초과될 때까지 응답이 없을 수 있다는 것입니다. 더 나쁜 것은 여러 호출자가 일시 중단된 동일한 서비스를 호출하면 서비스의 시간 초과 대기가 전체 분산 시스템으로 빠르게 확산되어 연쇄 반응을 일으키고 전체 분산 시스템을 소비할 가능성이 매우 높다는 것입니다. 결국 시스템 오류로 이어질 수 있습니다. 서킷 브레이커 모드는 분산 시스템에서 이러한 폭포수 같은 연쇄 반응으로 인한 재난을 방지하는 모드입니다. 기본 차단기 모드에서는 차단기가 개방 상태일 때 보호 공급자가 호출되지 않도록 보장하지만 공급자가 서비스를 재개한 후 회로 차단기를 재설정하기 위한 추가 조치도 필요합니다. 가능한 접근 방식은 회로 차단기가 공급자의 서비스가 복원되었는지 여부를 주기적으로 감지하고, 복원되면 상태를 닫힘으로 설정하는 것입니다. 재시도 시 회로 차단기는 반개방 상태입니다. 퓨즈 사용은 간단하고 강력합니다.<?php declare(strict_types=1);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); } }서비스 회로 차단기
Swoft
퓨즈는 서비스를 요청할 때와 같은 모든 시나리오에서 사용할 수 있습니다. 제3자, 회로 차단기를 다운그레이드할 수 있습니다rrreee
서비스 전류 제한🎜🎜전류 제한, 회로 차단기, 다운그레이드 이것은 정말 중요하기 때문에 여러 번 강조해도 지나치지 않습니다. 서비스가 실패하면 퓨즈를 분리해야 합니다. 전류 제한은 자신을 보호하는 가장 큰 도구입니다. 자체 보호 메커니즘이 없으면 연결 수에 관계없이 허용됩니다. 백엔드가 이를 처리할 수 없으면 트래픽이 매우 클 때 프런트엔드가 확실히 중단됩니다. . 🎜🎜현재 제한은 반짝 세일, 급매 상품 등 부족한 리소스에 액세스할 때 동시성 및 요청 수를 제한하여 피크를 효과적으로 줄이고 트래픽 곡선을 부드럽게 하는 것입니다. 전류 제한의 목적은 동시 액세스 및 동시 요청 비율을 제한하거나, 비율 제한에 도달하거나 초과하면 서비스가 거부되거나 대기열에 들어갈 수 있도록 일정 기간 내 요청 비율을 제한하는 것입니다. 그리고 기다렸다. 🎜🎜Swoft
전류 제한기의 하단 레이어는 토큰 버킷 알고리즘을 사용하고 하단 레이어는 Redis
를 사용하여 분산 전류 제한을 구현합니다. 🎜🎜Swoft 속도 제한기는 현재 컨트롤러를 제한할 수 있을 뿐만 아니라 모든 Bean의 메서드를 제한하고 메서드의 액세스 속도를 제어할 수도 있습니다. 다음 사용 예와 함께 자세한 설명이 나와 있습니다. 🎜rrreee🎜key 이는 symfony/expression-언어
표현식을 지원합니다. 속도가 제한되면 에 정의된 <code>limiterFallback
이 지원됩니다. fallback이 호출됩니다. 메소드 🎜🎜Configuration Center🎜🎜 구성 센터에 대해 이야기하기 전에 구성 파일에 대해 이야기해 보겠습니다. 이는 프로그램의 내용을 동적으로 수정하는 기능을 제공합니다. 실행 기능. 다른 사람의 말을 인용하자면: 🎜🎜🎜시스템 런타임 중 비행 자세를 동적으로 조정합니다! 🎜🎜🎜빠르게 날아가는 비행기에서 부품을 수리하는 일을 할 수도 있겠네요. 우리 인간은 항상 모든 것을 통제하고 예측할 수는 없습니다. 우리 시스템의 경우 시스템 방향(예: 그레이스케일 제어, 전류 제한 조정)을 제어해야 할 때 조정을 위해 일부 제어 라인을 항상 예약해야 합니다. 이는 변화를 수용하는 인터넷 산업에 특히 중요합니다. 🎜🎜독립형 버전의 경우 구성(파일)이라고 하고, 분산형 클러스터 시스템의 경우 구성 센터(시스템)라고 합니다. 🎜🎜분산형 구성 센터란 정확히 무엇인가요? 🎜🎜 비즈니스, 마이크로서비스 아키텍처가 업그레이드됨에 따라 서비스 및 프로그램 구성의 수가 증가하고(다양한 마이크로서비스, 다양한 서버 주소, 다양한 매개변수) 기존 구성 파일 방법 및 데이터베이스 방법은 더 이상 구성 관리에 대한 개발자의 요구 사항을 충족할 수 없습니다. 🎜因此,我们需要配置中心来统一管理配置!把业务开发者从复杂以及繁琐的配置中解脱出来,只需专注于业务代码本身,从而能够显著提升开发以及运维效率。同时将配置和发布包解藕也进一步提升发布的成功率,并为运维的细力度管控、应急处理等提供强有力的支持。
关于分布式配置中心,网上已经有很多开源的解决方案,例如:
Apollo是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
本章以Apollo
为例,从远端配置中心拉取配置以及安全重启服务。如果对 Apollo
不熟悉,可以先看Swoft
扩展 Apollo
组件以及阅读 Apollo
官方文档。
本章以 Swoft
中使用 Apollo
为例,当 Apollo
配置变更后,重启服务(http-server / rpc-server/ ws-server)。如下是一个 agent 例子:
<?php declare(strict_types=1);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 配置拉取,Swoft-Apollo
除此方法外,还提供了更多的使用方法。
推荐学习:php视频教程
위 내용은 PHP를 사용하여 마이크로서비스를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!