本文只做为php微服务案例,其他更多功能请自行添加。

项目介绍

某个项目中,根据上传EXCEL文件,读取其中的数据并生成订单(分为总订单和子订单),如商品编码,收货人等信息,进行各种条件验证,并返回验证结果。用户根据返回的结果选择支付方式进行付款操作。

  • Excel 中最多有10000行,多用户同时上传
  • 国外用户访问国内服务器
  • 创建订单时并减少库存
  • 发送待付款邮件
  • 待付款邮件中有当前总订单下所有子订单信息的PDF文件
  • 等等更多

了解这么多需求后,那么就可以设计一个基本需要的架构了。
微服务这是肯定需要了->swoole,服务发现和注册呢->consul,一次性处理那么多数据不现实,必然要拆分处理,处理一部分,返回一部分结果,那么这个需要用到数据持久化,消息队列可以解决这个问题->rabbitmq,在验证的过程中数据查询频繁可以用elasticsearch,日志收集分析等可以用elasticsearch全家桶(elasticsearch logstash kibana) 。。。。。。。

近期做了 docker 版案例,给大家提供一个思路吧

风.fox

消息队列 RabbitMQ

消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
更多请看
https://www.jianshu.com/p/79ca08116d57
https://blog.csdn.net/whoamiyang/article/details/54954780

服务管理(服务发现,注册,健康检查) consul

consul 是一个服务管理软件。
- 支持多数据中心下,分布式高可用的,服务发现和配置共享。
- consul支持健康检查,允许存储键值对。
- 一致性协议采用 Raft 算法,用来保证服务的高可用.
- 成员管理和消息广播 采用GOSSIP协议,支持ACL访问控制。
ACL技术在路由器中被广泛采用,它是一种基于包过滤的流控制技术。控制列表通过把源地址、目的地址及端口号作为数据包检查的基本元素,并可以规定符合条件的数据包是否允许通过。
gossip就是p2p协议。他主要要做的事情是,去中心化。
这个协议就是模拟人类中传播谣言的行为而来。首先要传播谣言就要有种子节点。种子节点每秒都会随机向其他节点发送自己所拥有的节点列表,以及需要传播的消息。任何新加入的节点,就在这种传播方式下很快地被全网所知道。
更多请看
https://blog.csdn.net/viewcode/article/details/45915179
https://www.jianshu.com/p/28c6bd590ca0

swoole-php异步网络通信引擎

Swoole:面向生产环境的 PHP 异步网络通信引擎
使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用 PHP + Swoole 作为网络通信框架,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
更多请看
https://www.swoole.com/
https://wiki.swoole.com/



下载docker 环境

https://github.com/foxiswho/docker-nginx-php-swoole-rabbitmq-consul

git clone https://github.com/foxiswho/docker-nginx-php-swoole-rabbitmq-consul.git

下载案例文件

进入上面下载的目录wwwroot

cd wwwroot

然后下载 案例文件

git clone https://github.com/foxiswho/php-swoole-rabbitmq-consul-demo.git "dpsrc"

启动docker compose

到根目录(有docker-compose.yml的那个目录),然后执行

docker-compose up 

如果你需要关闭或者删除docker-compose up建立的所有容器,请在docker-compose.yml的目录下,执行如下命令

docker-compose down 

启动成功后

docker compose 启动成功后,先在浏览器访问http://localhost/demo/service_demo_mq_client/index,有程序自动创建消息队列的交换机,队列,路由KEY等。
然后再启动如下2个DOCKER:

docker-nginx-php-swoole-rabbitmq-consul_phpmqsub_1
docker-nginx-php-swoole-rabbitmq-consul_phpmqsub002_1

为什么要其中这2个docker呢,因为在docker compose创建时,消息队列里面全部是空的,没有建立测试里面的测试用的交换机,队列,路由KEY。执行一次后,就会自动创建这些

直接访问浏览器网址 即可
http://localhost/demo/service_demo_client/index

http://localhost/demo/service_demo_mq_client/index

其他

注册中心访问

浏览器打开

http://localhost:8500/ui/

消息队列web 管理

http://localhost:15672/

默认用户及密码
guest
guest

说明

访问php微服务返回数据

在浏览器中打开如下网址

http://localhost/demo/service_demo_client/index

此处是到服务注册中心去获取php-demo微服务信息,会返回该微服务的ip端口等信息, swoole_client 根据返回的ip端口去访问微服务,微服务php-demo处理后返回数据,此处就是显示处理后的数据

源码如下

