前言
本文首先介绍了 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压缩包 到本地并解压至合适的文件夹。
Handle 目录结构 bin
: Handle 官方的常用脚本文件。lib
: 被bin
中脚本调用的软件库。doc
: 接口文档。handle-9.3.0-src.zip
: 源码压缩包。admin.war
: 自带的 web 后台界面。
- 将解压文件夹的
bin
目录加入环境变量。
这里也可以不加入环境变量,只是每次需要输入bin
下对应脚本的路径比较麻烦,加入环境变量比较方便。 - 在任意目录(以
C:\CommonProject
目录为例)下打开命令行,执行hdl-setup-server.bat serv
。安装服务 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 前缀前我们是不可以通过以上管理页面直接添加自己的 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
。运行 Handle 服务 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 的 MySQL 驱动包 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" }
配置 config.dct - 启动 Handle 服务:
hdl-server.bat serv
。
现在我们已经成功的更换了数据,此时再查询上节注册的 Handle 标识发现会为空,因为我们并没有向新数据库中插入数据。 - 创建新的 Handle 值:
上节中我们创建新数据是通过自带的数据库脚本hdl-dbtool.bat
实现,分析源码发现该工具只是通过调用 jar 包接口向数据库插入数据,在此我们选择另一种插入数据的方法——直接修改 MySQ L数据库:
以上步骤完成后,即可在前台/后台页面查询到新插入的 Handle 记录 72/456
:
自建全局根节点
如果你看过两个官方手册 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 图形界面生效,也就是说生产使用时(只通过网页访问)应该可以不配置客户端。
修改服务端
- 使用
hdl-dbtool.bat
的Add Homed Prefix
添加本地管理前缀27
:
添加本地管理前缀 - 使用
hdl-dbtool.bat
的Create Handle
添加管理员 handle 记录24/ADMIN
:
添加管理员 handle 注意:这里的后缀
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
即可查询。查询 ADMIN - 点击主页面
Authenticate
并输入管理员账号信息即可登录管理员。
登录管理员 - 认证成功后在主页面输入新 Handle 值即可进行标识添加。
标识添加 标识添加2
参考
[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]