一 部署准备

项目与参考

https://testerhome.com/topics/11897
https://github.com/brookshi/Hitchhiker
http://doc.hitchhiker-api.com/cn/installation/docker.html
https://docs.docker.com/compose/gettingstarted/
https://docs.docker.com/install/linux/linux-postinstall/
http://wiki.jikexueyuan.com/project/docker-technology-and-combat/commands.html

部署环境介绍

cmd@TR:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:    16.04
Codename:   xenial

本机系统一直作为工作机使用,所以您若完全照搬,可能会遇到一些组件依赖问题。遇到 error 您就搜索,多参考几篇方案择优排除掉即可。

以下将选取比较简单的 docker-compose 方式来快速部署 Hitchhiker,先尝鲜。

二 部署 Hitchhiker

cmd@TR:~$ sudo apt install docker.io
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:
  bridge-utils containerd runc ubuntu-fan
建议安装:
  debootstrap docker-doc rinse zfs-fuse | zfsutils
下列软件包将被【卸载】:
  docker-engine
下列【新】软件包将被安装:
  bridge-utils containerd docker.io runc ubuntu-fan
升级了 0 个软件包,新安装了 5 个软件包,要卸载 1 个软件包,有 0 个软件包未被升级。
需要下载 17.5 MB 的归档。
解压缩后将会空出 2,278 kB 的空间。
您希望继续执行吗? [Y/n] y


cmd@TR:~$ sudo apt install docker-compose 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
将会同时安装下列软件:
  python-backports.ssl-match-hostname python-cached-property python-docker python-dockerpty
  python-docopt python-funcsigs python-functools32 python-jsonschema python-mock python-pbr
  python-texttable python-websocket python-yaml
建议安装:
  python-funcsigs-doc python-mock-doc
下列【新】软件包将被安装:
  docker-compose python-backports.ssl-match-hostname python-cached-property python-docker
  python-dockerpty python-docopt python-funcsigs python-functools32 python-jsonschema python-mock
  python-pbr python-texttable python-websocket python-yaml
升级了 0 个软件包,新安装了 14 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 610 kB 的归档。
解压缩后会消耗 2,614 kB 的额外空间。
您希望继续执行吗? [Y/n] y

由于我是 win10+ubuntu16.04 双系统,当初只给 ubuntu16.04 一共 128GB,/home 58GB /分区 61 GB,用到目前 /home/cmd 当前用户空间所剩 16GB 怕以后麻烦。
所以,我直接到/分区 创建的 hitchhiker 目录。然后,根据个人习惯更改了所属用户组和用户。

cmd@TR:/$ sudo mkdir hitchhiker
cmd@TR:/$ ls -al|grep hitchhiker
drwxr-xr-x   2 root root  4096 2月   6 15:15 hitchhiker
cmd@TR:/$ sudo chown -R cmd:cmd hitchhiker
cmd@TR:/$ ls -al|grep hitchhiker
drwxr-xr-x   2 cmd  cmd   4096 2月   6 15:15 hitchhiker
# 从github上下载docker-compose.yml以及mysql.conf文件
cmd@TR:/hitchhiker$ curl -O https://raw.githubusercontent.com/brookshi/Hitchhiker/release/deploy/docker/hitchhiker_and_mysql/docker-compose.yml -O https://raw.githubusercontent.com/brookshi/Hitchhiker/release/deploy/docker/hitchhiker_and_mysql/hitchhiker-mysql.cnf
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   687  100   687    0     0    604      0  0:00:01  0:00:01 --:--:--   604
100   142  100   142    0     0    401      0 --:--:-- --:--:-- --:--:--   401
cmd@TR:/hitchhiker$ ls -al
总用量 16
drwxr-xr-x  2 cmd  cmd  4096 2月   6 15:18 .
drwxr-xr-x 25 root root 4096 2月   6 15:15 ..
-rw-rw-r--  1 cmd  cmd   687 2月   6 15:18 docker-compose.yml
-rw-rw-r--  1 cmd  cmd   142 2月   6 15:18 hitchhiker-mysql.cnf

