前言
本文首先介绍了 Handle 的安装方式,并以默认方式启动了 Handle 服务,实现了本地标识解析的增删改查;然后针对默认 Handle 服务使用小众数据库 Berkeley DB 不利于调试和数据管理等问题,参考官方技术手册实现了将其迁移到更流行的 MySQL 数据库上,并对相关数据表进行分析介绍;最后针对未购买权威前缀无法本地授权调试的问题,通过分别配置本地客户端和服务端的运行方式,实现绕过 Handle 官方根节点进行本地授权登录,最终搭建起自己的全局根节点服务。
Handle 运行方式跟 DNS 系统一样,当你在客户端输入 Handle 标识并点击解析后,客户端会把带解析标识发送到预设 IP 地址进行解析,返回该 Handle 标识对应的次级服务节点或者最终服务节点,通过这种方式即可实现资源的解析查找。但由于 Handle 服务还没有流行起来,故很多场景下还需要依赖 DNS 服务实现,比如官方文档地址为 https://hdl.handle.net/20.1000/113 ,就是通过 DNS 系统定位 hdl.handle.net 来实现定位 Handle 服务。由于 Handle 新概念较多,本文一些名词进行简化,针对 27.700.200/ifantasy.net
:前缀即 27.700.200
,代表权威前缀、授权前缀、一级节点、二级节点;后缀即 ifantasy.net
,代表 Handle 解析记录、Handle 值。
部署及使用
实验环境
软件 | 版本 |
---|---|
OS | Windows 11 |
Java | 8 |
Handle | 9.3.0 |
Handle 启动
- 下载 Handle压缩包 到本地并解压至合适的文件夹。
其中主要文件及作用如下:bin
: Handle 官方的常用脚本文件。lib
: 被bin
中脚本调用的软件库。doc
: 接口文档。handle-9.3.0-src.zip
: 源码压缩包。admin.war
: 自带的 web 后台界面。
- 将解压文件夹的
bin
目录加入环境变量。
这里也可以不加入环境变量,只是每次需要输入bin
下对应脚本的路径比较麻烦,加入环境变量比较方便。 - 在任意目录(以
C:\CommonProject
目录为例)下打开命令行,执行hdl-setup-server.bat serv
。 过程中配置基本上都可以使用默认的,要注意两个 IP 地址要填客户端机器可以访问的地址,一般是本机局域网地址(最好不要填0.0.0.0
、localhost
、127.0.0.1
,会有证书、访问等问题),本例中为192.168.1.102
,过程中每个参数的说明参考 Handle本地调试及基础开发,结束后会发现本目录下多了一个serv
工作目录。 - 运行命令
hdl-server.bat serv
以启动 Handle 服务。 至此,即可在浏览器中访问自建的 Handle 解析页面http://192.168.1.102:8000/
、访问自带的管理页面http://192.168.1.102:8000/admin
,也可以解析官方注册的 Handle 标识。
添加 Handle 解析
上面的实验已经可以解析官方 Handle ,但是还没有我们自己的数据,在购买官方 Handle 前缀前我们是不可以通过以上管理页面直接添加自己的 Handle ,但是通过官方数据库工具 hdl-dbtool.bat 直接将 Handle 解析插入本地数据库实现。使用该工具前务必先退出上节运行的 Handle 服务。
- 启动数据库管理工具:
hdl-dbtool.bat serv
。 - 通过
Add Homed Prefix
添加前缀27
。 - 通过
Create Handle
添加后缀27/123
, 按照下图填写内容,然后依次确定即可。 此时点击List Handles
、List Homed Prefixes
可查到刚才添加的前缀和 Handle 值。 - 退出数据库工具的图形界面后,再次运行 Handle 服务:
hdl-server.bat serv
。 此时在前端页面输入27/213
已可以正常解析,默认会直接跳转到该 Handle 的 URL 值,解析时选中Don't Redirect to URLs
即可避免直接跳转。但管理页面输入刚才创建的 Handle 地址,发现无法解析,是因为管理页面模式使用官方服务器进行全局解析,按照下面步骤将其改成本地服务器解析即可。 - 在
Change this
下将Global
变为Source Server
。 此时管理员页面可以解析本地 Handle :
定制数据库
Handle 服务默认运行的数据库是历史悠久的 Berkeley DB 数据库,感觉该数据库有点类似于 SQLite ,是个轻量级的文件形式数据库,因此不需要额外安装任何软件即可直接使用,在 Handle 服务器中数据库文件在项目的 bdbje 目录下。在实际项目中当然不能使用这个数据库,毕竟陌生数据库不利于 Debug 和数据迁移,本节将实现把 Handle 服务中默认数据库 Berkeley DB 改为 MySQL ,相关内容参考官方手册 Technical Manual 中 [#8 Using Custom Handle Storage] 。
- 下载 Java 的 MySQL 驱动包 mysql-connector-java ,并将其放在上节解压的 Handle 目录下的
lib
目录下: 如果忽略这步仅仅按照官方文档配置的话后面会报java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
错误,这个问题我找了好久,毕竟谁能想到 Handle 将代码封装了一层又一层却没有准备 MySQL 驱动包呢,最终还是看源码找到了这个错误原因。 - 在 MySQL 中创建数据库
handle_test
,并在其下创建以下两个数据表:没错,handle背后的支撑就是这两个简单的数据表。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
create table nas ( na varchar(255) not null, PRIMARY KEY(na) ); create table handles ( handle varchar(255) not null, idx int4 not null, type blob, data blob, ttl_type int2, ttl int4, timestamp int4, refs blob, admin_read bool, admin_write bool, pub_read bool, pub_write bool, PRIMARY KEY(handle, idx) );
- 修改
serv
目录下的config.dct
文件,在其server_config
项下添加以下内容:1 2 3 4 5 6 7 8
"storage_type" = "sql" "sql_settings" = { "sql_url" = "jdbc:mysql://localhost:3306/handle_test" "sql_driver" = "com.mysql.jdbc.Driver" "sql_login" = "root" "sql_passwd" = "root" "sql_read_only" = "no" }
- 启动 Handle 服务:
hdl-server.bat serv
。
现在我们已经成功的更换了数据,此时再查询上节注册的 Handle 标识发现会为空,因为我们并没有向新数据库中插入数据。 - 创建新的 Handle 值:
上节中我们创建新数据是通过自带的数据库脚本hdl-dbtool.bat
实现,分析源码发现该工具只是通过调用 jar 包接口向数据库插入数据,在此我们选择另一种插入数据的方法——直接修改 MySQ L数据库:- 打开刚才创建的数据库
handle_test
,并直接向其中na
表插入数据72
:
- 打开表
handles
,直接向其中插入 Handle 值72/456
:
- 打开刚才创建的数据库
以上步骤完成后,即可在前台/后台页面查询到新插入的 Handle 记录 72/456
:
上面的实验完成后,我们成功的让 Handle 服务在 MySQL 数据库上启动,但这还远远不够,此时我们还无法通过正常渠道(客户端)添加解析后缀,因为我们缺少权威前缀授权。
自建全局根节点
如果你看过两个官方手册 Technical Manual 和 Handle Tool User Manual 的话会发现,很多功能开始之前都会加上一句类似的话: Before using this tool it is important that you read “How Your Prefix Was Set Up” in the Handle Technical Manual (http://hdl.handle.net/20.1000/105). 这是因为你没有通过 Handle 官网购买权威前缀,而在验证和开发阶段就购买权威前缀终是不太妥当(尽管官方提供申请免费前缀方法,但其手续繁琐令人止步),因此本节实现了另一种方法——即自建全局根节点,相关文档参考官方手册 Technical Manual 中 [#10 Configuring an Independent Handle Service] 。
修改客户端
首先说明一下 Handle 中客户端和服务端的区别,就像常规 C/S 架构,服务端主要提供数据管理服务、客户端提供用户操作数据的接口,Handle 中的网页端和 hdl-admintool 图形界面等都属于客户端,但本节客户端配置只对于 hdl-admintool 图形界面生效,也就是说生产使用时(只通过网页访问)应该可以不配置客户端。
- 复制
serv
目录下的siteinfo.json
到用户家目录下,并重命名为resolver_site
。 - 家目录下创建
local_nas
文件 ,其内容为*
。
修改服务端
- 使用
hdl-dbtool.bat
的Add Homed Prefix
添加本地管理前缀27
:
- 使用
hdl-dbtool.bat
的Create Handle
添加管理员 handle 记录24/ADMIN
:
注意:这里的后缀
24/ADMIN
的ADMIN
单词必须全大写(官方手册这样写,小写我还没试过),一般管理员默认index
值为300
,此处认证方式选择最简单的HS_SECKEY
,实际密码直接以TEXT
形式存入DATA
中即可。 - 修改
serv
目录下的config.dct
文件,在server_config
项的server_admins
和replication_admins
下添加站点新注册的管理员:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
"server_config" = { "server_admins" = ( "300:27/ADMIN" ) "replication_admins" = ( "300:27/ADMIN" ) "max_session_time" = "86400000" "this_server_id" = "1" "max_auth_time" = "60000" "server_admin_full_access" = "yes" "case_sensitive" = "no" "auto_homed_prefixes" = ( "0.NA/YOUR_PREFIX" ) "storage_type" = "sql" "sql_settings" = { "sql_url" = "jdbc:mysql://localhost:3306/handle_test" "sql_driver" = "com.mysql.jdbc.Driver" "sql_login" = "root" "sql_passwd" = "root" "sql_read_only" = "no" } }
- 启动 Handle 服务:
hdl-server.bat serv
。 - 打开网页后台界面,选择
Authorization
按钮并输入刚才注册的账号密码进行授权登录: - 此时已可通过王爷后台添加新解析:
除了上述通过网页管理员后台进行站点管理外,也可通过官方图形界面工具 hdl-admintool.bat
进行 Handle 管理:
- 命令行输入
hdl-admintool.bat
打开图形界面。 - 在主页面输入已注册的 Handle 标识再点击
Lookup
即可查询。 - 点击主页面
Authenticate
并输入管理员账号信息即可登录管理员。
- 认证成功后在主页面输入新 Handle 值即可进行标识添加。
参考
[1]: Handle.Net. Technical Manual, Handle.Net Version 9. handle.net. [2016-08-25]
[2]: osulibraries. handle-docker. github.com. [2016-08-25]
[3]: EUDAT-B2HANDLE. pyhandle. github.com. [2022-05-20]