consul注册中心与容器自动发现实战

consul简介

Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等)。

consul特点

1. 服务发现
Consul 允许服务实例(即服务的运行时实体)注册自己到 Consul 集群中。一旦注册,其他服务就
可以通过 Consul 使用 DNS 或者 HTTP 接口来查找并访问这些服务。这使得服务之间的交互变得简单
且透明,无需硬编码服务位置,增强了服务的弹性和灵活性。2. 健康检查
Consul 支持定义健康检查规则,用于监控服务实例的健康状况。健康检查可以是与特定服务相关的
(例如,检查一个 web 服务器是否能正确返回 HTTP 200 OK 状态码)。如果检测到服务实例不再
健康,Consul 可以标记该实例为不可用,从而避免将请求路由到该实例上,提高了系统的可靠性。3. KV 存储
Consul 提供了一个简单的 HTTP API 来访问其内置的键值存储功能。这可以被用来存储和分发服务
配置、特征标志、协调任务执行等。键值存储也可以用于选举集群中的领导者,或者用于服务间的数据
交换。这种灵活性使得 Consul 成为了一个多功能工具,在微服务架构中可以承担多种职责。4. 安全服务通信
Consul 还支持生成和分发服务之间的 TLS 证书,促进服务之间建立相互认证的安全连接。此外,
Consul 引入了意图(Intentions)的概念,允许管理员定义哪些服务可以互相通信,从而增加了网络
层面的安全控制。5. Web 管理界面
Consul 自带了一个直观的 Web 界面,这使得服务注册、健康检查、配置管理等功能更加易用。通过
这个界面,管理员可以实时查看服务的状态,监控集群的健康情况,并进行必要的配置调整。这对于
调试和日常运维来说是一个非常有用的工具。

Consul 角色

Server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网
与其它数据中心通讯。 每个数据中心的 Server 数量推荐为 3 个或是 5 个。
​
Client: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。

Consul的服务注册与发现流程

  1. 服务注册:服务实例启动时,其Agent会向Consul注册服务。注册时需要提供服务的名称、地址、端口和其他元数据信息。
  2. 健康检查:注册后,Consul会定期向该服务实例发送健康检查请求,以验证服务的可用性和健康状态。检查结果会被汇报给Consul Server,并在集群中同步更新。
  3. 服务发现:客户端应用程序通过向Consul查询服务注册表来发现可用的服务实例。Consul会返回包含所有符合查询条件的服务实例列表,应用程序可以根据需要选择其中的一个实例进行通信。

部署模式

  • 单机部署:适用于小型环境和测试场景,将Consul的Agent和Server部署在同一节点上。
  • 集群部署:适用于生产环境和大规模部署,通过部署多个Consul Server节点来提高系统的可用性和容错能力。
  • 多数据中心部署:对于全球性的分布式系统,可以在不同地理位置部署多个Consul集群,并通过WAN(广域网)连接来实现多数据中心之间的服务发现和配置同步。

实验原理

在安装容器的服务器上面安装registrator容器,用于服务的发现和注册,将运行中的容器添加到consul注册中心。注册中心对服务进行健康检测,当发现有不运行的服务时会自动从注册中心移除,nginx利用自动同步模块从consul获取数据并自动生成upstream配置文件。

实验流程

  1. 准备环境

    在服务器上安装 Docker 和 Consul。启动 Consul 代理,确保各服务器之间能够相互通信。
  2. 安装 Registrator

    使用 Docker 启动 Registrator 容器,并配置其监听 Docker 事件并向 Consul 发送服务注册信息。
  3. 启动服务容器

    使用 docker run 命令启动服务容器,并确保 Registrator 正确注册这些服务到 Consul。
  4. 配置 Nginx 自动同步模块

    • 配置 Nginx 使用自动同步模块从 Consul 获取服务信息,并自动生成 upstream 配置。
    • 测试 Nginx 是否能够正确地根据 Consul 中的服务信息更新其配置。

实验环境准备三台机器

192.168.157.131 主机名修改:consul-nginx-server
192.168.157.128 主机名修改:docker-01
192.168.157.134 主机名修改:docker-02

