当前位置: 首页 > news >正文

PHP-Casbin 在分布式服务中利用 Watcher 做策略同步

在这里插入图片描述

分布式服务,是将多个具有不同或相同功能的服务分散在不同的服务器上,对外提供服务。

那么在分布式服务中,使用 PHP-Casbin 作为权限控制时,不同服务器上的服务的策略要保证是同步的。这里我们主要探讨常驻内存的 PHP 服务,在常驻内存的服务中,PHP-Casbin 一般是单例模式,所有的策略都会加载到内存,性能出色。

PHP-FPM 下每次都重新初始化 Enforcer 并重新加载策略,不需要做额外的策略同步。

Casbin 中提供了 Watcher ,用于多实例间的消息策略同步。

原理

当某个实例的Enforcer中的策略发生变化时,调用 Watcher ,向消息队列(MQ)中推送消息,监听到该消息队列的Enforcer收到消息后,自动刷新当前实例中的策略。

主要是在常驻进程的框架中使用 Casbin ,例如:Swoole、WorkerMan、ReactPHP 等。

第一种是单实例、多进程,进程中的数据相互隔离的;第二种则是多实例的场景。

环境

这里采用 PHP 8.4Swoole 作为演示环境,并且借助 Redis watcher for PHP-Casbin in Swoole 作为 Watcher

使用composer安装一下依赖:

composer require casbin/casbin
composer require casbin/dbal-adaptercomposer require casbin/swoole-redis-watcher

编码

初始化 SwooleServer,使用 swoole 启动一个HTTP服务常驻内存。

use Casbin\Enforcer;
use CasbinAdapter\DBAL\Adapter;
use CasbinWatcher\SwooleRedis\Watcher;
use Swoole\Http\Server;Co::set(['hook_flags' => SWOOLE_HOOK_ALL]);$serv = new Server('127.0.0.1', 9501);
$serv->set(['worker_num' => 4]);

在服务启动后,注入回调函数,初始化Casbin的决策器。

$serv->on('WorkerStart', function($server, $worker_id) {global $enforcer;$adapter = Adapter::newAdapter(['driver' => 'pdo_mysql','host' => '127.0.0.1','dbname' => 'test','user' => 'root','password' => '','port' => '3306',]);$enforcer = new Enforcer('./path/to/model.conf', $adapter);// 设置 Watcher$watcher = new Watcher(['host' => '127.0.0.1','password' => '','port' => 6379,'database' => 0,]);$enforcer->setWatcher($watcher);
});$serv->start();

可以看到,在初始化决策器后,又初始化了Watcher,并调用决策器(Enforcer)设置Watcher

Swoole Watcher 是一个通过 redis发布订阅功能实现的消息生产和消费的。在 swoole 中使用协程异步非阻塞订阅 redis 的消息,收到消息后触发回调,随后调用决策器的loadPolicy(),重新加载策略从而实现不同实例的策略更新。

最后

本文介绍了如何在分布式多实例的架构下实现 Casbin 的策略同步,随着新技术的不断涌现,如今的 PHP 已经不再是完全依赖 PHP-FPM 来运行,不只是 Swoole,还有 FrankenPHP RoadRunner ReactPHP WorkerMan 等框架为 PHP 提供了运行环境来为 PHP 加速。

PHP-Casbin 还有非常多的扩展,为各种各样的框架集成提供了便利,可以查看 GitHub 仓库:https://github.com/php-casbin 。

http://www.dtcms.com/a/540328.html

相关文章:

  • OCP考试必须培训吗?费用多少?
  • SpringBoot + 百度内容安全实战:自定义注解 + AOP 实现统一内容审核(支持文本 / 图片 / 视频 + 白名单 + 动态开关)
  • 心智结构与组织学习
  • NAS 私有云零信任部署:cpolar 加密访问 + 本地存储,破解安全与便捷难题
  • C++面向对象继承全面解析:不能被继承的类、多继承、菱形虚拟继承与设计模式实践
  • 只做财经的网站厦门高端网站建设公
  • 星宿网站建设系统开发过程中原型有哪些作用
  • Angular 入门项目
  • 架构解析:衡石科技如何基于AI+Data Agent重构智能数据分析平台
  • 云栖实录:重构可观测 - 打造大模型驱动的云监控 2.0 与 AIOps 新范式
  • AR技术如何确保数据准确无误?
  • Python-openai对话LLM
  • 智慧码垛系统介绍
  • Axure高保真View Design框架元件库
  • 网站 linux 服务器昆明企业网站开发公司
  • 网站介绍经过下拉怎么做wordpress统计访问ip
  • 济南品牌网站建设低价wordpress建站要钱吗
  • DHT11温湿度传感器Linux驱动开发完整流程
  • EMD-SVM 太阳能功率预测
  • FFMPEG-1:下载与安装,文件组成,ffmpeg -h 命令汇总,练习使用 ffmpeg、ffplay、ffprobe,
  • 蚂蚁开源高性能扩散语言模型框架dInfe,推理速度提升十倍
  • DVWA靶场通关笔记
  • transformer结构
  • Spring Boot 移除 Undertow:技术背景、迁移方案与避坑指南(附源码级解析)
  • 龙岩食品有限公司搜索引擎优化的英文缩写
  • 【Linux】进程状态|优先级|进程切换|环境变量
  • 2025智能体元年:AI重塑产业格局
  • 计网4.4.1 路由算法
  • 038-Spring AI Alibaba VLLM Chat 功能完整案例
  • MCU的时钟树(Clock Tree)是什么?