> 백엔드 개발 > PHP 문제 > PHP를 사용하여 마이크로서비스를 구현하는 방법은 무엇입니까?

PHP를 사용하여 마이크로서비스를 구현하는 방법은 무엇입니까?

慕斯
풀어 주다: 2023-03-10 17:48:01
앞으로
5245명이 탐색했습니다.

이 기사에서는 PHP를 사용하여 마이크로서비스를 구현하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP를 사용하여 마이크로서비스를 구현하는 방법은 무엇입니까?서비스 거버넌스에 대해 이야기하는 이유

인터넷 브라우징이 점점 더 커지면서 전통적인 MVC 단일 아키텍처는 애플리케이션의 규모가 지속적으로 확장되고 애플리케이션 모듈이 계속 증가하며 전체 애플리케이션은 점점 더 비대해지고 유지 관리도 어려워집니다.

애플리케이션별 분할, 즉 비즈니스 특성에 따라 원본 애플리케이션을 여러 애플리케이션으로 분할하는 조치를 취해야 합니다. 예를 들어 대규모 전자상거래 시스템에는 사용자 시스템, 제품 시스템, 주문 시스템, 평가 시스템 등이 포함될 수 있습니다. 이를 별도의 애플리케이션으로 분리할 수 있습니다. 다중 애플리케이션 아키텍처의 특징은 애플리케이션이 독립적이며 서로 호출하지 않는다는 것입니다.

여러 애플리케이션이 비대해진 애플리케이션 문제를 해결하지만 애플리케이션은 서로 독립적이며 일부 공통 비즈니스나 코드는 재사용할 수 없습니다.

단일 응용 프로그램 솔루션

대형 인터넷 시스템의 경우 일반적으로 여러 응용 프로그램이 포함되어 있으며 응용 프로그램 간에 공통 서비스가 있는 경우가 많으며 응용 프로그램 간에 호출 관계도 있습니다. 또한 대규모 인터넷 시스템에는 사용자의 급속한 성장을 처리하는 방법, 제품 개발을 빠르게 반복하기 위해 R&D 팀을 관리하는 방법, 제품 업그레이드를 보다 안정적으로 유지하는 방법 등 다른 과제도 있습니다.

따라서 비즈니스를 재사용하고 모듈을 쉽게 확장하고 유지 관리할 수 있도록 비즈니스와 애플리케이션을 분리하여 특정 비즈니스가 더 이상 애플리케이션에 속하지 않고 별도로 유지 관리되기를 바랍니다. 독립적인 서비스. 애플리케이션 자체는 더 이상 부풀려진 모듈 스택이 아니라 모듈식 서비스 구성 요소로 구성됩니다.

Serviceization

Features

그럼 Servitization 사용의 뛰어난 기능은 무엇인가요?服务化给有那些亮点的特色呢 ?

  • 应用按业务拆分成服务
  • 各个服务均可独立部署
  • 服务可被多个应用共享
  • 服务之间可以通信
  • 架构上系统更加清晰
  • 核心模块稳定,以服务组件为单位进行升级,避免了频繁发布带来的风险
  • 开发管理方便
  • 单独团队维护、工作分明,职责清晰
  • 业务复用、代码复用
  • 非常容易拓展

服务化面临的挑战

系统服务化之后, 增加了依赖关系复杂, 也会增加服务与服务之间交互的次数. 在 fpm 的开发模式下. 因为无法常驻内存给我们带来了, 每一次请求都要从零开始加载到退出进程, 增加了很多无用的开销, 数据库连接无法复用也得不到保护, 由于fpm是以进程为单位的fpm的进程数也决定了并发数, 这也是是fpm开发简单给我们带来的问题. 所以说为什么现在互联网平台Java比较流行了,.NETPHP在这方面都不行。PHP非内存常驻的就不用说了。除此之外,还有很多其他问题需要解决。

  • 服务越来越多,配置管理复杂
  • 服务间依赖关系复杂
  • 服务之间的负载均衡
  • 服务的拓展
  • 服务监控
  • 服务降级
  • 服务鉴权
  • 服务上线与下线
  • 服务文档 ......

你可以想象一下常驻内存给我们带来的好处 比如

  • 只启动框架初始化 如果常驻内存我们只是在启动的时候处理化框架初始化在内存中,专心处理请求

  • 连接复用,有些工程师并不能特别理解,如果不用连接池,来一个请求就发一个连接怎么样?这样就会导致后端资源连接过多。对一些基础服务来说,比如 Redis,数据库,连接是个昂贵的消耗。

那么有没有好的方案呢?答案是有的,而且很多人都在用这个框架,它就是-SwoftSwoft就是一个带有服务治理功能的RPC框架。Swoft是首个 PHP常驻内存协程全栈框架, 基于 Spring Boot

  • 비즈니스에 따라 애플리케이션을 서비스로 분할
  • 각 서비스 독립적으로 배포 가능
  • 여러 애플리케이션에서 서비스 공유 가능
  • 서비스 서로 통신 가능
  • 시스템이 구조적으로 더 명확함
  • 핵심 모듈은 안정적이며 서비스 구성 요소 단위로 업그레이드할 수 있어 잦은 릴리스로 인한 위험을 피할 수 있습니다.
  • 편리한 개발 및 관리
  • 별도의 팀 유지 관리, 명확한 작업 및 명확한 책임
  • li>
  • 비즈니스 재사용 및 코드 재사용
  • 확장이 매우 쉬움