按需修改配置

cmd@TR:/hitchhiker$ gedit docker-compose.yml
version: '2'
services:
  hitchhiker:
    image: registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.9
    container_name: hitchhiker
    environment:
      - HITCHHIKER_DB_HOST=hitchhiker-mysql
      - HITCHHIKER_APP_HOST=http://ip:port/ 
      # should change before deploying.
      # add environment variable
    ports:
      - "port:port"
      - "11010:11010"
    links:
      - hitchhiker-mysql:hitchhiker-mysql
  hitchhiker-mysql:
    image: mysql:5.7
    container_name: hitchhiker-mysql
    environment:
      - MYSQL_ROOT_PASSWORD=hitchhiker888
      - MYSQL_DATABASE=hitchhiker-prod
    volumes:
      - ./hitchhiker-mysql.cnf:/etc/mysql/conf.d/hitchhiker.cnf
      - /my/hitchhiker/sqldata:/var/lib/mysql

这里看官方说明和个人部署需求按需要更改,我只简单的改了
1 image: registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.9
2 ip 和 port ,ip 我 ubuntu 配置的是内网固定 ip.建议你先配置好固定 ip 不要采用随机 ip 地址。

配置环境变量介绍

我从官方提取出以下可供修改的环境变量

hitchhiker:
    environment:
      - HITCHHIKER_APP_HOST=http://localhost:6666/ # 修改为本机ip及端口
      - HITCHHIKER_APP_LANG  # 语言,目前只对邮件内容起作用
      - HITCHHIKER_SYNC_ONOFF # 是否支持同步
      - HITCHHIKER_SYNC_INTERVAL # 同步间隔,单位(秒)
      - HITCHHIKER_DEFAULT_HEADERS # 请求默认带的headers
      - HITCHHIKER_SCRIPT_TIMEOUT # 脚本执行时间(毫秒)
      - HITCHHIKER_SAFE_VM # 是否使用安全脚本
      - HITCHHIKER_ENABLE_UPLOAD # 是否支持上传脚本和数据
      - HITCHHIKER_APP_INVITE_DIRECTLY # 不通过邮件验证来邀请成员

      - HITCHHIKER_DB_HOST # mysql 的host
      - HITCHHIKER_DB_PORT # mysql端口
      - HITCHHIKER_DB_USERNAME # mysql 用户名

      - HITCHHIKER_SCHEDULE_DURATION # schedule 监测时间间隔(秒)
      - HITCHHIKER_SCHEDULE_STORE_UNIT # schedule 存储的单位,支持按个数存 count 和按天存: day
      - HITCHHIKER_SCHEDULE_COUNT # schedule 存储的大小
      - HITCHHIKER_SCHEDULE_STORE_CONTENT # schedule record response 是否存储, all表示所有都存下来, forFail表示只存失败的, none表示都不存(这会很大影响数据库大小和性能)
      - HITCHHIKER_SCHEDULE_PAGESIZE # schedule record 在浏览器端显示的一页的个数 
      - HITCHHIKER_SCHEDULE_MAILFORFAIL # 只在失败时发邮件

      - HITCHHIKER_STRESS_COUNT # 压力测试表最大长度
      - HITCHHIKER_STRESS_PORT # 压力测试的端口
      - HITCHHIKER_STRESS_UPDATE_INTERVAL # 压力测试实时更新时的间隔(毫秒)  

      - HITCHHIKER_MAIL_CUSTOM #是否需要自定义mail,可以使用 "api" 或 "smtp"
      - HITCHHIKER_MAIL_API # custom为"api"时会使用这个mail接口, Hitchhiker会post {target, subject, content}到这个接口
      - HITCHHIKER_MAIL_SMTP_HOST # "smtp.qq.com"
      - HITCHHIKER_MAIL_SMTP_PORT 
      - HITCHHIKER_MAIL_SMTP_TLS # 是否需要走tls加密
      - HITCHHIKER_MAIL_SMTP_USER # smtp用户名  "***@qq.com"
      - HITCHHIKER_MAIL_SMTP_PASS # smtp密码
      - HITCHHIKER_MAIL_SMTP_From # 发邮件的邮箱,默认空会使用user
      - HITCHHIKER_MAIL_SMTP_NICKNAME # nickname昵称
      - HITCHHIKER_MAIL_SMTP_RU # 证书验证不通过时是否报错

      - MYSQL_ROOT_PASSWORD=hitchhiker888  # mysql密码
      - MYSQL_DATABASE=hitchhiker-prod # mysql 数据库

