大家好呀,我是楼仔。
技术是什么?就是拿来玩的,边玩边学,才能成长得更快。
之前已经给大家讲解了 MySQL 同步 ES 的几种方案,下面就教大家如何通过 Canal,将 MySQL 同步到 ES,文章内容绝对妥妥干货!
本文会先讲解需要用到的基础知识,然后再是软件安装,最后就是实战部分。
不 BB,上文章目录:
01 基础知识
1.1 主从复制原理
MySQL 的主从复制是依赖于 binlog,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。
主从复制就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的操作不会等待 binlog 同步地完成。
详细流程如下:
- 主库写 binlog:主库的更新 SQL(update、insert、delete) 被写到 binlog;
- 主库发送 binlog:主库创建一个 log dump 线程来发送 binlog 给从库;
- 从库写 relay log:从库在连接到主节点时会创建一个 IO 线程,以请求主库更新的 binlog,并且把接收到的 binlog 信息写入一个叫做 relay log 的日志文件;
- 从库回放:从库还会创建一个 SQL 线程读取 relay log 中的内容,并且在从库中做回放,最终实现主从的一致性。
1.2 Cannel 基础
Canel 是一款常用的数据同步工具,其原理是基于 Binlog 订阅的方式实现,模拟一个 MySQL Slave 订阅 Binlog 日志,从而实现 CDC(Change Data Capture),将已提交的更改发送到下游。
主要流程如下:
- Canal 服务端向 MySQL 的 master 节点传输 dump 协议;
- MySQL 的 master 节点接收到 dump 请求后推送 Binlog 日志给 Canal 服务端,解析 Binlog 对象(原始为 byte 流)转成 Json 格式;
- Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端,同步数据到 ES。
下面是 Cannel 执行的核心流程,其中 Binlog Parser 主要负责 Binlog 的提取、解析和推送,EventSink 负责数据的过滤 、路由和加工,仅作了解即可。
02 软件下载安装
我的电脑是 Macos-x64,所以后面的软件安装,都是基于这个。
2.1 Java JDK
- 官网:https://www.oracle.com/java/technologies/downloads/
- JDK 版本:11.0.19
由于 Canal 和 ES 的安装,都强依赖 JDK,所以这里有必要先说明。
前方高能,这里有坑!!!
如果你选的版本不对,ES 安装可能会失败,然后 Canal 同步数据到 ES 时,也会出现很多诡异的问题。
2.2 MySQL
MySQL 大家应该都安装了,这里需要打开 MySQL 的 BinLog。
我是 Mac,主要新建一个 my.cnf 文件,然后再重启 MySQL。
这里重启 MySQL,我搞了半天,BinLog 开启后,会看到 BinLog 日志。
然后需要创建一个账号,账号和密码都是 Cannal,给后面 Canal 使用。
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'localhost' IDENTIFIED BY 'canal' ;
复制代码
2.3 Canal
- 官网:https://github.com/alibaba/canal/releases
- 版本:v1.1.6
下载 canal.adapter 和 canal.deployer 两个就可以:
- canal.deployer:相当于 canal 的服务端,启动它才可以在客户端接收数据库变更信息。
- canal.adapter:增加客户端数据落地的适配及启动功能(当 deployer 接收到消息后,会根据不同的目标源做适配,比如是 es 目标源适配和 hbase 适配等等)。
备注:canal.admin 为 canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的 WebUI 操作界面,方便更多用户快速和安全的操作,我这边使用的是单机的,因此就没有下载安装,大家也可以拉 source code 源码去研究下。
2.4 ES
- ES 官网:https://www.elastic.co/cn/downloads/elasticsearch
- ES 版本:7.17.4
Mac 安装 ES 非常简单:
brew install elasticsearch
复制代码
安装细节不赘述,安装成功后,输入以下网址:
http://localhost:9200/?pretty
复制代码
2.5 Kibana
- 下载网址:https://www.elastic.co/cn/downloads/past-releases#kibana
- 版本:7.14.0
它是 ES 的界面化操作工具,安装细节不赘述,安装成功后,输入以下网址:
http://localhost:5601/app/dev_tools#/console
已加入二哥编程星球,即刻绑定星球编号解锁🔐
该文档仅「二哥编程星球」的VIP用户可见
×
二哥的编程星球内容包括:
1. 付费文档: 技术派、MYDB 等项目配套的 120+篇教程查看权限
2. 面试指南: 校招、社招的 40 万+字面试求职攻略
3. 智能助手: 无限期使用派聪明 AI 助手,已对接讯飞星火和 ChatGPT双通道,不用花 1 分钱
4. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等
5. 简历修改: 提供简历修改服务,附赠星球 100+优质简历模板可供参考
6. 学习环境: 打造一个沉浸式的学习环境,有一种高考冲刺、大学考研的氛围
》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮
》步骤②:访问星球置顶帖球友必看:
https://t.zsxq.com/11rEo9Pdu,获取项目配套文档的语雀访问地址和密码
已加入星球,绑定星球编号
删除提醒
×
确定删除《MySQL 同步 ES 实战,肝到爆!》吗
确定
取消
4人已点赞
// 删除文章
let id = "336"
$('#deleteBtn').click(function () {
get("/article/api/delete?articleId=" + id, {}, function (data) {
// 删除文章成功,跳转到首页
window.location.href = "/";
});
});
// 高亮代码
hljs.addPlugin({
'after:highlightElement': ({ el, result }) => {
// move the language from the result into the dataset
el.setAttribute('lang', result.language);
el.classList.add('copyable');
// 创建复制代码按钮
const copyBtn = document.createElement('span');
copyBtn.classList.add('copy-code-btn');
copyBtn.textContent = '复制代码';
// 将复制代码按钮添加到代码块后
el.parentNode.insertBefore(copyBtn, el.nextSibling);
}
});
hljs.highlightAll();
const clipboard = new ClipboardJS('.copy-code-btn', {
target: function(trigger) {
return trigger.previousElementSibling;
}
});
clipboard.on('success', function(e) {
// 复制成功
toastr.info("复制成功");
e.clearSelection();
});
clipboard.on('error', function(e) {
console.log('复制失败');
});
// 星球文章的权限控制
console.log("实体内容:", {"articleId":"336","articleType":1,"author":"3","authorName":null,"authorAvatar":null,"title":"MySQL \u540C\u6B65 ES \u5B9E\u6218\uFF0C\u809D\u5230\u7206\uFF01","shortTitle":"MySQL\u540C\u6B65ES","summary":"\u5927\u5BB6\u597D\u5440\uFF0C\u6211\u662F\u697C\u4ED4\u3002\u6280\u672F\u662F\u4EC0\u4E48\uFF1F\u5C31\u662F\u62FF\u6765\u73A9\u7684\uFF0C\u8FB9\u73A9\u8FB9\u5B66\uFF0C\u624D\u80FD\u6210\u957F\u5F97\u66F4\u5FEB\u3002\u4E4B\u524D\u5DF2\u7ECF\u7ED9\u5927\u5BB6\u8BB2\u89E3\u4E86MySQL\u540C\u6B65ES\u7684\u51E0\u79CD\u65B9\u6848\uFF0C\u4E0B\u9762\u5C31\u6559\u5927\u5BB6\u5982\u4F55\u901A\u8FC7Canal\uFF0C\u5C06MySQL\u540C\u6B65\u5230ES\uFF0C\u6587\u7AE0\u5185\u5BB9\u7EDD\u5BF9\u59A5\u59A5\u5E72\u8D27\uFF01\u672C\u6587\u4F1A\u5148\u8BB2\u89E3\u9700\u8981\u7528\u5230\u7684\u57FA\u7840\u77E5\u8BC6\uFF0C\u7136\u540E\u518D\u662F\u8F6F\u4EF6\u5B89\u88C5\uFF0C\u6700\u540E\u5C31\u662F\u5B9E\u6218\u90E8\u5206\u3002\u4E0DBB\uFF0C\u4E0A\u6587\u7AE0\u76EE\u5F55\uFF1A01\u57FA\u7840\u77E5\u8BC61.1\u4E3B\u4ECE\u590D\u5236\u539F\u7406MySQL\u7684\u4E3B\u4ECE\u590D\u5236\u662F\u4F9D\u8D56\u4E8Ebinlog\uFF0C\u4E5F\u5C31\u662F\u8BB0\u5F55MySQL\u4E0A\u7684\u6240\u6709\u53D8\u5316\u5E76\u4EE5\u4E8C\u8FDB\u5236\u5F62\u5F0F\u4FDD\u5B58\u5728\u78C1\u76D8\u4E0A\u4E8C\u8FDB\u5236\u65E5\u5FD7\u6587\u4EF6\u3002\u4E3B\u4ECE\u590D\u5236\u5C31\u662F\u5C06binlog\u4E2D\u7684\u6570\u636E\u4ECE\u4E3B\u5E93\u4F20\u8F93\u5230\u4ECE\u5E93\u4E0A\uFF0C\u4E00\u822C\u8FD9\u4E2A\u8FC7\u7A0B\u662F\u5F02\u6B65\u7684\uFF0C\u5373","cover":"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/35af39fc9f4ca3b233fee37dd3b60615.png","content":"<p>\u5927\u5BB6\u597D\u5440\uFF0C\u6211\u662F\u697C\u4ED4\u3002<\/p>\n<p>\u6280\u672F\u662F\u4EC0\u4E48\uFF1F\u5C31\u662F\u62FF\u6765\u73A9\u7684\uFF0C\u8FB9\u73A9\u8FB9\u5B66\uFF0C\u624D\u80FD\u6210\u957F\u5F97\u66F4\u5FEB\u3002<\/p>\n<p>\u4E4B\u524D\u5DF2\u7ECF\u7ED9\u5927\u5BB6\u8BB2\u89E3\u4E86 MySQL \u540C\u6B65 ES \u7684\u51E0\u79CD\u65B9\u6848\uFF0C\u4E0B\u9762\u5C31\u6559\u5927\u5BB6\u5982\u4F55\u901A\u8FC7 Canal\uFF0C\u5C06 MySQL \u540C\u6B65\u5230 ES\uFF0C\u6587\u7AE0\u5185\u5BB9\u7EDD\u5BF9\u59A5\u59A5\u5E72\u8D27\uFF01<\/p>\n<p>\u672C\u6587\u4F1A\u5148\u8BB2\u89E3\u9700\u8981\u7528\u5230\u7684\u57FA\u7840\u77E5\u8BC6\uFF0C\u7136\u540E\u518D\u662F\u8F6F\u4EF6\u5B89\u88C5\uFF0C\u6700\u540E\u5C31\u662F\u5B9E\u6218\u90E8\u5206\u3002<\/p>\n<p>\u4E0D BB\uFF0C\u4E0A\u6587\u7AE0\u76EE\u5F55\uFF1A<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/877962cba3d9c9356b4671700d1a15d9.png\" alt=\"\" \/><\/p>\n<h1>01 \u57FA\u7840\u77E5\u8BC6<\/h1>\n<h2>1.1 \u4E3B\u4ECE\u590D\u5236\u539F\u7406<\/h2>\n<p>MySQL \u7684\u4E3B\u4ECE\u590D\u5236\u662F\u4F9D\u8D56\u4E8E binlog\uFF0C\u4E5F\u5C31\u662F\u8BB0\u5F55 MySQL \u4E0A\u7684\u6240\u6709\u53D8\u5316\u5E76\u4EE5\u4E8C\u8FDB\u5236\u5F62\u5F0F\u4FDD\u5B58\u5728\u78C1\u76D8\u4E0A\u4E8C\u8FDB\u5236\u65E5\u5FD7\u6587\u4EF6\u3002<\/p>\n<p>\u4E3B\u4ECE\u590D\u5236\u5C31\u662F\u5C06 binlog \u4E2D\u7684\u6570\u636E\u4ECE\u4E3B\u5E93\u4F20\u8F93\u5230\u4ECE\u5E93\u4E0A\uFF0C\u4E00\u822C\u8FD9\u4E2A\u8FC7\u7A0B\u662F\u5F02\u6B65\u7684\uFF0C\u5373\u4E3B\u5E93\u4E0A\u7684\u64CD\u4F5C\u4E0D\u4F1A\u7B49\u5F85 binlog \u540C\u6B65\u5730\u5B8C\u6210\u3002<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/e990788b277bdd4a271b573c80fa8850.png\" alt=\"\" \/><\/p>\n<p>\u8BE6\u7EC6\u6D41\u7A0B\u5982\u4E0B\uFF1A<\/p>\n<ol>\n<li>\u4E3B\u5E93\u5199 binlog\uFF1A\u4E3B\u5E93\u7684\u66F4\u65B0 SQL(update\u3001insert\u3001delete) \u88AB\u5199\u5230 binlog\uFF1B<\/li>\n<li>\u4E3B\u5E93\u53D1\u9001 binlog\uFF1A\u4E3B\u5E93\u521B\u5EFA\u4E00\u4E2A log dump \u7EBF\u7A0B\u6765\u53D1\u9001 binlog \u7ED9\u4ECE\u5E93\uFF1B<\/li>\n<li>\u4ECE\u5E93\u5199 relay log\uFF1A\u4ECE\u5E93\u5728\u8FDE\u63A5\u5230\u4E3B\u8282\u70B9\u65F6\u4F1A\u521B\u5EFA\u4E00\u4E2A IO \u7EBF\u7A0B\uFF0C\u4EE5\u8BF7\u6C42\u4E3B\u5E93\u66F4\u65B0\u7684 binlog\uFF0C\u5E76\u4E14\u628A\u63A5\u6536\u5230\u7684 binlog \u4FE1\u606F\u5199\u5165\u4E00\u4E2A\u53EB\u505A relay log \u7684\u65E5\u5FD7\u6587\u4EF6\uFF1B<\/li>\n<li>\u4ECE\u5E93\u56DE\u653E\uFF1A\u4ECE\u5E93\u8FD8\u4F1A\u521B\u5EFA\u4E00\u4E2A SQL \u7EBF\u7A0B\u8BFB\u53D6 relay log \u4E2D\u7684\u5185\u5BB9\uFF0C\u5E76\u4E14\u5728\u4ECE\u5E93\u4E2D\u505A\u56DE\u653E\uFF0C\u6700\u7EC8\u5B9E\u73B0\u4E3B\u4ECE\u7684\u4E00\u81F4\u6027\u3002<\/li>\n<\/ol>\n<h2>1.2 Cannel \u57FA\u7840<\/h2>\n<p>Canel \u662F\u4E00\u6B3E\u5E38\u7528\u7684\u6570\u636E\u540C\u6B65\u5DE5\u5177\uFF0C\u5176\u539F\u7406\u662F\u57FA\u4E8E Binlog \u8BA2\u9605\u7684\u65B9\u5F0F\u5B9E\u73B0\uFF0C<strong>\u6A21\u62DF\u4E00\u4E2A MySQL Slave \u8BA2\u9605 Binlog \u65E5\u5FD7\uFF0C\u4ECE\u800C\u5B9E\u73B0 CDC<\/strong>\uFF08Change Data Capture\uFF09\uFF0C\u5C06\u5DF2\u63D0\u4EA4\u7684\u66F4\u6539\u53D1\u9001\u5230\u4E0B\u6E38\u3002<\/p>\n<p>\u4E3B\u8981\u6D41\u7A0B\u5982\u4E0B\uFF1A<\/p>\n<ol>\n<li>Canal \u670D\u52A1\u7AEF\u5411 MySQL \u7684 master \u8282\u70B9\u4F20\u8F93 dump \u534F\u8BAE\uFF1B<\/li>\n<li>MySQL \u7684 master \u8282\u70B9\u63A5\u6536\u5230 dump \u8BF7\u6C42\u540E\u63A8\u9001 Binlog \u65E5\u5FD7\u7ED9 Canal \u670D\u52A1\u7AEF\uFF0C\u89E3\u6790 Binlog \u5BF9\u8C61\uFF08\u539F\u59CB\u4E3A byte \u6D41\uFF09\u8F6C\u6210 Json \u683C\u5F0F\uFF1B<\/li>\n<li>Canal \u5BA2\u6237\u7AEF\u901A\u8FC7 TCP \u534F\u8BAE\u6216 MQ \u5F62\u5F0F\u76D1\u542C Canal \u670D\u52A1\u7AEF\uFF0C\u540C\u6B65\u6570\u636E\u5230 ES\u3002<\/li>\n<\/ol>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/4876ee16e0d8894424176f8908068f4c.png\" alt=\"\" \/><\/p>\n<p>\u4E0B\u9762\u662F Cannel \u6267\u884C\u7684\u6838\u5FC3\u6D41\u7A0B\uFF0C\u5176\u4E2D Binlog Parser \u4E3B\u8981\u8D1F\u8D23 Binlog \u7684\u63D0\u53D6\u3001\u89E3\u6790\u548C\u63A8\u9001\uFF0CEventSink \u8D1F\u8D23\u6570\u636E\u7684\u8FC7\u6EE4 \u3001\u8DEF\u7531\u548C\u52A0\u5DE5\uFF0C\u4EC5\u4F5C\u4E86\u89E3\u5373\u53EF\u3002<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/ffdeb798388ea05ac86bc38e67dfcd19.png\" alt=\"\" \/><\/p>\n<h1>02 \u8F6F\u4EF6\u4E0B\u8F7D\u5B89\u88C5<\/h1>\n<p>\u6211\u7684\u7535\u8111\u662F Macos-x64\uFF0C\u6240\u4EE5\u540E\u9762\u7684\u8F6F\u4EF6\u5B89\u88C5\uFF0C\u90FD\u662F\u57FA\u4E8E\u8FD9\u4E2A\u3002<\/p>\n<h2>2.1 Java JDK<\/h2>\n<ul>\n<li>\u5B98\u7F51\uFF1A<a href=\"https:\/\/www.oracle.com\/java\/technologies\/downloads\/\">https:\/\/www.oracle.com\/java\/technologies\/downloads\/<\/a><\/li>\n<li>JDK \u7248\u672C\uFF1A11.0.19<\/li>\n<\/ul>\n<p>\u7531\u4E8E Canal \u548C ES \u7684\u5B89\u88C5\uFF0C\u90FD\u5F3A\u4F9D\u8D56 JDK\uFF0C\u6240\u4EE5\u8FD9\u91CC\u6709\u5FC5\u8981\u5148\u8BF4\u660E\u3002<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/30e0f3212fe7d125704b3989afb9fb74.png\" alt=\"\" \/><\/p>\n<p><strong>\u524D\u65B9\u9AD8\u80FD\uFF0C\u8FD9\u91CC\u6709\u5751\uFF01\uFF01\uFF01<\/strong><\/p>\n<p>\u5982\u679C\u4F60\u9009\u7684\u7248\u672C\u4E0D\u5BF9\uFF0CES \u5B89\u88C5\u53EF\u80FD\u4F1A\u5931\u8D25\uFF0C\u7136\u540E Canal \u540C\u6B65\u6570\u636E\u5230 ES \u65F6\uFF0C\u4E5F\u4F1A\u51FA\u73B0\u5F88\u591A\u8BE1\u5F02\u7684\u95EE\u9898\u3002<\/p>\n<h2>2.2 MySQL<\/h2>\n<p>MySQL \u5927\u5BB6\u5E94\u8BE5\u90FD\u5B89\u88C5\u4E86\uFF0C\u8FD9\u91CC\u9700\u8981\u6253\u5F00 MySQL \u7684 BinLog\u3002<\/p>\n<p>\u6211\u662F Mac\uFF0C\u4E3B\u8981\u65B0\u5EFA\u4E00\u4E2A my.cnf \u6587\u4EF6\uFF0C\u7136\u540E\u518D\u91CD\u542F MySQL\u3002<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/38214233a04a93b722b6ff8b8fc9b888.png\" alt=\"\" \/><\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/8e3569d7ec4348759d7d2f9faa039328.png\" alt=\"\" \/><\/p>\n<p>\u8FD9\u91CC\u91CD\u542F MySQL\uFF0C\u6211\u641E\u4E86\u534A\u5929\uFF0CBinLog \u5F00\u542F\u540E\uFF0C\u4F1A\u770B\u5230 BinLog \u65E5\u5FD7\u3002<\/p>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/fe1013fab6a533c62475ed3154537ed8.png\" alt=\"\" \/><\/p>\n<p>\u7136\u540E\u9700\u8981\u521B\u5EFA\u4E00\u4E2A\u8D26\u53F7\uFF0C\u8D26\u53F7\u548C\u5BC6\u7801\u90FD\u662F Cannal\uFF0C\u7ED9\u540E\u9762 Canal \u4F7F\u7528\u3002<\/p>\n<pre><code>GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'localhost' IDENTIFIED BY 'canal' ;\n<\/code><\/pre>\n<h2>2.3 Canal<\/h2>\n<ul>\n<li>\u5B98\u7F51\uFF1A<a href=\"https:\/\/github.com\/alibaba\/canal\/releases\">https:\/\/github.com\/alibaba\/canal\/releases<\/a><\/li>\n<li>\u7248\u672C\uFF1Av1.1.6<\/li>\n<\/ul>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/2389e9d38152db35acb517d07d6676c0.png\" alt=\"\" \/><\/p>\n<p>\u4E0B\u8F7D canal.adapter \u548C canal.deployer \u4E24\u4E2A\u5C31\u53EF\u4EE5\uFF1A<\/p>\n<ul>\n<li>canal.deployer\uFF1A\u76F8\u5F53\u4E8E canal \u7684\u670D\u52A1\u7AEF\uFF0C\u542F\u52A8\u5B83\u624D\u53EF\u4EE5\u5728\u5BA2\u6237\u7AEF\u63A5\u6536\u6570\u636E\u5E93\u53D8\u66F4\u4FE1\u606F\u3002<\/li>\n<li>canal.adapter\uFF1A\u589E\u52A0\u5BA2\u6237\u7AEF\u6570\u636E\u843D\u5730\u7684\u9002\u914D\u53CA\u542F\u52A8\u529F\u80FD(\u5F53 deployer \u63A5\u6536\u5230\u6D88\u606F\u540E\uFF0C\u4F1A\u6839\u636E\u4E0D\u540C\u7684\u76EE\u6807\u6E90\u505A\u9002\u914D\uFF0C\u6BD4\u5982\u662F es \u76EE\u6807\u6E90\u9002\u914D\u548C hbase \u9002\u914D\u7B49\u7B49)\u3002<\/li>\n<\/ul>\n<p>\u5907\u6CE8\uFF1Acanal.admin \u4E3A canal\u63D0\u4F9B\u6574\u4F53\u914D\u7F6E\u7BA1\u7406\u3001\u8282\u70B9\u8FD0\u7EF4\u7B49\u9762\u5411\u8FD0\u7EF4\u7684\u529F\u80FD\uFF0C\u63D0\u4F9B\u76F8\u5BF9\u53CB\u597D\u7684 WebUI \u64CD\u4F5C\u754C\u9762\uFF0C\u65B9\u4FBF\u66F4\u591A\u7528\u6237\u5FEB\u901F\u548C\u5B89\u5168\u7684\u64CD\u4F5C\uFF0C\u6211\u8FD9\u8FB9\u4F7F\u7528\u7684\u662F\u5355\u673A\u7684\uFF0C\u56E0\u6B64\u5C31\u6CA1\u6709\u4E0B\u8F7D\u5B89\u88C5\uFF0C\u5927\u5BB6\u4E5F\u53EF\u4EE5\u62C9 source code \u6E90\u7801\u53BB\u7814\u7A76\u4E0B\u3002<\/p>\n<h2>2.4 ES<\/h2>\n<ul>\n<li>ES \u5B98\u7F51\uFF1A<a href=\"https:\/\/www.elastic.co\/cn\/downloads\/elasticsearch\">https:\/\/www.elastic.co\/cn\/downloads\/elasticsearch<\/a><\/li>\n<li>ES \u7248\u672C\uFF1A7.17.4<\/li>\n<\/ul>\n<p>Mac \u5B89\u88C5 ES \u975E\u5E38\u7B80\u5355\uFF1A<\/p>\n<pre><code>brew install elasticsearch\n<\/code><\/pre>\n<p>\u5B89\u88C5\u7EC6\u8282\u4E0D\u8D58\u8FF0\uFF0C\u5B89\u88C5\u6210\u529F\u540E\uFF0C\u8F93\u5165\u4EE5\u4E0B\u7F51\u5740\uFF1A<\/p>\n<pre><code>http:\/\/localhost:9200\/?pretty\n<\/code><\/pre>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/317b814e8027c2932f4c57abdd0ebcde.png\" alt=\"\" \/><\/p>\n<h2>2.5 Kibana<\/h2>\n<ul>\n<li>\u4E0B\u8F7D\u7F51\u5740\uFF1A<a href=\"https:\/\/www.elastic.co\/cn\/downloads\/past-releases#kibana\">https:\/\/www.elastic.co\/cn\/downloads\/past-releases#kibana<\/a><\/li>\n<li>\u7248\u672C\uFF1A7.14.0<\/li>\n<\/ul>\n<p><img src=\"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/cd4f9bf25a376d1b1f8a6c28bf7305e8.png\" alt=\"\" \/><\/p>\n<p>\u5B83\u662F ES \u7684\u754C\u9762\u5316\u64CD\u4F5C\u5DE5\u5177\uFF0C\u5B89\u88C5\u7EC6\u8282\u4E0D\u8D58\u8FF0\uFF0C\u5B89\u88C5\u6210\u529F\u540E\uFF0C\u8F93\u5165\u4EE5\u4E0B\u7F51\u5740\uFF1A<\/p>\n<pre><code>http:\/\/localhost:5601\/app\/dev_tools#\/console\n<\/c","sourceType":"\u539F\u521B","sourceUrl":"","status":1,"readType":0,"canRead":null,"officalStat":0,"toppingStat":0,"creamStat":0,"createTime":"1686268379000","lastUpdateTime":"1686477415000","category":{"categoryId":"1","category":"\u540E\u7AEF","rank":0,"status":1,"selected":false},"tags":[{"tagId":"150","tag":"\u6280\u672F\u6D3E","status":null,"selected":null},{"tagId":"134","tag":"elasticsearch","status":null,"selected":null},{"tagId":"7","tag":"MySQL","status":null,"selected":null}],"praised":false,"commented":false,"collected":false,"count":{"praiseCount":4,"readCount":3882,"collectionCount":3,"commentCount":2},"praisedUsers":[{"userId":"943","name":"\u8981\u8BB0\u5F97\u5E38\u7B11\u54E6","avatar":"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/bea9cf1f23227d091fb7f09dccbf1bdf.png","profile":null},{"userId":"3","name":"\u697C\u4ED4","avatar":"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/235b0d459afdf01b6238b21cad93d46b.png","profile":null},{"userId":"2","name":"\u4E00\u7070\u7070","avatar":"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/df95f54988e1c5a9450dfd97aa4403de.png","profile":null},{"userId":"1558","name":"\u8BA4\u771F\u7684\u94C3\u94DB","avatar":"https:\/\/cdn.tobebetterjavaer.com\/paicoding\/avatar\/0053.png","profile":null}],"payAmount":"0","payWay":null})
let loginRead = 3;
let user = null;
if (loginRead == 3) {
console.log(loginRead, user)
if (user == null) {
// 未加入星球,展示弹窗
$('#starModel').modal('show');
} else {
if (user.starStatus == "FORMAL") {
} else if(user.starStatus == "TRYING"){
} else {
$('#starModel').modal('show');
}
}
} else if (loginRead == 4) {
// 对于付费阅读场景
if (!null) {
if (user == null) {
// 未登录时,弹出登录窗口
$('#loginModal').modal('show')
}
}
}
// -------------------------------------- 下面是打赏支付、解锁全文的逻辑 -------------------------------------------
function showPayUserInfo() {
// 显示打赏用户信息
$('#payUserModel').modal('show');
}
function redirctPayModal() {
$('#payUserModel').modal('hide');
showPayModal();
}
// 显示支付窗口
let payId;
function showPayModal() {
$('#payModel').modal('show');
autoShowPay();
}
function hasPaying() {
let notes = getNotesInfo()
// 标记为已经支付完成
if (payId) {
get("/article/api/pay/paying", {"payId": payId, "succeed": true, "notes": notes}, (res) => {
toastr.info("支付结果的验证需要一点点时间,请耐心等候~");
$('#payModel').modal('hide');
})
} else {
// 没有支付id,重新创建一个
get("/article/api/pay/toPay", {"articleId": id}, (res) => {
payId = res.payId;
get("/article/api/pay/paying", {"payId": res.payId, "succeed": true}, (res) => {
toastr.info("支付结果的验证需要一点点时间,请耐心等候~");
$('#payModel').modal('hide');
})
})
}
}
function getNotesInfo() {
let notesDiv = $('#mark')
let notes;
if (notesDiv) {
notes = notesDiv.val()
} else {
notes = ''
}
return notes;
}
复制代码
2 条评论
回复