PHP實現(xiàn)微服務(wù)的方法是什么

這篇文章主要介紹“ PHP 實現(xiàn)微服務(wù)的方法是什么”,在日常操作中,相信很多人在 PHP 實現(xiàn)微服務(wù)的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答” PHP 實現(xiàn)微服務(wù)的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元紅塔做網(wǎng)站,已為上家服務(wù),為紅塔各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

隨著互聯(lián)網(wǎng)瀏覽越來越大. 傳統(tǒng)的 MVC 單一架構(gòu)隨著應(yīng)用規(guī)模的不斷擴(kuò)大,應(yīng)用模塊不斷增加,整個應(yīng)用也顯得越來越臃腫,維護(hù)起來也更加困難.

我們必須采取措施,按應(yīng)用拆分,就是把原來的應(yīng)用按照業(yè)務(wù)特點拆分成多個應(yīng)用。比如一個大型電商系統(tǒng)可能包含用戶系統(tǒng)、商品系統(tǒng)、訂單系統(tǒng)、評價系統(tǒng)等等,我們可以把他們獨立出來形成一個個單獨的應(yīng)用。多應(yīng)用架構(gòu)的特點是應(yīng)用之間各自獨立 ,不相互調(diào)用。

多應(yīng)用雖然解決了應(yīng)用臃腫問題,但應(yīng)用之間相互獨立,有些共同的業(yè)務(wù)或代碼無法復(fù)用。

單一應(yīng)用的解決方案

對于一個大型的互聯(lián)網(wǎng)系統(tǒng),一般會包含多個應(yīng)用,而且應(yīng)用之間往往還存在共同的業(yè)務(wù),并且應(yīng)用之間還存在調(diào)用關(guān)系。除此之外 ,對于大型的互聯(lián)網(wǎng)系統(tǒng)還有一些其它的挑戰(zhàn),比如如何應(yīng)對急劇增長的用戶,如何管理好研發(fā)團(tuán)隊快速迭代產(chǎn)品研發(fā),如何保持產(chǎn)品升級更加穩(wěn)定等等 。

因此,為了使業(yè)務(wù)得到很好的復(fù)用,模塊更加容易拓展和維護(hù),我們希望業(yè)務(wù)與應(yīng)用分離,某個業(yè)務(wù)不再屬于一個應(yīng)用,而是作為一個獨立的服務(wù)單獨進(jìn)行維護(hù)。應(yīng)用本身不再是一個臃腫的模塊堆積,而是由一個個模塊化的服務(wù)組件組合而成。

服務(wù)化

特點

那么采用服務(wù)化給有那些亮點的特色呢 ?

  • 應(yīng)用按業(yè)務(wù)拆分成服務(wù)

  • 各個服務(wù)均可獨立部署

  • 服務(wù)可被多個應(yīng)用共享

  • 服務(wù)之間可以通信

  • 架構(gòu)上系統(tǒng)更加清晰

  • 核心模塊穩(wěn)定,以服務(wù)組件為單位進(jìn)行升級,避免了頻繁發(fā)布帶來的風(fēng)險

  • 開發(fā)管理方便

  • 單獨團(tuán)隊維護(hù)、工作分明,職責(zé)清晰

  • 業(yè)務(wù)復(fù)用、代碼復(fù)用

  • 非常容易拓展

服務(wù)化面臨的挑戰(zhàn)

系統(tǒng)服務(wù)化之后, 增加了依賴關(guān)系復(fù)雜, 也會增加服務(wù)與服務(wù)之間交互的次數(shù). 在 fpm 的開發(fā)模式下. 因為無法常駐內(nèi)存給我們帶來了, 每一次請求都要從零開始加載到退出進(jìn)程, 增加了很多無用的開銷, 數(shù)據(jù)庫連接無法復(fù)用也得不到保護(hù), 由于fpm是以進(jìn)程為單位的fpm的進(jìn)程數(shù)也決定了并發(fā)數(shù), 這也是是fpm開發(fā)簡單給我們帶來的問題. 所以說為什么現(xiàn)在互聯(lián)網(wǎng)平臺Java比較流行了,.NETPHP在這方面都不行。PHP非內(nèi)存常駐的就不用說了。除此之外,還有很多其他問題需要解決。

  • 服務(wù)越來越多,配置管理復(fù)雜

  • 服務(wù)間依賴關(guān)系復(fù)雜

  • 服務(wù)之間的負(fù)載均衡

  • 服務(wù)的拓展

  • 服務(wù)監(jiān)控

  • 服務(wù)降級

  • 服務(wù)鑒權(quán)

  • 服務(wù)上線與下線

  • 服務(wù)文檔 ......