然后满怀欢喜开始,走你~~~~结果遇到下边错误

cmd@TR:/hitchhiker$ sudo docker-compose up -d
[sudo] cmd 的密码: 
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

不要紧,遇到什么搜什么,知道原来是 docker server 底层依赖服务需要先启动

cmd@TR:/hitchhiker$ service docker start

继续,截选部分日志

cmd@TR:/hitchhiker$ sudo docker-compose up -d
[sudo] cmd 的密码: 
Pulling hitchhiker-mysql (mysql:5.7)...
5.7: Pulling from library/mysql
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.9
Creating hitchhiker-mysql
Creating hitchhiker

测试 hitchhiker 服务是否通

cmd@TR:/hitchhiker$ curl http://ip:port/
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="shortcut icon" href="./favicon.ico"><title>Hitchhiker API</title><link href="./static/css/main.b825d6e7.css" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="./static/js/main.200fd664.js"></script></body></html>

然后用 firefox 或 chrome 即可访问到http://ip:port/ 该主页了。

三 部分问题解决

以上是临下班前弄的,弄好访问到主页后即关机下班了。
第二天启动主机后,curl http://ip:port/ 不通
那应该是 docker 未添加系统自启动 daemon 服务,docker 服务未正常随系统自启动并提供底层服务。

cmd@TR:/hitchhiker$ service docker start  
#这一步会两次弹窗提示你 "需要通过认证才能启动docker.socket"  和 “需要通过认证才能启动docker.service”  来执行docker相关服务  

cmd@TR:~$ service docker status
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)
   Active: active (running) since 三 2018-02-07 08:27:16 CST; 2s ago
     Docs: https://docs.docker.com
 Main PID: 7179 (dockerd)
    Tasks: 26
   Memory: 68.9M
      CPU: 535ms
   CGroup: /system.slice/docker.service
           ├─7179 /usr/bin/dockerd -H fd://
           └─7232 containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=

2月 07 08:27:12 TR dockerd[7179]: time="2018-02-07T08:27:12.528391931+08:00" level=info msg="Loading containers
2月 07 08:27:13 TR dockerd[7179]: time="2018-02-07T08:27:13.512621856+08:00" level=info msg="Firewalld running:
2月 07 08:27:14 TR dockerd[7179]: time="2018-02-07T08:27:14.916624296+08:00" level=info msg="Default bridge (do
2月 07 08:27:15 TR dockerd[7179]: time="2018-02-07T08:27:15.304831501+08:00" level=info msg="Loading containers
2月 07 08:27:16 TR dockerd[7179]: time="2018-02-07T08:27:16.450245104+08:00" level=warning msg="failed to retri
2月 07 08:27:16 TR dockerd[7179]: time="2018-02-07T08:27:16.581379525+08:00" level=warning msg="failed to retri
2月 07 08:27:16 TR dockerd[7179]: time="2018-02-07T08:27:16.604540073+08:00" level=info msg="Daemon has complet
2月 07 08:27:16 TR dockerd[7179]: time="2018-02-07T08:27:16.604595466+08:00" level=info msg="Docker daemon" com
2月 07 08:27:16 TR dockerd[7179]: time="2018-02-07T08:27:16.614947535+08:00" level=info msg="API listen on /var
2月 07 08:27:16 TR systemd[1]: Started Docker Application Container Engine.