安装consul注册中心

单机与集群

集群--略

这里以单机部署为例

[root@consul-nginx-server ~]# mkdir /data/consul/{conf,data} -p
[root@consul-nginx-server ~]# wget https://releases.hashicorp.com/consul/1.13.1/consul_1.13.1_linux_amd64.zip
[root@consul-nginx-server ~]# unzip consul_1.13.1_linux_amd64.zip
[root@consul-nginx-server ~]# mv consul /data/consul/

生成consul加密的密钥串

[root@consul-nginx-server consul]# /data/consul/consul keygen
zFhxl6ETOsrIC7w/WynGoWYe74oUIU69SJl3dRaM4Wg=

创建配置文件

[root@consul-nginx-server consul]# cat /data/consul/conf/config.json
{
"bootstrap_expect": 1,
"client_addr": "0.0.0.0",
"bind_addr": "{{GetInterfaceIP \"ens33\"}}", #指定网卡
"datacenter": "webapp",
"data_dir": "/data/consul/data",
"pid_file": "/data/consul/consul.pid",
"domain": "consul",
"enable_script_checks": true,
"dns_config": {
"enable_truncate": true,
"only_passing": true
},
"disable_update_check": true,
"enable_syslog": true,
"encrypt": "zFhxl6ETOsrIC7w/WynGoWYe74oUIU69SJl3dRaM4Wg=", #指定刚刚生成的加密密钥
"leave_on_terminate": true,
"log_level": "INFO",
"rejoin_after_leave": true,
"server": true,
"start_join": [
"192.168.209.166"    #ip地址修改为自己的
],
"ui": true #开启consul管理界面
}
启动consul
[root@consul-nginx-server consul]# nohup /data/consul/consul agent -server -config-dir /data/consul/conf > /data/consul/nohup_consul.log 2>&1 &
​
查看端口
[root@consul-nginx-server consul]# netstat -lntp | grep consul
tcp        0      0 192.168.157.131:8300    0.0.0.0:*      LISTEN      1215/consul         
tcp        0      0 192.168.157.131:8301    0.0.0.0:*      LISTEN      1215/consul         
tcp        0      0 192.168.157.131:8302    0.0.0.0:*      LISTEN      1215/consul         
tcp6       0      0 :::8500                 :::*           LISTEN      1215/consul         
tcp6       0      0 :::8600                 :::*           LISTEN      1215/consul 
​端口解释
8300:集群节点;
8301:集群内部访问的端口;
8302:跨数据中心之间的通信;
8500:访问界面

http://192.168.157.131:8500/

 

consul安装完成

安装docker服务器

192.168.157.128 主机名修改:docker-01
192.168.157.134 主机名修改:docker-02
两台机器安装docker--略

Registrator 服务会检查应用服务容器的运行状态,进行自动注册和注销 docker 容器服务到服务注册中心Consul上。目前支持与 Consul、etcd 和 SkyDNS2等软件进行整合。

Registrator监控新建的Docker容器,并且检查判定这些容器提供的服务。Registrator在容器内发现的任务服务,都将被添加到一个服务注册端,比如Consul或etcd。

在要注册容器服务到etcd或consul中的主机安装docker

[root@docker-01 ~]# docker pull gliderlabs/registrator
[root@docker-02 ~]# docker pull gliderlabs/registrator

运行registrator容器

[root@docker-01 ~]# docker run -itd --name registrator --restart=always -v /var/run/docker.sock:/tmp/docker.sock --net host docker.io/gliderlabs/registrator --ip 192.168.157.128 consul://192.168.157.131:8500
[root@docker-02 ~]# docker run -itd --name registrator --restart=always -v /var/run/docker.sock:/tmp/docker.sock --net host docker.io/gliderlabs/registrator --ip 192.168.157.134 consul://192.168.157.131:8500

命令解释