你可以想象一下常駐內(nèi)存給我們帶來的好處 比如

  • 只啟動框架初始化如果常駐內(nèi)存我們只是在啟動的時候處理化框架初始化在內(nèi)存中,專心處理請求

  • 連接復(fù)用,有些工程師并不能特別理解,如果不用連接池,來一個請求就發(fā)一個連接怎么樣?這樣就會導(dǎo)致后端資源連接過多。對一些基礎(chǔ)服務(wù)來說,比如 redis,數(shù)據(jù)庫,連接是個昂貴的消耗。

那么有沒有好的方案呢?答案是有的,而且很多人都在用這個框架,它就是-Swoft。Swoft就是一個帶有服務(wù)治理功能的RPC框架。Swoft是首個 PHP常駐內(nèi)存協(xié)程全??蚣? 基于 Spring Boot提出的約定大于配置的核心理念

Swoft 提供了類似 Dubbo 更為優(yōu)雅的方式使用 RPC 服務(wù), Swoft 性能是非常棒的有著類似Golang性能, 下面是我的PCSwoft 性能的壓測情況.

ab壓力測試處理速度十分驚人, 在 i78代CPU, 16GB 內(nèi)存100000萬個請求只用了5s時間在fpm開發(fā)模式下基本不可能達(dá)到. 這也足以證明Swoft` 的高性能和穩(wěn)定性,

優(yōu)雅的服務(wù)治理

服務(wù)注冊與發(fā)現(xiàn)

微服務(wù)治理過程中,經(jīng)常會涉及注冊啟動的服務(wù)到第三方集群,比如 consul / etcd 等等,本章以 Swoft 框架中使用 swoft-consul 組件,實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)為例。

實現(xiàn)邏輯

<?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;
    }
}

服務(wù)熔斷

在分布式環(huán)境下,特別是微服務(wù)結(jié)構(gòu)的分布式系統(tǒng)中, 一個軟件系統(tǒng)調(diào)用另外一個遠(yuǎn)程系統(tǒng)是非常普遍的。這種遠(yuǎn)程調(diào)用的被調(diào)用方可能是另外一個進(jìn)程,或者是跨網(wǎng)路的另外一臺主機, 這種遠(yuǎn)程的調(diào)用和進(jìn)程的內(nèi)部調(diào)用最大的區(qū)別是,遠(yuǎn)程調(diào)用可能會失敗,或者掛起而沒有任何回應(yīng),直到超時。更壞的情況是, 如果有多個調(diào)用者對同一個掛起的服務(wù)進(jìn)行調(diào)用,那么就很有可能的是一個服務(wù)的超時等待迅速蔓延到整個分布式系統(tǒng),引起連鎖反應(yīng), 從而消耗掉整個分布式系統(tǒng)大量資源。最終可能導(dǎo)致系統(tǒng)癱瘓。

斷路器(Circuit Breaker)模式就是為了防止在分布式系統(tǒng)中出現(xiàn)這種瀑布似的連鎖反應(yīng)導(dǎo)致的災(zāi)難。

基本的斷路器模式下,保證了斷路器在open狀態(tài)時,保護(hù)supplier不會被調(diào)用, 但我們還需要額外的措施可以在supplier恢復(fù)服務(wù)后,可以重置斷路器。一種可行的辦法是斷路器定期探測supplier的服務(wù)是否恢復(fù), 一但恢復(fù), 就將狀態(tài)設(shè)置成close。斷路器進(jìn)行重試時的狀態(tài)為半開(half-open)狀態(tài)。

熔斷器的使用想到簡單且功能強大,使用一個 @Breaker 注解即可,Swoft 的熔斷器可以用于任何場景, 例如 服務(wù)調(diào)用的時候使用, 請求第三方的時候都可以對它進(jìn)行熔斷降級

<?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
    }
}

服務(wù)限流

限流、熔斷、降級這個強調(diào)多少遍都不過分,因為確實很重要。服務(wù)不行的時候一定要熔斷。限流是一個保護(hù)自己最大的利器,如果沒有自我保護(hù)機制,不管有多少連接都會接收,如果后端處理不過來,前端流量又很大的時候肯定就掛了。

限流是對稀缺資源訪問時,比如秒殺,搶購的商品時,來限制并發(fā)和請求的數(shù)量,從而有效的進(jìn)行削峰并使得流量曲線平滑。限流的目的是對并發(fā)訪問和并發(fā)請求進(jìn)行限速,或者一個時間窗口內(nèi)請求進(jìn)行限速從而來保護(hù)系統(tǒng),一旦達(dá)到或超過限制速率就可以拒絕服務(wù),或者進(jìn)行排隊等待等。

Swoft 限流器底層采用的是令牌桶算法,底層依賴于 Redis 實現(xiàn)分布式限流。

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 表達(dá)式, 如果被限速會調(diào)用 fallback中定義的limiterFallback 方法

配置中心

說起配置中心前我們先說說配置文件,我們并不陌生,它提供我們可以動態(tài)修改程序運行能力。引用別人的一句話就是:

系統(tǒng)運行時(runtime)飛行姿態(tài)的動態(tài)調(diào)整!

我可以把我們的工作稱之為在快速飛行的飛機上修理零件。我們?nèi)祟惪偸菬o法掌控和預(yù)知一切。對于我們系統(tǒng)來說,我們總是需要預(yù)留一些控制線條,以便在我們需要的時候做出調(diào)整,控制系統(tǒng)方向(如灰度控制、限流調(diào)整),這對于擁抱變化的互聯(lián)網(wǎng)行業(yè)尤為重要。

對于單機版,我們稱之為配置(文件);對于分布式集群系統(tǒng),我們稱之為配置中心(系統(tǒng));

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

隨著業(yè)務(wù)的發(fā)展、微服務(wù)架構(gòu)的升級,服務(wù)的數(shù)量、程序的配置日益增多(各種微服務(wù)、各種服務(wù)器地址、各種參數(shù)),傳統(tǒng)的配置文件方式和數(shù)據(jù)庫的方式已無法滿足開發(fā)人員對配置管理的要求:

  • 安全性:配置跟隨源代碼保存在代碼庫中,容易造成配置泄漏;

  • 時效性:修改配置,需要重啟服務(wù)才能生效;

  • 局限性:無法支持動態(tài)調(diào)整:例如日志開關(guān)、功能開關(guān);

因此,我們需要配置中心來統(tǒng)一管理配置!把業(yè)務(wù)開發(fā)者從復(fù)雜以及繁瑣的配置中解脫出來,只需專注于業(yè)務(wù)代碼本身,從而能夠顯著提升開發(fā)以及運維效率。同時將配置和發(fā)布包解藕也進(jìn)一步提升發(fā)布的成功率,并為運維的細(xì)力度管控、應(yīng)急處理等提供強有力的支持。

關(guān)于分布式配置中心,網(wǎng)上已經(jīng)有很多開源的解決方案,例如:

Apollo是攜程框架部門研發(fā)的分布式配置中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,配置修改后能夠?qū)崟r推送到應(yīng)用端,并且具備規(guī)范的權(quán)限、流程治理等特性,適用于微服務(wù)配置管理場景。

本章以Apollo 為例,從遠(yuǎn)端配置中心拉取配置以及安全重啟服務(wù)。如果對 Apollo 不熟悉,可以先看Swoft 擴(kuò)展 Apollo 組件以及閱讀 Apollo 官方文檔。

本章以 Swoft 中使用 Apollo 為例,當(dāng) Apollo 配置變更后,重啟服務(wù)(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 除此方法外,還提供了更多的使用方法。

到此,關(guān)于“ PHP 實現(xiàn)微服務(wù)的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)站欄目:PHP實現(xiàn)微服務(wù)的方法是什么
網(wǎng)站鏈接:http://muchs.cn/article38/ipgepp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航網(wǎng)頁設(shè)計公司、App開發(fā)云服務(wù)器、手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司