然后到 hitchhiker 目录 启动 hitchhiker 镜像服务

cmd@TR:/hitchhiker$ docker-compose start 
Starting hitchhiker-mysql ... 
Starting hitchhiker ... error
ERROR: for hitchhiker-mysql  ('Connection aborted.', error(13, 'Permission denied'))
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?
If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

遇到了一个错误,去搜索了下,学习了下 docker 部署的相关问题。


https://stackoverflow.com/questions/29101043/cant-connect-to-docker-from-docker-compose
Post-installation steps for Linux

This section contains optional procedures for configuring Linux hosts to work better with Docker.

Manage Docker as a non-root user

The docker daemon binds to a Unix socket instead of a TCP port. By default that Unix socket is owned by the user root and other users can only access it using sudo. The docker daemon always runs as the root user.

If you don’t want to use sudo when you use the docker command, create a Unix group called docker and add users to it. When the docker daemon starts, it makes the ownership of the Unix socket read/writable by the docker group.

To create the docker group and add your user:

# 1. Create the docker group.
$ sudo groupadd docker

# 2. Add your user to the docker group.
$ sudo usermod -aG docker $USER

# 3. Log out and log back in so that your group membership is re-evaluated.

# 4. Verify that you can run docker commands without sudo.
$ docker run hello-world
This command downloads a test image and runs it in a container. When the container runs, it prints an informational message and exits.



http://www.linuxidc.com/Linux/2017-06/144717.htm

6.可选配置

6.1 创建一个docker组

  docker后台进程是绑定的Unix的socket而不是TCP端口。默认情况下,Unix的socket属于用户root,其它用户要使用要通过sudo命令。由于这个原因,docker daemon通常使用root用户运行。
  为了避免使用sudo当你使用docker命令的时候,创建一个Unix组名为docker并且添加用户。当docker daemon启动,它会分配Unix socket读写权限给所属的docker组。
  注意:docker组不等价于用户root,如果想要知道的更多关于安全影响,查看docker daemon attack surface。
  sudo groupadd docker
  sudo usermod -aG docker $USER
  退出再重进,确保该用户有正确的权限。
  校验生效,通过运行docker命令不带sudo:docker run hello-world,如果失败会有以下类似的信息:Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?确保DOCKER_HOST环境变量没有设置。如果有取消它。

参考以上按照这个执行了
sudo groupadd docker

sudo usermod -aG docker $USER
再执行 docker run hello-world 检查

cmd@TR:~$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly

好了,然后就可以正常开启

#然后还是要先start docker service
cmd@TR:/hitchhiker$ service docker restart 

# 到hitchhiker下启动hitchhiker服务
cmd@TR:/hitchhiker$ docker-compose start 
Starting hitchhiker-mysql ... done
Starting hitchhiker ... done

马上测试连接
cmd@TR:/hitchhiker$ curl http://ip:port/
curl: (7) Failed to connect to ip port port: 拒绝连接

#等了一会就又好了?
cmd@TR:/hitchhiker$ curl http://ip:port/
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="shortcut icon" href="./favicon.ico"><title>Hitchhiker API</title><link href="./static/css/main.b825d6e7.css" rel="stylesheet"></head><body><div id="root"></div><script type="text/javascript" src="./static/js/main.200fd664.js"></script></body></html>

常用 docker-compose 命令

http://wiki.jikexueyuan.com/project/docker-technology-and-combat/commands.html


#列出所有容器
cmd@TR:~$ docker-compose ps
ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?
        Supported filenames: docker-compose.yml, docker-compose.yaml

#需要在 /hitchhiker 目录下执行

cmd@TR:/hitchhiker$ docker-compose ps
      Name                   Command             State                             Ports                            
-------------------------------------------------------------------------------------------------------------------
hitchhiker         pm2-docker index.js           Up      0.0.0.0:11010->11010/tcp, 8080/tcp, 0.0.0.0:9146->9146/tcp 
hitchhiker-mysql   docker-entrypoint.sh mysqld   Up      3306/tcp 