Docker选项
-v /var/run/docker.sock:/tmp/docker.sock
#允许Registrator访问Docker API
--net=host
#帮助Registrator获取主机级的IP和主机名
与设置主机网络模式相比,另一个可选的方案是设置容器名字为宿主主机名(-h $HOSTNAME),并且使用下面Registrator的-ip选项。
Registrator选项
--ip "192.168.157.131
#强制设置注册服务使用的IP地址,默认使用宿主机IP
-cleanup=true
#清理悬挂服务,容器状态为非up状态时进行清理,默认情况下是删除容器时清理,停止时不清理
consul://192.168.157.131:8500
#注册后端consul服务注册地址

运行容器指定服务名称

服务名是你在服务发现查找中使用的。缺省情况下,服务名按下面的格式确定:

使用容器镜像的基础,如果镜像是gliderlabs/footbar,服务名就是footbar。如果镜像是redis,服务名就是简单的redis

而且如果一个容器有多个暴露端口,它将各自追加内部暴露端口以区别。例如,一个镜像nginx有两个暴露端口,80和443,将产生两个服务,分别命名nginx-80nginx-443

你可以使用标签或者环境变量,SERVICE_NAME或者'SERVICE_x_NAME',其中x是内部暴露端口,覆盖这些缺省名字。

docker run -itd -p 80:80 --name web01 \
-e "SERVICE_NAME=webservices" \
nginx

运行容器进行服务注册指定健康检查

通过设置环境变量指定健康检查为http

[root@docker-01 ~]# docker run -itd -p 80:80 --name web01 -e SERVICE_NAME=webapp -e SERVICE_80_CHECK_HTTP=/index.html -e SERVICE_80_CHECK_INTERVAL=10s -e SERVICE_TAGS=Web01-80 daocloud.io/library/nginx
​
[root@docker-02 ~]# docker run -itd -p 80:80 --name web02 -e SERVICE_NAME=webapp -e SERVICE_80_CHECK_HTTP=/index.html -e SERVICE_80_CHECK_INTERVAL=10s -e SERVICE_TAGS=Web02-80 daocloud.io/library/nginx

运行服务容器,通过设置环境变量指定健康检查为TCP

[root@docker-01 ~]# docker run -itd -p 18080:80 --name web02 -e SERVICE_NAME=webapp -e SERVICE_CHECK_TCP=192.168.157.128:18080 -e SERVICE_CHECK_INTERVAL=5s -e SERVICE_TAGS=Web01-18080 daocloud.io/library/nginx
​
[root@docker-02 ~]# docker run -itd -p 18080:80 --name web01 -e SERVICE_NAME=webapp -e SERVICE_CHECK_TCP=192.168.157.134:18080 -e SERVICE_CHECK_INTERVAL=5s -e SERVICE_TAGS=Web01-18080 daocloud.io/library/nginx

登录consul查看服务注册

http://192.168.157.131:8500/

动态同步配置信息到nginx反代

容器服务注册记录在services中

在nginx反代服务器上安装nginx_upsync_module动态同步模块,将在consul中的services中注册的服务,自动同步批量生成nginx配置文件。

webservices为consul中添加的服务名称