서비타이제이션이 직면한 문제🎜🎜시스템 서비타이제이션 후 종속성이 더욱 복잡해짐 fpm 개발 모드에서는 메모리에 상주할 수 없기 때문에 프로세스가 종료될 때까지 각 요청을 처음부터 로드해야 하므로 서비스 간 상호 작용 수가 많이 늘어납니다. 쓸데없는 오버헤드가 발생하고 데이터베이스 연결을 재사용할 수 없으며 보호할 수도 없습니다. fpm은 프로세스를 기반으로 하기 때문에 fpm의 프로세스 수에 따라 이는 fpm 개발의 단순성으로 인해 발생하는 문제이기도 합니다. 그렇다면 현재 인터넷 플랫폼인 Java가 더 인기 있는 이유는 .NET입니다. code> 및 <code> PHP는 이와 관련하여 작동하지 않습니다. 말할 필요도 없이 PHP는 메모리에 상주하지 않습니다. 그 외에도 해결해야 할 문제가 많이 있습니다. 🎜
  • 서비스가 점점 더 많고 구성 관리가 복잡함
  • 서비스 간 종속성이 복잡함
  • 서비스 간 부하 분산
  • 서비스 확장
  • 서비스 모니터링
  • 서비스 다운그레이드
  • 서비스 인증
  • 서비스 온라인 및 오프라인
  • 서비스 문서 . .....
🎜상주 메모리가 우리에게 가져오는 이점은 다음과 같습니다. 🎜
  • 🎜프레임워크 초기화만 시작 메모리 기반 처리의 경우 시작 시 메모리에서 프레임워크만 초기화하고 요청 처리에만 집중합니다🎜
  • 🎜연결 재사용. 사용되지 않는데 요청이 오면 연결을 보내는 것은 어떻습니까? 이로 인해 백엔드 리소스 연결이 너무 많아집니다. Redis 및 데이터베이스와 같은 일부 기본 서비스의 경우 연결 비용이 많이 듭니다. 🎜
🎜그럼 좋은 계획은 없을까요? 대답은 '예'입니다. 많은 사람들이 이 프레임워크, 즉 Swoft를 사용하고 있습니다. Swoft서비스 거버넌스 기능을 갖춘 RPC 프레임워크입니다. SwoftSpring Boot🎜에서 제안한 구성에 대한 관례라는 핵심 개념을 기반으로 하는 최초의 PHP 상주 메모리 코루틴 풀 스택 프레임워크입니다.

SwoftDubbo와 유사한 RPC 서비스를 사용하는 보다 우아한 방법을 제공합니다. Swoft의 성능은 매우 뛰어납니다. 좋습니다. Golang 성능과 유사하게 다음은 내 PC에서 Swoft 성능에 대한 스트레스 테스트입니다. > 스트레스 테스트 i78 세대CPU의 처리 속도는 매우 놀랍습니다. 16GB 메모리는 100000<code>10,000개의 요청에만 5초기본적으로fpm개발 모드에서는 도달할 수 없는 시간입니다. 이는Swoft`,Swoft 提供了类似 Dubbo 更为优雅的方式使用 RPC 服务, Swoft 性能是非常棒的有着类似Golang性能, 下面是我的PCSwoft 性能的压测情况.

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
     * [
     *     &#39;host:port&#39;,
     *     &#39;host:port&#39;,
     *     &#39;host:port&#39;,
     * ]
     */
    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(&#39;Breaker exception&#39;);
    }    /**
     * @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 [&#39;requestLimiter2&#39;, $uri];
    }    
    /**
     * @param Request $request
     *
     * @return array
     */
    public function limiterFallback(Request $request): array
    {
        $uri = $request->getUriPath();        return [&#39;limiterFallback&#39;, $uri];
    }
}
로그인 후 복사

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

우아한 서비스 거버넌스

서비스 등록 및 검색

마이크로서비스 거버넌스 프로세스에는 종종 다음과 같은 타사 클러스터에 서비스를 등록하고 시작하는 작업이 포함됩니다. consul/etcd 잠깐, 이 장에서는 서비스 등록 및 검색을 구현하기 위한 예로 Swoft 프레임워크의 swoft-consul 구성 요소를 사용합니다.

구현 로직
<?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(&#39;application&#39;);        
        // 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(&#39;application&#39;);        
        // Print data
        var_dump($data);
    }
}
로그인 후 복사
로그인 후 복사

以上就是一个简单的 Apollo 配置拉取,Swoft-Apollo 除此方法外,还提供了更多的使用方法。

官方链接

  • Github
  • Doc
  • swoft-cloud/community

推荐学习:php视频教程

위 내용은 PHP를 사용하여 마이크로서비스를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