#停止容器服务

cmd@TR:/hitchhiker$ docker-compose stop
Stopping hitchhiker ... done
Stopping hitchhiker-mysql ... done

四 添加 docker 服务自启动 daemon 服务

这套很熟,找到以前自己添加 daemon 服务的 wiki,搞之。
添加 docker 随当前登录账号自启动服务.在 ubuntu 系的类似发行版中(还有 kali)

runlevel 显示上次的运行级别和当前的运行级别,“N” 表示没有上次的运行级别

cmd@TR:~$ runlevel
 N 5 

rcconf 是提供当前用户 runlevel 的启动服务 daemon 配置,rcconf 只会修改你当前用户运行级别的启动项

cmd@TR:~$ sudo rcconf

在 ubuntu 系的类似发行版中(还有 kali),sysv-rc-conf 提供 runlevel0-6 所有级别的启动服务选项配置:

cmd@TR:~$ sudo sysv-rc-conf

https://docs.docker.com/install/linux/linux-postinstall/ 这是官方的,附上大家参考
OK 啦,这样就部署好啦。

五 简单使用体验

和 postman 的使用高度相像,我用起来问题不大。
简单迁移过来一个请求
这是 Hitchhiker

这是 postman

这个 给手工业务测试人员 用会好一些 .
场景是这样的 , 边做集成或系统测试期间 ,就可以弄一些接口测试 , 这样后期发版回归微调后 , 以后再发版就可以 继续微维护了 .
手工业务测试人员 做些接口测试 对服务理解也有好处 对服务业务实现逻辑梳理也有好处.鉴于 postman 是付费才可用一些高级功能,Hitchhiker 无疑是一个好的替代品。

六 stress test 压力测试的部署

其它小节使用不难,照着官方 doc 帮助即可顺利执行到压力测试。这里需要详细说下。
(补充更正:目前 0.9 版本的,已经不用这个 Hitchhiker-Node 做压力端了,这个是 go 语言写的。作者已经内置 nodejs 实现的压力端了,不用配置该节了,直接界面 Run now 即可发压力)
1 先创建 stress test

2 部署 Hitchhiker-Node
去下载 https://github.com/brookshi/Hitchhiker-Node/releases 下的 linux_64.zip
解压到某目录下后,如下:

cmd@TR:~$ cd Hitchhiker-Node/

cmd@TR:~/Hitchhiker-Node$ ls -al
总用量 9860
drwxrwxr-x   2 cmd cmd     4096 2月   7 17:15 .
drwxr-xr-x 100 cmd cmd     4096 2月   7 17:15 ..
-rw-rw-r--   1 cmd cmd       64 2月   7 17:16 config.json
-rw-rw-r--   1 cmd cmd 10081261 10月 29 22:25 Hitchhiker-Node_linux_amd64

#Hitchhiker-Node_linux_amd64 默认权限 664 无法执行。需要 更改为 755 或775 
cmd@TR:~/Hitchhiker-Node$ sudo chmod 755 Hitchhiker-Node_linux_amd64 
[sudo] cmd 的密码: 

cmd@TR:~/Hitchhiker-Node$ ls -al
总用量 9860
drwxrwxr-x   2 cmd cmd     4096 2月   7 17:15 .
drwxr-xr-x 100 cmd cmd     4096 2月   7 17:15 ..
-rw-rw-r--   1 cmd cmd       64 2月   7 17:16 config.json
-rwxr-xr-x   1 cmd cmd 10081261 10月 29 22:25 Hitchhiker-Node_linux_amd64

修改 config.json localhost 为你当初部署 Hitchhiker 设置的 IP

{
    "Address": "ip:11010",
    "Interval": 10
}

3 启动 Hitchhiker-Node

