当我们需要对Answer的功能做一些扩展时,例如OAuth登录,我们设计了一种使用插件的方式来实现这些功能。
介绍
官方插件
您可以在[此处]找到官方支持的 Answer 插件列表(https://github.com/apache/incubator-answer-plugins).
插件类型
我们将插件分为不同的类型。不同类型的插件有不同的功能。同一类型的插件具有相同的效果,但实现方式不同。
- Connector:Connector插件帮助我们实现第三方登录功能。例如
GitHub OAuth 登录 - 存储:存储插件帮助我们将文件上传到第三方存储。 (预览)
- 缓存:支持使用不同的缓存中间件。例如
Redis(预览) - 过滤:过滤掉非法问题或答案。 (即将推出)
- 渲染:不同内容格式的解析器。 (即将推出)
- Finder:支持使用搜索引擎加速搜索问题答案。 (即将推出)
建造
答案二进制文件支持将不同的所需插件打包到二进制文件中。
先决条件
命令
我们使用 Answer 二进制文件提供的
build命令来重建带有插件的 Answer 版本。
例如,让我们看看如何构建包含 github 第三方登录插件的 Answer 二进制文件。
# answer build --with [plugin@plugin_version=[replacement]] --output [file]$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github# build a new answer with github login plugin then output to ./new_answer.$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0 --output ./new_answer# with multiple plugins$ ./answer build \--with github.com/apache/incubator-answer-plugins/connector-github \--with github.com/apache/incubator-answer-plugins/connector-google# with local plugins$ ./answer build --with github.com/apache/incubator-answer-plugins/connector-github@1.0.0=/my-local-space# cross compilation. Build a linux-amd64 binary in macos$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github# specify the answer version using ANSWER_MODULE environment variable$ ANSWER_MODULE=github.com/apache/incubator-answer@v1.2.0-RC1 ./answer build --with github.com/apache/incubator-answer-plugins/connector-github
您可以使用
plugin命令列出当前包含插件的二进制文件。
$ ./new_answer plugin# output# github connector[0.0.1] made by answerdev# google connector[0.0.1] made by answerdev
构建docker镜像与插件从回答基础镜像
您可以按照上述步骤先使用插件构建二进制文件,然后构建包含该二进制文件的 docker 镜像。当然,您也可以直接在原始图像之上构建。
FROM apache/answer as answer-builderFROM golang:1.19-alpine AS golang-builderCOPY --from=answer-builder /usr/bin/answer /usr/bin/answerRUN apk --no-cache add \build-base git bash nodejs npm go && \npm install -g pnpm@8.9.2RUN answer build \--with github.com/apache/incubator-answer-plugins/connector-basic \--with github.com/apache/incubator-answer-plugins/storage-s3 \--with github.com/apache/incubator-answer-plugins/search-elasticsearch \--output /usr/bin/new_answerFROM alpineLABEL maintainer="linkinstar@apache.org"ARG TIMEZONEENV TIMEZONE=${TIMEZONE:-"Asia/Shanghai"}RUN apk update \&& apk --no-cache add \bash \ca-certificates \curl \dumb-init \gettext \openssh \sqlite \gnupg \tzdata \&& ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \&& echo "${TIMEZONE}" > /etc/timezoneCOPY --from=golang-builder /usr/bin/new_answer /usr/bin/answerCOPY --from=answer-builder /data /dataCOPY --from=answer-builder /entrypoint.sh /entrypoint.shRUN chmod 755 /entrypoint.shVOLUME /dataEXPOSE 80ENTRYPOINT ["/entrypoint.sh"]
您可以更新 —with 参数以添加更多您需要的插件。
# create a Dockerfile and copy the content above$ vim Dockerfile$ docker build -t answer-with-plugin .$ docker run -d -p 9080:80 -v answer-data:/data --name answer answer-with-plugin
第三方插件
我们推荐使用官方插件,如果您想使用第三方插件,请参考以下内容。
- 如果第三方插件是公开可用的,您可以像官方插件一样使用它进行构建。
- 如果第三方插件是私有的,您需要下载它然后使用它进行构建。
用法
带有插件版本的答案的使用方式与以前相同。您可以在管理页面中找到该插件的配置。

升级
注意,如果是从非插件版本升级到插件版本,还需要执行升级命令(也算升级)。
您需要使用新的插件版本构建新的答案二进制文件,然后用新的答案替换旧的答案二进制文件。与普通升级一样,您需要根据部署方式执行不同的升级步骤。例如,如果您使用二进制部署,则需要执行“upgrade”命令。
开发和贡献
详情请参阅文档。
设计与原理
由于Golang是静态语言,没有友好的插件机制。因此,我们不使用动态方法,而是使用重新编译进行部署。详情请参阅博客。