consul服务器上面安装nginx反向代理
并将nginx动态同步upsync_module模块上传到nginx服务器中
获取后端健康检查模块:https://github.com/xiaokai-wang/nginx_upstream_check_module
[root@consul-nginx-server ~]# tar xzvf nginx-upsync-module-2.1.3.tar.gz -C /usr/local/
[root@consul-nginx-server ~]# unzip -d /usr/local/ nginx_upstream_check_module-master.zip
[root@consul-nginx-server ~]# wget http://nginx.org/download/nginx-1.22.1.tar.gz
[root@consul-nginx-server ~]# tar xzvf nginx-1.22.1.tar.gz -C /usr/local/
[root@consul-nginx-server ~]# yum install  pcre pcre-devel  opessl  openssl-devel  zlib  zlib-devel -y
[root@consul-nginx-server ~]# yum -y install gcc gcc-c++
[root@consul-nginx-server ~]# useradd nginx
[root@consul-nginx-server ~]# yum install -y patch
[root@consul-nginx-server ~]# cd /usr/local/nginx-1.22.1/
[root@consul-nginx-server nginx-1.22.1]# patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch
[root@consul-nginx-server nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream --add-module=../nginx_upstream_check_module-master --add-module=../nginx-upsync-module-2.1.3  
[root@consul-nginx-server nginx-1.22.1]# make && make install

开始配置nginx从注册中心同步容器状态

[root@consul-nginx-server ~]# cd /etc/nginx/
[root@consul-nginx-server nginx]# vim nginx.conf
upstream webapp_server {server 127.0.0.1:11111;upsync 192.168.157.131:8500/v1/catalog/service/webappupsync_timeout=6m upsync_interval=500ms upsync_type=consul_services strong_dependency=off;upsync_dump_path /etc/nginx/conf/upstream.conf;include /etc/nginx/conf/upstream.conf;check interval=3000 rise=2 fall=5 timeout=5000 type=http;check_http_send "GET / HTTP/1.0\r\n\r\n";check_http_expect_alive http_2xx http_3xx;
}
​
server {listen       80;server_name  localhost;
​#location / {#    root   html;#    index  index.html index.htm;#}
​location / {proxy_pass http://webapp_server;proxy_redirect default;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_connect_timeout 30;proxy_send_timeout 60;proxy_read_timeout 60;}
​location /status {check_status;}[root@consul-nginx-server nginx]# mkdir /etc/nginx/conf/ -p  #创建同步配置文件目录
[root@consul-nginx-server nginx]# touch /etc/nginx/conf/upstream.conf #创建不同的配置文件
[root@consul-nginx-server nginx]# mkdir -p /tmp/nginx/client_body
[root@consul-nginx-server nginx]# /usr/local/nginx/sbin/nginx

语法参数

server 127.0.0.1:11111;本机upsync工作虚拟端口
127.0.0.1:2379/v2/keys/upstreams/test, consul服务器同步路径
- upsync_interval=6m;每隔一段时间从consul/etcd中拉出服务器
- upsync_timeout=500ms,从consul/etcd请求中提取服务器超时。
- upsync_type=consul,从拉取服务器类型:consul,etcd。
- strong_dependency=off,每次在nginx启动或重新加载时,nginx是否从consul/etcd中拉出配置,on,拉取
off,不拉取配置
​
- upsync_dump_path   /etc/nginx/conf/upstream.conf,  同步存储配置文件路径
- include /etc/nginx/conf/upstream.conf,  加载配置文件路径

测试访问 http://192.168.157.131/status

删除容器, 再启动容器,并向容器内的 index.html 文件追加了特定的内容

[root@docker-01 ~]# docker run -itd -p 80:80 --name web01 -e SERVICE_NAME=webapp -e SERVICE_80_CHECK_HTTP=/index.html -e SERVICE_80_CHECK_INTERVAL=10s -v /data/html:/usr/share/nginx/html -e SERVICE_TAGS=Web01-80 daocloud.io/library/nginx
[root@docker-01 ~]# echo web-01:128 >> /data/html/index.html[root@docker-02 ~]# docker run -itd -p 80:80 --name web02 -e SERVICE_NAME=webapp -e SERVICE_80_CHECK_HTTP=/index.html -e SERVICE_80_CHECK_INTERVAL=10s -v /data/html:/usr/share/nginx/html -e SERVICE_TAGS=Web02-80 daocloud.io/library/nginx
[root@docker-02 ~]# echo web-02:134 >> /data/html/index.html

测试,刷新,可以看到页面变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544716.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

C语言 typedef - C语言零基础入门教程

目录 一.typedef 简介 二.typedef 实战 1.typedef 定义基本数据变量 2.typedef 定义结构体 A.常规定义结构体B.typedef 定义结构体C.结构体使用 typedef 和不使用 typedef 区别 3.typedef 定义函数指针 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础…

【2024W33】肖恩技术周刊(第 11 期):猴哥,我好急啊!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

YOLOv9改进 | 特征融合篇,YOLOv9添加iAFF(多尺度通道注意力模块),二次创新RepNCSPELAN4结构,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…

AI大模型行业应用:企业如何走出一条智能化蜕变之路?

随着chatGPT的横空问世&#xff0c;我们对于人工智能在日常生活中的应用场景逐渐了解&#xff0c;无论是搜索、问答、文生图还是文生视频都出现了很多创意&#xff0c;甚至AI还可以做诗&#xff0c;输入一条指令&#xff0c;就可以让它当场赋诗一首。人工智能的发展&#xff0c…

五种方式帮你提升独立站销售额

想要提升独立站利润&#xff0c;一种方式就是降低你的单个购买用户成本&#xff0c;购买用户一方面是来源于广告引流&#xff0c;另一方面是自然流量和老用户复购&#xff0c;但许多新的独立站后者来源都是非常少的&#xff0c;比较依赖广告引流&#xff0c;当我们广告的单个用…

Splunk、Snort在入侵检测中的应用

前期准备 splunk环境验证 splunk相关命令 查看服务端采集了哪些客户端的日志&#xff1a; ./bin/splunk list deploy-clients Deployment client: CF787A85-1BF8-4460-9FA9-469FEEB95BCD applications: {_server_app_39.30: {action: Install, archive: /home/splunk/var/ru…

ChatGPT 诞生663天后,奥特曼罕见发表预言长文力推超级智能:时间不多了,还有不会使用chatgpt4请看文章开头?

还不知道怎么订阅chatgpt4.0和最新的大模型&#xff0c;可以看这里 &#xff1a;WildCard官方平台订阅chatgpt 今天&#xff0c;OpenAI 公司 CEO 山姆奥特曼在一篇题为《智能时代》的最新个人博文中&#xff0c;概述了自己对于 AI 驱动的技术进步与全球繁荣未来的愿景。这篇文…

用Swift实现验证回文字符串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…

深度学习500问——Chapter14:超参数调整(3)

文章目录 14.5 如何改善GAN的性能 14.6 AutoML 14.6.1 什么是AutoML 14.6.2 自动化超参数搜索方法有哪些 14.6.3 什么是神经网络架构搜索&#xff08;NAS&#xff09; 14.6.4 NASNet的设计策略 14.6.5 网络设计中&#xff0c;为什么卷积核设计尺寸都是奇数 14.6.6 网络设计中&a…

一文详解GB28181、RTSP、RTMP

GB28181 GB28181 即 GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》。它是公安部提出的公共安全行业标准&#xff0c;在视频监控领域具有重要地位。 主要目的和应用场景&#xff1a; 目的&#xff1a;解决不同厂家的视频监控设备执行各自标准&…

相交链表 -------------应用

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

【机器学习(十)】时间序列预测月销量案例分析—Holt-Winters算法—Sentosa_DSML社区版

文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…

论文研读——《Task-Adaptive Negative Envision for Few-Shot Open-Set Recognition》

这是一篇关于少样本开集识别的论文。 目录 论文简介&#xff1a; 名词补充 论文的贡献 负原型生成器 确定动态阈值 共轭训练 补充&#xff1a;元训练过程 共轭训练过程 共轭训练损失 实验设置 总结 论文简介&#xff1a; Task-Adaptive Negative Envision for Few-…

怎么把照片转换成jpg格式?这5种转换方法简单高效

照片是我们记录生活、分享美好的重要方式。然而&#xff0c;不同设备和软件生成的照片格式各异&#xff0c;有时为了兼容性或文件大小的需求&#xff0c;我们需要将照片转换成JPG格式。很多小伙伴不知道怎么转换&#xff0c;下面来给大家分享5种简单高效的转换方法&#xff0c;…

tokenizer简述

知乎&#xff1a;难赋链接&#xff1a;https://zhuanlan.zhihu.com/p/721054525 简述 为了方便计算机处理文本&#xff0c;我们常把文本转化为数值的形式。具体操作是把文本分割成有意义的片段&#xff0c;再把这些片段映射为数组&#xff0c;就能够利用各种深度学习的技术来处…

FastStone Capture屏幕长截图软件注册码

FastStone Capture是一款功能强大的电脑屏幕截图、录像软件&#xff0c;并支持图像编辑、注释及分享等使用功能。FastStone Capture可以免费用30天试用&#xff0c;终身版88元单台电脑终身使用&#xff0c;终身更新。不过网上分享的FastStone Capture注册码似乎也可以正常激活&…