cmd@TR:~/Hitchhiker-Node$ ./Hitchhiker-Node_linux_amd64 
info: 2018/02/07 17:20:09 main.go:12: set max procs:  8
info: 2018/02/07 17:20:09 client.go:51: read config
info: 2018/02/07 17:20:09 client.go:66: connect: success
info: 2018/02/07 17:20:09 client.go:120: send request run result 0
info: 2018/02/07 17:20:09 client.go:68: status: idle

4 手动点击执行
Run now 立即执行后,Hitchhiker-Node 便可接收到请求,并产生压力
结果见图

七 利用 firefox 写请求脚本

我的 firefox 版本

直接按 F12,开启调试控制台(firebug 已经在最新的去掉了)
切到网络监视器
操作页面。填写注册内容,提交注册请求后,抓取到该请求。点击 “编辑和重发”

进入编辑和重发,分别复制请求头 Headers 和请求体 Body 内容。

分别复制到 Hitchhiker 对应 Request 的 Headers 和 Body

在 Request 下的 Test 下简单编写断言,从右侧直接点即可。

当然还有其他很多的方式,比如还有 firefox 和 chrome F12 选中请求右键的,复制为 curl。hitchhiker 有个直接导入 curl 命令的功能。

八 docker 容器的维护

主要是 docker 的 docker-compose 命令 和容器内的 nodejs 系里边的 pm2 命令。这个我也是现搜索,学习的。
如何进入 hitchhiker 容器 与 如何查看容器内 hitchhiker 实时操作日志
话不多说,也都是现学现查,现弄明白的,直接上命令。

#先查到Name hitchhiker  下边 docker exec 要接
cmd@TR:/hitchhiker$ docker-compose ps
      Name                   Command             State                             Ports                            
-------------------------------------------------------------------------------------------------------------------
hitchhiker         pm2-docker index.js           Up      0.0.0.0:11010->11010/tcp, 8080/tcp, 0.0.0.0:9146->9146/tcp 
hitchhiker-mysql   docker-entrypoint.sh mysqld   Up      3306/tcp

#进入hitchhiker容器内                                                   
cmd@TR:/hitchhiker$ docker exec -it hitchhiker bash

#默认到了该目录 看看有啥
root@ad0e1f6acb76:/usr/src/Hitchhiker/build# ls
common       global_data  index.js.map  logs  middlewares  pm2.json  run_engine  setup.js      utils
controllers  index.js     interfaces    mail  models       public    services    setup.js.map

#找到了logs目录 进之
root@ad0e1f6acb76:/usr/src/Hitchhiker/build# cd logs

#发现个日志,老方法 tail -f 之 走你~~~
root@ad0e1f6acb76:/usr/src/Hitchhiker/build/logs# ls -al
total 4240
drwxr-xr-x  2 root root    4096 Feb  6 10:05 .
drwxr-xr-x 15 root root    4096 Feb  6 10:05 ..
-rw-r--r--  1 root root 4327792 Feb  8 08:25 log_file.log

root@ad0e1f6acb76:/usr/src/Hitchhiker/build/logs# tail -f log_file.log 

查看输出内容后,确认无误,应该是容器 hitchhiker 的服务实时操作日志。

九 docker 容器内容的更新

更新 docker Hitchhiker 容器内容
只需要到

cmd@TR:/hitchhiker$ ls -al
总用量 16
drwxr-xr-x 2 cmd cmd 4096 2 月 6 15:46 .
drwxr-xr-x 26 root root 4096 2 月 27 18:53 ..
-rw-rw-r-- 1 cmd cmd 734 2 月 6 15:46 docker-compose.yml
-rw-rw-r-- 1 cmd cmd 142 2 月 6 15:18 hitchhiker-mysql.cnf

修改 docker-compose.yml 的版本号 v0.10 为 hitchhiker 最新的
hitchhiker:image: registry.cn-hangzhou.aliyuncs.com/brook/hitchhiker-cn:v0.10

再执行该句 就会自动更新容器内容
cmd@TR:/hitchhiker$ sudo docker-compose up -d


↙↙↙阅读原文可查看相关链接,并与作者交流