# coop **Repository Path**: asun/coop ## Basic Information - **Project Name**: coop - **Description**: Coop微服务构架为视方科技(武汉)有限公司自主研发可集群的大规模高可用的微服务框架。已大量部署在千万级用户的平台上,稳定运行于多个大型网站的生产系统中。 基于微服务构架,可实现网站模块化、独立部署、松耦合、高可用。 - **Primary Language**: Python - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-04 - **Last Updated**: 2023-10-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 2019-01-31 http:/localhost:15672 测试页 http://localhost/queue_test 【Coop微服务框架】 V2.1 Coop微服务构架为视方科技(武汉)有限公司自主研发可集群的大规模高可用的微服务框架。已大量部署在千万级用户的平台上,稳定运行于多个大型网站的生产系统中。 基于微服务构架,可实现网站模块化、独立部署、松耦合、高可用。 Coop微服务框架,分成服务端和客户端 nohup python3 /home/www/houjiji2-web/coop2/coop_con.py > /home/www/houjiji2-web/coop2/coop_con.log 2>&1 & ________________________________________________________________________ 【服务端】 Coop服务端是基于消息队列的微服务框架,使用Python3实现。 支持RabbitMQ和Redis消息队列服务,基础框架多线程进行设计。 [运行环境] RabbitMQ 3.6.9/安装rabbitmq_delayed_message_exchange插件 下载:https://bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange/v3.6.x#files 执行:rabbitmq-plugins enable rabbitmq_delayed_message_exchange) Python 3.5.3 /安装configparser模块(pip install configparser) Linux环境安装过程 sudo /usr/local/python3/bin/pip3 install configparser sudo /usr/local/python3/bin/pip3 install mysql sudo /usr/local/python3/bin/pip3 install requests [参数配置] 修改coop\coop.conf中php的运行参数。 为自己本机上PHP7环境的路径 项目目录下application/config.php中配置queue_server参数 //消息对列服务配置 'queue_server' => [ 'queue_name' => Env::get('QUEUE_NAME', 'default'), 'queue_host' => Env::get('QUEUE_HOST', 'localhost'), 'queue_port' => Env::get('QUEUE_PORT', 5672), 'queue_user' => Env::get('QUEUE_USER', 'guest'), 'queue_pass' => Env::get('QUEUE_PASS', 'guest'), ], 以上参数配置好后就可运行服务端:python coop_con.py 如需要将其安装成服务则对应的运行coop_srv.py(仅支持Windows) [示例程序] /** * @package jumper\QueueServer * * 消息接收控制器 * * @author: Asun * @version 1.0 * @copyright (c) 2006~2017 Sltech All rights reserved. */ namespace app\artisan\worker; use app\common\service\UserService; use jumper\Worker; use jumper\Task; /** * 消息接收控制器 * @package app\artisan\worker */ class Order extends Worker { public function test(Task $task) { echo "Order.test{$task->index}\n"; } public function at(Task $task) { echo "Order.at{$task->index}\n"; } public function delay(Task $task) { echo $task->toJson().PHP_EOL; echo "Order.delay {$task->times}\n"; //返回True才会继续循环执行 return true; } } ________________________________________________________________________ 【客户端】 客户端在使用时需要将以下文件配置成自动加载 extend/Queue.php [运行环境] PHP 7.0/AMQP 扩展 1.9(https://pecl.php.net/package/amqp) [参数配置] 项目目录下application/config.php中配置queue_client参数 //消息对列服务配置 'queue_client' => [ 'queue_name' => Env::get('QUEUE_NAME', 'default'), 'queue_host' => Env::get('QUEUE_HOST', 'localhost'), 'queue_port' => Env::get('QUEUE_PORT', 5672), 'queue_user' => Env::get('QUEUE_USER', 'guest'), 'queue_pass' => Env::get('QUEUE_PASS', 'guest'), ], 在PHP程序在发布消息需要在头部引用 Queue use extend/Queue 然后在其它需要调用的地方可以直接使用静态函数生成队列消息并发送 发送实时消息 Queue::sendNow('queue.order.test',array('data'=>'ttt')); 发送定时消息 Queue::sendAt('queue.order.at',Now()+10000,array('order_id'=>'123')); 发送循环消息 Queue::sendDelay('queue.order.delay',10000,1000,array('order_id'=>'123')); [示例程序] namespace app\artisan\controller; use extend\Queue; use think\Controller; use sltech\Session; /** * 队列消息发送示例 * @package app\artisan\controller */ class QueueTest extends Controller { public function index() { for($i=0;$i<1;$i++){ Queue::sendNow('artisan.order.test',array('data'=>'ttt')); } return view('welcome'); } } 1.增加SQL命令管理功能,可以管理已进入队列的消息 [相关文件] manage_commander.py command_factory.py sql_command.py [使用方法] Queue::sendSQL("delete where data.id=12323 limit 1") Queue::sendSQL("delete where command=queue.order.test_bak limit 1") 支持delete及update命令,条件仅支持并的关系 update a=1,b=2,c=3 where orderId=12313 limit 1 delete where orderId=12323 limit 1 2.增加HTTP通知功能,如果某个消息触发,则会主动访问HTTP [相关文件] notify_factory.py notify_request.py [使用方法] Queue::sendNow('queue.order.test_bak',['id' => $i]); Queue::registerNotify("queue.order.test_bak","http://www.houjiji.com/order/delete") Queue::removeNotify("order.deleted","http://www.houjiji.com/order/delete") Queue::blockIp("127.0.0.2") 3.增加服务扩展 [相关文件] service_center.py 等 [使用方法] 在Service建立子服务目录(如Robot) ,新建command.py,编写方法test_command Queue::sendCommand('robot.test_command',['id' => $i],60*60);