热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpconsul架构,手把手教你搭建Swoole微服务(基于consul和simps框架)

##安装consulconsul具体的原理这里不做介绍,只需要记得consul中有两个角色,server和client,我们首先需要一个c

## 安装consul

`consul`具体的原理这里不做介绍,只需要记得consul中有两个角色,`server`和`client`,我们首先需要一个consul的`server`集群,生产环境推荐3台机器以上的consul集群保证高可用,server集群间采用`raft`强一致性算法协调,`client`是性能很高的轻量级进程,client和server集群间通过`gossip`协议同步数据,我们需要在微服务的`rpc调用端`和`rpc服务端`的机器上都安装consul的`client`。

`rpc调用端`通过请求本机的consul`client`来`发现服务`。

`rpc服务端`通过请求本机的consul`client`来`注册服务`。

这里推荐采用docker来安装`consul`。

#### consul server集群安装

```bash

一. docker pull consul

#CONSUL_BIND_INTERFACE 是内网的网卡名,consul服务将绑定到这个网卡上

#server=true 表示这个consul进程是server角色

#bootstrap-expect=1 表示只需要1个server就可以对外提供服务,推荐3个,我这里为了演示写1

二. docker run -d --name=consul1 --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=1 --client=0.0.0.0 -ui

```

#### 在rpc的客户端和服务端安装consul client

```bash

一. docker pull consul

#server=false 表示这是个client进程

#join=192.168.2.132,这个ip是consul server那台机器的ip,由于server是集群部署,即使这个ip机器宕机,也会自动选主到新ip

二. docker run -d --name=client --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 -ui -join=192.168.2.132

```

## 安装simps的rpc组件

首先安装swoole扩展,[参考此文档](https://wiki.swoole.com/#/environment)

安装simps脚手架和rpc组件

```php

composer create-project simple-swoole/skeleton

cd skeleton

composer require simple-swoole/rpc-multiplex

```

`rpc-multiplex`组件采用单连接复用的方式,不需要连接池,性能极高,感谢`@李铭昕`小伙伴的贡献。

## 添加rpc服务端代码

在`app/Service`目录下面,填充你的业务代码

```php

namespace App\Service;

class RpcService

{

public function hello(string $name): string

{

return 'Hello ' . $name;

}

}

```

在`config/routes.php`定义一个`Health`接口给consul探活用

```php

return [

['GET', '/Health', function ($request, $response) {

$response->end('Im ok');//定义健康监测接口给consul调用

}],

];

```

## 修改rpc服务端的配置

修改`config/servers.php`

```php

return [

'main' => [

'class_name' => \Swoole\Http\Server::class,

'ip' => '0.0.0.0',

'port' => 9501,//主服务用来接收consul的心跳请求

'sock_type' => SWOOLE_SOCK_TCP,

'callbacks' => [

'request' => [\App\Events\Http::class, 'onRequest'],

'start' => [Simps\RpcMultiplex\TcpServer::class, 'onStart'],

'workerStart' => [Simps\RpcMultiplex\TcpServer::class, 'onWorkerStart'],

],

'settings' => [

'worker_num' => swoole_cpu_num(),

],

'sub' => [

//定义rpc服务,注册服务到consul

[

'callbacks' => [

"receive" => [Simps\RpcMultiplex\TcpServer::class, 'onReceive'],

],

'port' => 9503,//rpc服务监听9503端口

'sock_type' => SWOOLE_SOCK_TCP,

//注册到consul时候,'0.0.0.0'默认会拿第一块网卡的ip注册到consul

'ip' => '0.0.0.0',

//服务名称

'service_name' => ['rpc1','rpc2'],

//有`consul`配置的时候会自动注册到consul

'consul' => [

'publish_to' => 'http://127.0.0.1:8500', //本机的consul client地址

"checks" => [

[

"name" => "rpc1",

"http" => "http://127.0.0.1:9501/Health", //consul请求这个地址 连通就证明服务可用,checks的更多配置请参考consul官方文档。

"interval" => "5s",

],

[

"name" => "rpc2",

"http" => "http://127.0.0.1:9501/Health", //consul请求这个地址 连通就证明服务可用,checks的更多配置请参考consul官方文档。

"interval" => "5s",

]

]

],

'settings' => [

// 以下参数不允许修改

'open_length_check' => true,

'package_length_type' => 'N',

'package_length_offset' => 0,

'package_body_offset' => 4,

'package_max_length' => 1024 * 1024 * 2,

],

],

]

]

];

```

## 添加rpc调用端代码

```php

class IndexController

{

public function index($request, $response)

{

$serviceName = 'rpc1';

$consulUri = 'http://127.0.0.1:8500';//本机的consul client地址,框架会通过这个consul client找到所有可用的机器,随机找到一台机器进行rpc调用,如果所有机器都挂了会抛异常

$data = CallWithConsul::getInstance($serviceName, $consulUri)->call('App\Service\RpcService', 'hello', 'World'); //call(类名,方法,参数)

$response->end(

json_encode(

[

'method' => $request->server['request_method'],

'message' => 'Hello Simps. ' . $data->getResult(),

]

)

);

}

}

```

## 微服务其他东西

当然微服务是个很大的话题,这里只解决了服务发现和注册,还有服务监控,限流等,监控这里推荐专门针对php的监控产品 [Swoole Tracker](https://business.swoole.com/tracker/index)



推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 微信民众号商城/小顺序商城开源项目介绍及使用教程
    本文介绍了一个基于WeiPHP5.0开发的微信民众号商城/小顺序商城的开源项目,包括前端和后端的目录结构,以及所使用的技术栈。同时提供了项目的运行和打包方法,并分享了一些调试和开发经验。最后还附上了在线预览和GitHub商城源码的链接,以及加入前端交流QQ群的方式。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • 本文介绍了在MacOS系统上安装MySQL的步骤,并详细说明了如何设置MySQL服务的开机启动和如何修改MySQL的密码。通过下载MySQL的macos版本并按照提示一步一步安装,在系统偏好设置中可以找到MySQL的图标进行设置。同时,还介绍了通过终端命令来修改MySQL的密码的具体操作步骤。 ... [详细]
  • 从U ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • homemyUserscript.sh>>homemyUserlog.txt2>&1在script.sh ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
author-avatar
Deenylou2010
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有