分布式服务,是将多个具有不同或相同功能的服务分散在不同的服务器上,对外提供服务。
那么在分布式服务中,使用 PHP-Casbin 作为权限控制时,不同服务器上的服务的策略要保证是同步的。这里我们主要探讨常驻内存的 PHP 服务,在常驻内存的服务中,PHP-Casbin 一般是单例模式,所有的策略都会加载到内存,性能出色。
PHP-FPM 下每次都重新初始化
Enforcer
并重新加载策略,不需要做额外的策略同步。
分布式服务,是将多个具有不同或相同功能的服务分散在不同的服务器上,对外提供服务。
那么在分布式服务中,使用 PHP-Casbin 作为权限控制时,不同服务器上的服务的策略要保证是同步的。这里我们主要探讨常驻内存的 PHP 服务,在常驻内存的服务中,PHP-Casbin 一般是单例模式,所有的策略都会加载到内存,性能出色。
PHP-FPM 下每次都重新初始化
Enforcer
并重新加载策略,不需要做额外的策略同步。
多租户
(multi-tenancy)是一种软件架构技术,是实现在多租户
的环境下共用
相同的系统或程序组件,并且保证各用户间的数据隔离
,也可称作域租户
。
PHP-Casbin 不仅提供了全局的RBAC
的权限模型,而且还支持特定域的权限模型。特定租户/域的角色意味着当用户在不同的租户/域中时,用户可以拥有不同的角色,亦拥有不同的权限策略。在大型项目中,特别是在像SaaS
PaaS
这种云服务中,不同的租户需要拥有独立的权限控制,这就非常有用。
这里我以一个多商户
的电商平台为例,电商平台的商户就是租户
,每个商户有自己的管理人员,可以分配不同的角色,定义自己的权限。这些商户间的数据在逻辑上是完全隔离的,但他们共享这个电商平台的其他资源。
多商户电商平台
商户1,用户1,属于管理员角色
商品1
商户2,用户2,属于管理员角色
商品2
PHP-Casbin 是一个非常流行的权限控制框架,支持ACL
RBAC
ABAC
等权限控制模型。
它使用 Matcher
中配置的表达式来做权限决策,不仅提供了非常多的内置函数,而且还可以在Matcher
中指定自定义函数。
列表(List),就是存放一组数据的列表,就相当于我们编程语言中所使用的数组
。列表
顺序就是插入的顺序,可以从列表的头部
插入元素,也可以从尾部
插入元素。
Redis
中一个列表最多包含 2 的 32 次方 - 1 (4294967295)个元素。
LPUSH
命令是向列表中插入一个或多个元素,是列表的头部插入。列表如果不存在则会自动创建。
术业有专攻,闻道有先后。班门弄斧,请指教。
编程语言五花八门,在历史的洪流中,不断有新的编程语言、新的工具诞生。有的老牌语言依然是中流砥柱,有的新生代语言突飞猛进,后生可畏。
一个编程语言要想发展起来,包管理工具必不可少,包的数量与质量,决定着编程语言的周边生态的好坏。
在工作中,经常需要查看一些应用程序的版本,使用-v
、--vserion
等参数查看一个应用的版本,比如:
# node -v
v16.13.1
# go version
go version
go version go1.12.9 linux/amd64
随着互联网的高速发展,人们对安全的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA加解密。
在Go语言中实现RSA
加解密还是比较简单的,网上很多教程都是基于Go原生标准库写的,代码量较多。这里分享一个好用的库:https://github.com/forgoer/openssl 。
go get https://github.com/forgoer/openssl
秘钥可以生成在文件里,也是生成到Buffer里,只要实现了io.Writer
即可。
今天又加班了,趁睡前10分钟,抽空记录一下git常用命令。
git
是程序开发人员必不可少的工具,前一天在v站看到有人吐槽几年经验的前端不会git
。
其实也没什么,只是一个工具而已,可能人家之前的工作并不需要git
罢了。对于一般开发者而言,掌握几个基本的git
命令就够用了。
版本控制?顾名思义就是用来版本控制的。看到这个解释,是不是觉得听君一席话
如听君一席话
?
快速安装,到底有多快?
这里以目前最新的PHP8.2为例,我的电脑尝试了一些10分钟之内搞定,如果网络好可能更快。
PPA个人软件包存档(Personal Package Archive)是一项服务,允许用户上传使用Launchpad构建和发布的Ubuntu源软件包作为apt信息库。
为什么要添加PPA存储库,因为Ubuntu系统带的镜像库中PHP的版本太旧,没有最新的PHP版本。
HmacSHA256
加密算法比较常用的加密算法之一,它比MD5更加安全。HmacSHA256也是微信支付推荐的加密方式。
在Go语言中实现HmacSHA256
还是比较简单的,虽然没有PHP
的hash_hmac
一个函数搞定的方式简单,但比起Java
中的实现还是简单不少。
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/hex"
"fmt"
)
// HmacSha256 计算HmacSha256
// key 是加密所使用的key
// data 是加密的内容
func HmacSha256(key string, data string) []byte {
mac := hmac.New(sha256.New, []byte(key))
_, _ = mac.Write([]byte(data))
return mac.Sum(nil)
}
// HmacSha256ToHex 将加密后的二进制转16进制字符串
func HmacSha256ToHex(key string, data string) string {
return hex.EncodeToString(HmacSha256(key, data))
}
// HmacSha256ToHex 将加密后的二进制转Base64字符串
func HmacSha256ToBase64(key string, data string) string {
return base64.URLEncoding.EncodeToString(HmacSha256(key, data))
}
func main() {
// secret 是加密要使用的key
// apple 是要加密的内容
fmt.Printf("HmacSha256转16字符串: %s\n", HmacSha256ToHex("secret", "apple"))
fmt.Printf("HmacSha256转base字符串: %s\n", HmacSha256ToBase64("secret", "apple"))
}
随着Go语言的快速发展,以及其卓越的性能优势,有不少PHP项目转换为Go语言,那么php独有的serialize()
和unserialize()
数据,在Go语言怎么解析呢?
其实只要找到php中序列化的编码规则,就可以用Go去实现序列化和反序列了。
在Github
上已经有实现的库了,https://github.com/leeqvip/gophp 。
npm
是前端开发常用的包管理工具。
如果需要依赖第三方包时,直接使用npm安装npm仓库中的包,但在日常工作和学习中,如果没有将开发好的包发布到npm仓库怎么办呢?
Go语言中并没有提供内置函数来删除切片,熟悉Java/PHP的都知道,在Java/PHP中都提供对list或数组的filter
操作,那么在Go语言中就需要多用几行代码来实现删除切片中的指定元素了。
假设有个1~9的数组,要删除掉其中的偶数,那么这里先进行for
循环,依次判断元素是否为偶数,然后将偶数的元素通过索引截取掉,下标i
向左移动一位。
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
for i := 0; i < len(numbers); i++ {
if numbers[i]%2 == 0 { // 如果是偶数就删除
// 通过截取删除
numbers = append(numbers[:i], numbers[i+1:]...)
i--
}
}
fmt.Println(numbers) // [1 3 5 7 9]
同样是1~9的数组,通过遍历,将不需要删除的元素依次在原来的数组上覆盖原有元素。最后只截取前面j
个有效元素即可。
切片,是一组可变长度的、同类元素的集合
与数组相比切片的长度是不固定的。切片可以追加元素,在追加元素时可能使切片的容量增大。
专业企业官网建设,塑造企业形象,传递企业价值
系统软件开发,用心思考,用心设计,用心体验
打破技术瓶颈,让不堪重负的项目起死回生
构建全渠道一体化运营能力,实现全链路数字化
文案撰写、营销策划,专注品牌全案
一站式解决企业互联网营销痛点和难题
以技术的力量,改变互联网
联系我们