<?phpnamespace app\demo\controller;use app\module\consul;//本demo处理 app\service\controller\Demo
class ServiceDemoClient
{/*** 获取指定服务,发送数据,服务端处理数据,并返回数据*/public function index(){//获取指定服务$services = consul::getServicesOne('php-demo');if (isset($services) && $services) {trace($services);//                $ser->ID;//                $ser->Address;//                $ser->Service;//                $ser->Port;$client = new \swoole_client(SWOOLE_SOCK_TCP);//连接到服务器if (!$client->connect($services->Address, $services->Port, 0.5)) {throw new \Exception("swoole_client connect failed.");}//向服务器发送数据if (!$client->send("hello world")) {throw new \Exception("swoole_client send failed.");}//从服务器接收数据$data = $client->recv();if (!$data) {throw new \Exception("swoole_client recv failed.");}echo $data;//关闭连接$client->close();} else {throw new \Exception("Consul service not find.");}}/*** 获取指定服务*/public function getService(){......}
}

php微服务

代码位置

app\service\controller\Demo.php

启动该微服务,与app目录同级目录下执行

php public/index.php service/demo/start

源码

//默认action start
class Demo extends Server
{// 监听所有地址protected $host = '0.0.0.0';// 监听 9501 端口protected $port = 9501;// 指定运行模式为多进程protected $mode = SWOOLE_PROCESS;// 指定 socket 的类型为 ipv4 的 tcp socketprotected $sockType = SWOOLE_SOCK_TCP;// 配置项protected $option = [/***  设置启动的worker进程数*  业务代码是全异步非阻塞的,这里设置为CPU的1-4倍最合理*  业务代码为同步阻塞,需要根据请求响应时间和系统负载来调整*/'worker_num' => 1,// 守护进程化'daemonize'  => false,// 监听队列的长度'backlog'    => 128];/*** 收到信息时回调函数* @param \swoole_server $server swoole_server对象* @param $fd TCP客户端连接的文件描述符* @param $from_id TCP连接所在的Reactor线程ID* @param $data 收到的数据内容*/public function onReceive(\swoole_server $server, $fd, $from_id, $data){//返回数据$server->send($fd, 'onReceive: ' . $data);}
}

消息队列

都是大同小异,
略,请自行看案例
空了时候再添加更多案例说明

php-php异步网络通信引擎-服务发现-消息队列 案例相关推荐

  1. activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试

    activiti异步执行 一点历史 永无休止的一件事是,Activiti在某些非常大的规模的大型组织中的使用方式. 过去,这导致了各种优化和重构,其中包括异步执行器-替换旧的作业执行器. 对于未启动的 ...

  2. 架构师图谱之微服务和消息队列

    概述 "架构师图谱"是一个很宏大的命题,特别是优秀的架构师自身也是"由点到面再到图",一点点成长积累起来,尝试写这篇文章的目的更多的是结合自身的一些架构.研发. ...

  3. SpringCloud 微服务 (十) 消息队列MQ 基础

    2019独角兽企业重金招聘Python工程师标准>>> 壹 之前学习了SpringCloud Bus结合MQ,没有多学习MQ,本次学习相关内容,先了解异步,同步就不说了 异步: 客户 ...

  4. java 消息队列服务_ActiveMQ 消息队列服务

    1 ActiveMQ简介 1.1 ActiveMQ是什么 ActiveMQ是一个消息队列应用服务器(推送服务器).支持JMS规范. 1.1.1 JMS概述 全称:Java Message Servic ...

  5. 【Redis消息队列实现异步秒杀】--Redis学习笔记08

    前言 秒杀业务的优化思路: 先利用Redis完成库存余量.一人一单判断,完成抢单业务 再将下单业务放入队列中(阻塞队列,消息队列),利用独立线程异步下单 基于阻塞队列的异步秒杀存在哪些问题? 内存限制 ...

  6. OneNET物联网平台06 消息队列MQ服务开启与配置

    消息队列MQ可作为规则引擎对接的扩展增值服务使用,配合物联网套件,可形成具备设备接入.设备管理.消息分发.应用承载能力的高性能服务组合 消息队列MQ具有如下特点: 消息缓存 MQ服务支持消息缓存,可以 ...

  7. 异步实现:回调回调和消息队列

    异步实现方式一:异步回调 异步回调的实现依赖于多线程或者多进程 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. 同步调用是一种阻塞式调用,调用方要等待对 ...

  8. 【Redis学习08】Redis消息队列实现异步秒杀

    文章目录 1. 消息队列 1.1 基于List结构模拟消息队列 1.2 基于PubSub的消息队列 1.3 基于Stream的消息队列 2. 基于Stream的消息队列---消费者组 2.1 消费者组 ...

  9. C#编写Windows服务程序 (服务端),客户端使用 消息队列 实现淘宝 订单全链路效果

    需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...

  10. C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果

    需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...

最新文章

  1. GentleNet使用之详细图解[语法使用增强版]
  2. 9.7号Linux学习笔记
  3. 牛逼哄哄的SLAM技术 即将颠覆哪些领域?
  4. solr导入mysql数据库
  5. mysql主键用完了怎么办_MySQL 自增 ID 用完了怎么办?
  6. docker mysql8
  7. 二叉树的先序、中序、后序遍历超详解
  8. SAP License:GB01中替代字段释放
  9. 《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(五)
  10. C语言之结构体嵌套调用(十八)
  11. 在校生如何做一个可以让简历有亮点的java项目?
  12. 最全公司章程自由规定事项
  13. Centos7 Springboot 启动脚本
  14. javascript案例32——中文简繁体转换
  15. python3爬虫实战-requests+beautifulsoup-爬取下载顶点网站的小说
  16. 车辆ECU综合测试系统研究
  17. 计算机主机箱内的硬件设备主要有哪些,电脑主机有哪些硬件设备
  18. nextvlad:一个用于大规模视频分类的聚集帧级特征的有效神经网络 NeXtVLAD: An Efficient Neural Network toAggregate Frame-level Fea
  19. CSS-边框和边距详解
  20. 记一次计算机课作文,记一次课堂活动作文500字

热门文章

  1. PL/SQL 包头和包体
  2. string与wstring转换
  3. 计算机网络-扩展路由器网段
  4. 城市间紧急救援 (25 分)(Dijkstra)
  5. java人账户atm模拟存款,模拟银行ATM系统(基础版)
  6. kettle使用经验01
  7. JAVA GUI设计
  8. 卷积神经网络 第三周作业 Keras+-+Tutorial+-+Happy+House+v1
  9. python读取MNIST image数据
  10. python实现将将输入的可约分数化简为不可约分数