prestd 试用笔记(二)——配置篇

Photo by Paul Hanaoka on Unsplash

上一篇笔记中我们用最基本的配置在本地运行了 prestd ,然而官方文档提供了非常丰富的配置参数来满足不同用户的需求,在做部署的时候,按需调参是必不可少的步骤。虽然官方文档已经非常清晰明了,但我觉得有些常用配置还是值得单独拿出来提一句。

注:下文中每次配置文件的修改都需要重启 prestd 才能生效。

用户授权配置

用户授权访问的启用需要同时配置 JWTAUTH

JWT

部署了 prestd 之后,在生产环境中,从安全的角度考虑,我们通常希望只允许有权限的人才能访问这些接口。我们可以在 prestd 的配置中启用 jwt ,要求所有的 http 请求都需要把授权令牌放在请求头中才可以访问,此时配置文件如下所示(本文所有配置文件的修改都基于这里的内容),将 jwt 部分的 default 改为了 true

migrations = "./migrations"

# debug = true
# enabling debug mode will disable JWT authorization

[http]
port = 3000

[jwt]
default = true

[pg]
host = "127.0.0.1"
user = "prest"
pass = "prest_pw"
port = 5432
database = "prestd"
single = true
## or used cloud factor
# URL = "postgresql://user:pass@localhost/mydatabase/?sslmode=disable"

[ssl]
mode = "disable"

此时再去尝试访问 /tables 就会出现未授权的错误,符合预期。

~ » curl http://localhost:3000/tables
{
	"error": "authorization token is empty"
}

AUTH

为了获得授权令牌,我们需要让 prestd 知道我们是哪个用户,说白了就是证明“我是我”的过程,而这个过程需要 auth 部分的配合,在上述配置文件中填入相关内容,

...
[auth]
enabled = true
type = "basic"
encrypt = "MD5"
table = "prestd_users"
username = "username"
password = "password"
...

enabled 参数顾名思义,用来控制是否启用该 auth 配置,其他参数的说明可以参见下表,

参数描述
type授权类型,分为 basicbody 两种。关于这两种授权方式可以参考这篇文档,其中 Bearer 即为这里的 body 类型
encrypt密码加密方式,目前支持 MD5SHA1 两种方式
table存放用户名和密码的 PostgreSQL 表
username上述 PostgreSQL 表中用于存放用户名的字段
password上述 PostgreSQL 表中用于存放加密后密码的字段,例如用户密码为“12345”,加密方式为 MD5 ,那么此列存放的值为“12345”的 MD5 827ccb0eea8a706c4c34a16891f84e7b

为了简单起见,这里的授权类型选择了 basic ,密码加密方式选择 MD5 ,在具体实践中应当针对自己的具体情况使用适合自己的配置。

psql 控制台中建表 prestd_users ,表中有两个字段 usernamepassword ,分别用于存放用户名和密码,

CREATE TABLE prest.prestd_users (
    username VARCHAR(32),
    password CHAR(32)
);

然后插入用户,为了说明方便,这里随便起个名字 alice ,密码为 “ password ”,其 MD5 值为 5f4dcc3b5aa765d61d8327deb882cf99如何用命令行为字符串生成正确的 MD5 值?),

INSERT INTO prestd_users VALUES ('alice', '286755fad04869ca523320acce0dc6a4');

用令牌访问 prestd 接口

首先通过 /auth 获得令牌,

~ » curl -i -X POST http://127.0.0.1:3000/auth --user "alice:password"
HTTP/1.1 200 OK
Content-Type: application/json
Date: Sat, 19 Mar 2022 22:36:02 GMT
Content-Length: 294

{"user_info":{"id":0,"name":"","username":"alice","metadata":null},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"}

然后用获取的令牌获得所有的数据表,

~ » curl http://localhost:3000/tables -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"schema":"prest","name":"persons","type":"table","owner":"prest"},
 {"schema":"prest","name":"persons_id_seq","type":"sequence","owner":"prest"},
 {"schema":"prest","name":"prestd_users","type":"table","owner":"prest"}]

缓存配置

prestd 也允许用户配置缓存以加速查询响应速度,它将 BuntDB 作为自己的缓存数据库,在收到一条请求时,优先去缓存中查找,如果结果存在则直接返回,不存在的话才去访问数据库,我们通常认为在简单查询方面 KV 数据库的响应速度要快于 SQL 查询,并且在正常的架构中缓存距离 API 比后台数据库(在我们这里是 PostgreSQL )更近,因此这样既减少了 API 返回时间,也降低了后台数据库的查询压力。如果 prestd 被部署用于大量查询,非常推荐配置缓存。

缓存的介绍在官网上讲解得比较详细,在此不再赘述每个参数的含义。仿照网上的例子,在配置文件中加入如下内容,

[cache]
enabled = true
time = 10
storagepath = "./"
sufixfile = ".cache.prestd.db"

    [[cache.endpoints]]
    endpoint = "/prestd/prest/persons"
    time = 5

在这里我们告诉 prestd ,需要缓存数据表 prest.persons 的全表扫描内容。接下来,我们在表中插入一条数据,

INSERT INTO persons (name, age, gender) VALUES ('Bob', 20, 'male');

然后发送几条请求比较一下 API 响应速度,

~ » curl http://localhost:3000/prestd/prest/persons -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"id":1,"name":"Bob","age":20,"gender":"male"}]%
------------------------------------------------------------
~ » curl http://localhost:3000/prestd/prest/persons -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySW5mbyI6eyJpZCI6MCwibWV0YWRhdGEiOm51bGwsIm5hbWUiOiIiLCJ1c2VybmFtZSI6ImFsaWNlIn0sImV4cCI6MTY0Nzc1MDk2MiwibmJmIjoxNjQ3NzUwOTYyfQ.PK-xPgRe0W4abaQmKlLuptruM49CvuLu1klDXGAY8q0"
[{"id":1,"name":"Bob","age":20,"gender":"male"}]

在 prestd 的输出日志上我们可以看到,响应速度的提升非常明显,访问缓存数据所花的时间只需要之前的大约三分之一。

...
[negroni] 2022-03-19T15:51:52-07:00 | 200 | 	 36.957871ms | localhost:3000 | GET /prestd/prest/persons
[negroni] 2022-03-19T15:51:56-07:00 | 200 | 	 13.677279ms | localhost:3000 | GET /prestd/prest/persons
...

参考资料

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据