PHP 微服务集群搭建 - Hyperf-php教程

资源魔 32 0
微效劳架构

微效劳的概念由 Martin Fowler 于2014年3月提出:

微效劳架构是一种架构模式,它倡导将繁多使用顺序划分红一组小的效劳,效劳之间互相调和、相互合营,为用户提供终极代价。每一个效劳运转正在其自力的过程中,效劳以及效劳之间采纳轻量级的通讯机制互相沟通。每一个效劳都环抱着详细的营业进行构建,而且可以被自力的部署到消费环境、类消费环境等。另外,应只管即便防止对立的、集中的效劳治理机制,对详细的一个效劳而言,应依据营业上下文,抉择合适的言语、对象对其进行构建。

下图是一个电商零碎的微效劳架构图:

微信截图_20200505115623.png

微效劳架构与单体使用相比,具备如下优点:

一、每一个效劳都比拟简略,只存眷于一个营业性能;

二、微效劳架构形式是松耦合的,每一个效劳能够自力测试、部署、晋级、公布;

三、每一个微效劳可由没有同团队自力开发,能够各自抉择最好及最合适的没有同的编程言语与对象;

四、每一个效劳能够依据需求进行程度扩大,进步零碎并发才能。

不银弹,微效劳架构正在带来诸多优点的同时,也会有以下缺陷:

一、微效劳架构进步了零碎的复杂度,添加了运维开支及老本。如单体使用可能只要部署至一小片使用效劳集群,而微效劳架构可能变为需求构建/测试/部署/运转数十个自力的效劳,并可能需求支持多种言语以及环境;

二、作为一种散布式零碎,微效劳架构引入了其余若干成绩,例如音讯序列化、网络提早、异步机制、容错解决、效劳雪崩等;

三、效劳治理的复杂性,如效劳的注册、发现、降级、熔断等成绩;

四、效劳与效劳之间存正在互相挪用的状况,为排查零碎毛病带来微小应战。

能够说,恰是传统使用架构的零碎变患上日趋痴肥,面对难以保护、扩大的成绩,同时容器化技巧(Docker)的蓬勃倒退以及 DevOps 思维的日渐成熟,催生了新的架构设计格调 – 微效劳架构的呈现。

RPC 框架

微效劳架构中的各个效劳通常没有正在同一个机械上,乃至没有会正在同一个网络环境里,因而微效劳之间若何挪用是一个亟待处理的成绩,咱们通常应用 RPC 协定来处理:

RPC(Remote Procedure Call),即近程进程挪用,是一个较量争论机通讯协定。该协定容许运转于一台较量争论机的顺序挪用另外一台较量争论机的子顺序,而顺序员无需额定地为这个交互作用编程。——维基百科

完成了 RPC 协定的框架,能够让效劳方以及挪用方屏蔽各类底层细节,让挪用方像挪用内陆函数同样挪用远真个函数(效劳)。RPC 框架普通为效劳端以及客户端提供了序列化、反序列化、衔接池治理、负载平衡、毛病转移、行列步队治理、超时治理、异步治理等本能机能。正在网上找到一个阐明 RPC 框架工作原理图:

微信截图_20200505115750.png

今朝,依据序列化数据时采纳的技巧的没有同,可分为 JSON-RPC 以及 gRPC 两种:

一、JSON-RPC 是一种基于 JSON 格局的轻量级的 RPC 协定规范,可基于 HTTP 协定来传输,或间接基于 TCP 协定来传输。 JSON-RPC 优点是易于应用以及浏览。

二、gRPC 是一个高功能、通用的开源 RPC 框架,其由 Google 次要面向挪动使用开发并基于 HTTP/2 协定规范而设计,基于 ProtoBuf (Protocol Buffers) 序列化协定开发,且支持泛滥开发言语。 gRPC 具备低提早、高效率、高扩大性、支持散布式等优点。

Consul

如今有了 RPC 框架,咱们就能够只思考效劳与效劳之间的营业挪用而不必思考底层传输细节。此时,假如效劳 A 想挪用效劳 B 时,咱们能够正在效劳 A 中设置装备摆设效劳 B 的 IP 地点以及端口,而后剩下的传输细节就交给 RPC 框架。这正在微效劳规模很小的状况下是不成绩的,然而正在效劳规模很年夜、并且每一个效劳没有止部署一个实例的状况下碰面临微小应战。比方,效劳 B 部署了三个实例,这时候候效劳 A 想挪用效劳 B 该申请哪一个实例的 IP ?如果效劳 B 部署的三个实例有两个都挂掉了,效劳 A 可能会照旧去申请挂掉的实例,效劳将不成用。将 IP 地点以及端口写成设置装备摆设文件显患上很没有灵敏,微效劳架构往往要保障高可用及静态伸缩。

因而,咱们需求一个效劳注册与效劳发现的对象,可以静态地变卦效劳信息,而且找到可用的效劳的 IP 地点以及端口。今朝市道市情上效劳发现的对象有不少,如 Consul、ZooKeeper 、Etcd、Doozerd 等,本文次要以 Consul 软件为例。

Consul 是一个支持少数据中心、散布式高可用的效劳发现以及设置装备摆设同享的效劳软件,由 HashiCorp 公司用 Go 言语开发, 基于 Mozilla Public License 2.0 的协定进行开源。 Consul 支持衰弱反省,并容许 HTTP 、gRPC 以及 DNS 协定挪用 API 存储键值对。

上面是引入效劳注册与效劳发现对象后的架构图:

微信截图_20200505115836.png

正在这个架构中:

起首 S-B 的实例启动后将本身的效劳信息(次要是效劳所正在的 IP 地点以及端标语)注册到 Consul 中。

Consul 会对一切注册的效劳做衰弱反省,以此来确定哪些效劳实例可用哪些不成用。

S-A 启动后就能够经过拜访 Consul 来猎取到一切衰弱的 S-B 实例的 IP 以及端口,并将这些信息放入本人的内存中,S-A 就可用经过这些信息来挪用 S-B。

S-A 能够经过监听 Consul 来更新存入内存中的 S-B 的效劳信息。比方 S-B-1 挂了,衰弱反省机制就会将其标为不成用,这样的信息变化就被 S-A 监听到了,S-A 就更新本人内存中 S-B-1 的效劳信息。

可见, Consul 软件除了了效劳注册以及效劳发现的性能以外,还提供了衰弱反省以及状态变卦告诉的性能。

Hyperf

关于 Java 开发者来讲,有技巧相称成熟的 Dubbo 以及 Spring Cloud 微效劳框架可供抉择。作为一位 PHPer,我用 Google 查了一下「PHP + 微效劳」,发现有用的相干内容少之又少 ,不甚么本质性的参考代价,有限难过。。。幸好,有年夜神正在基于 Swoole 扩大的根底上,完成了高功能、高灵敏性的 PHP 协程框架 Hyperf ,并提供了微效劳架构的相干组件。

Hyperf 是基于 Swoole 4.3+ 完成的高功能、高灵敏性的 PHP 协程框架,内置协程效劳器及年夜量罕用的组件,功能较传统基于 PHP-FPM 的框架有质的晋升,提供超高功能的同时,也放弃着极端灵敏的可扩大性,规范组件均基于 PSR 规范 完成,基于弱小的依赖注入设计,保障了绝年夜局部组件或类都是 可交换 与 可复用 的。

于是,我正在学习了微效劳架构相干的根底常识之后,应用 Hyperf 框架构建了一个基于 PHP 的微效劳集群,这是名目源码地点:https://github.com/Jochen-z/p...。该名目应用 Dokcer 搭建,docker-compose.yml 代码以下:

version: "3"
services:
  consul-server-leader:
    image: consul:latest
    container_name: consul-server-leader
    co妹妹and: "agent -server -bootstrap -ui -node=consul-server-leader -client=0.0.0.0"
    environment:
      - CONSUL_BIND_INTERFACE=eth0
    ports:
      - "8500:8500"
    networks:
      - microservice
  microservice-1:
    build:
      context: .
    container_name: "microservice-1"
    co妹妹and: "php bin/hyperf.php start"
    depends_on:
      - "consul-server-leader"
    volumes:
      - ./www/microservice-1:/var/www
    networks:
      - microservice
    tty: true
  microservice-2:
    build:
      context: .
    container_name: "microservice-2"
    co妹妹and: "php bin/hyperf.php start"
    depends_on:
      - "consul-server-leader"
    volumes:
      - ./www/microservice-2:/var/www
    networks:
      - microservice
    tty: true
  app:
    build:
      context: .
    container_name: "app"
    co妹妹and: "php bin/hyperf.php start"
    depends_on:
      - "microservice-1"
    volumes:
      - ./www/web:/var/www
    ports:
      - "9501:9501"
    networks:
      - microservice
    tty: true
networks:
  microservice:
    driver: bridge
volumes:
  microservice:
    driver: local

这里启动了一个 Consul 容器 consul-server-leader 作为效劳注册以及效劳发现的组件,容器 microservice-1 以及 microservice-2 辨别提供了加法运算以及除了法运算的效劳。容器 app 作为效劳挪用方,设置装备摆设了 consul-server-leader 容器的 URL,经过拜访 consul-server-leader 猎取 microservice-1 以及 microservice-2 效劳的 IP 地点以及端口,而后 app 经过 RPC 协定挪用加法运算以及除了法运算的效劳猎取后果并前往给用户。

app 容器为 Web 使用,部署了一个 Hyperf 名目并对外提供 HTTP 效劳。例如,正在 App\Controller\IndexController 管制器里有 add 办法:

public function add(AdditionService $addition)
{
  $a = (int)$this->request->input('a', 1); # 承受前端用户参数
  $b = (int)$this->request->input('b', 2);
  return [
    'a' => $a,
    'b' => $b,
    'add' => $addition->add($a, $b) # RPC挪用
  ];
}

正在 App\JsonRpc\AdditionService 中 add 的完成:

class AdditionService extends AbstractServiceClient
{
    /**
     * 界说对应效劳提供者的效劳称号
     * @var string
     */
    protected $serviceName = 'AdditionService';
    /**
     * 界说对应效劳提供者的效劳协定
     * @var string
     */
    protected $protocol = 'jsonrpc-http';
    public function add(int $a, int $b): int
    {
        return $this->__request(__FUNCTION__, compact('a', 'b'));
    }
}

承继了 AbstractServiceClient 便可创立一个微效劳客户端申请类,Hyperf 正在底层帮咱们完成了与 Consul 以及效劳提供者交互的细节,咱们只需 AdditionService 类里的 add 办法便可近程挪用 microservice-1 以及 microservice-2 提供的效劳。

至此,PHP 微效劳集群搭建就实现了!

以上就是PHP 微效劳集群搭建 - Hyperf的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 hyperf

抱歉,评论功能暂时关闭!