- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
原文地址: https://blog.fanscore.cn/a/53/ 。
本文是 与世界分享我刚编的转发ntunnel_mysql.php的工具 的后续,之前的实现有些拉胯,这次重构了下。需求背景是为了在本地macbook上通过开源的mysql可视化客户端(dbeaver、Sequel Ace等)访问我司测试环境的mysql,整个测试环境的如图所示
那么就有以下几种方式
既然上面的方式都不行,那怎么办呢?因此我产生了一个大胆的想法 。
大概架构如下 。
首先,在本地pc上启动一个 sidecar 进程,该进程监听 3306 端口,实现mysql协议,将自己伪装为一个mysql server。本地pc上的mysql客户端连接到 sidecar ,发送请求数据包给 sidecar ,从 sidecar 读取响应包.
然后在测试环境某台机器上启动 transport 进程,该进程启动http服务,由nginx代理转发请求,相当于监听在80端口,然后连接到测试环境的mysql server.
sidecar 会将来自客户端的请求包通过http请求转发给 transport , transport 将请求包转发到测试环境对应的mysql server,然后读取mysql的响应数据包,然后将响应数据包返回给 sidecar , sidecar 再将响应包返回给mysql客户端.
遵循上述的基本原理,我将其实现出来: https://github.com/Orlion/hersql 。但是在描述 hersql 的实现细节之前我们有必要了解下mysql协议 。
mysql客户端与服务端交互过程主要分为两个阶段:握手阶段与命令阶段。交互流程如下:
在最新版本中,握手过程比上面要复杂,会多几次交互 。
在握手阶段,3次握手建立tcp连接后服务端会首先发送一个握手初始化包,包含了 。
随后客户端会发送一个登录认证包,包含了:
服务端收到客户端发来的登录认证包验证通过后会发送一个OK包,告知客户端连接成功,可以转入命令交互阶段 。
在mysql 8.0默认的身份验证插件为 caching_sha2_password ,低版本为 mysql_native_password ,两者的验证交互流程有所不同个, caching_sha2_password 在缓存未命中的情况下还会多几次交互。另外如果服务端与客户端的验证插件不同的话,也是会多几次交互.
在命令阶段,客户端会发送命令请求包到服务端。数据包的第一个字节标识了当前请求的类型,常见的命令有:
请求响应的模式是客户端会发一个请求包,服务端会回复 n(n>=0) 个响应包 。
最后客户端断开连接时会主动发送一个 COM_QUIT 命令包通知服务端断开连接 。
在了解mysql协议之后我们就可以来看下hersql的数据流转过程了.
上面介绍了一堆原理性的东西,那么如何使用呢?
首先你需要下载下来 hersql 的源码: https://github.com/Orlion/hersql ,还需要安装下 golang ,这些都完成后你就可以启动 hersql transport 了。但是先别着急,我先解释下 transport 的配置文件 tranport.example.yaml
server:
# transport http服务监听的地址
addr: :8080
log:
# 标准输出的日志的日志级别
stdout_level: debug
# 文件日志的日志级别
level: error
# 文件日志的文件地址
filename: ./storage/transport.log
# 日志文件的最大大小(以MB为单位), 默认为 100MB。日志文件超过此大小会创建个新文件继续写入
maxsize: 100
# maxage 是根据文件名中编码的时间戳保留旧日志文件的最大天数。
maxage: 168
# maxbackups 是要保留的旧日志文件的最大数量。默认是保留所有旧日志文件。
maxbackups: 3
# 是否应使用 gzip 压缩旋转的日志文件。默认是不执行压缩。
compress: false
你可以根据你的需求修改配置,然后就可以启动 transport 了 。
$ go run cmd/transport/main.go -conf=transport.example.yaml
一般情况下都是会先编译为可执行文件,由systemd之类的工具托管transport进程,保证transport存活。这里简单期间直接用go run起来 。
同样的,你需要下载下来 hersql 的源码: https://github.com/Orlion/hersql ,提前安装好 golang 。修改下 sidecar 的配置文件 sidecar.example.yaml
server:
# sidecar 监听的地址,之后mysql client会连接这个地址
addr: 127.0.0.1:3306
# transport http server的地址
transport_addr: http://x.x.x.x:xxxx
log:
# 与transport配置相同
就可以启动 sidecar 了 。
$ go run cmd/sidecar/main.go -conf=sidecar.example.yaml
同样的,一般情况下也都是会先编译为可执行文件,mac上是launchctl之类的工具托管sidecar进程,保证sidecar存活。这里简单期间直接用go run起来 。
上面的步骤都执行完成后,就可以打开mysql客户端使用了。数据库地址和端口号需要填写 sidecar 配置文件中的 addr 地址, sidercar 不会校验用户名和密码,因此用户名密码可以随意填写 。
重点来了: 数据库名必须要填写,且必须要按照以下格式填写 。
[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN]
举个例子:
root:123456@tcp(10.10.123.123:3306)/BlogDB
如图所示:
目标mysql服务器 。
可以直连目标mysql服务器的机器 。
那么 transport 可以配置为 。
server:
addr: :8080
sidecar 可以配置为 。
server:
addr: 127.0.0.1:3306
transport_addr: http://10.10.123.100:8080
客户端连接配置 。
root:123456@tcp(10.10.123.123:3306)/BlogDB
最后此篇关于与世界分享我刚编的mysqlhttp隧道工具-hersql原理与使用的文章就讲到这里了,如果你想了解更多关于与世界分享我刚编的mysqlhttp隧道工具-hersql原理与使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实
📒博客首页:崇尚学技术的科班人 🍣今天给大家带来的文章是《Dubbo快速上手 -- 带你了解Dubbo使用、原理》🍣 🍣希望各位小伙伴们能够耐心的读完这篇文章🍣 🙏博主也在学习阶段,如若发
一、写在前面 我们经常使用npm install ,但是你是否思考过它内部的原理是什么? 1、执行npm install 它背后帮助我们完成了什么操作? 2、我们会发现还有一个成为package-lo
Base64 Base64 是什么?是将字节流转换成可打印字符、将可打印字符转换为字节流的一种算法。Base64 使用 64 个可打印字符来表示转换后的数据。 准确的来说,Base64 不算
目录 协程定义 生成器和yield语义 Future类 IOLoop类 coroutine函数装饰器 总结 tornado中的
切片,这是一个在go语言中引入的新的理念。它有一些特征如下: 对数组抽象 数组长度不固定 可追加元素 切片容量可增大 容量大小成片增加 我们先把上面的理念整理在这
文章来源:https://sourl.cn/HpZHvy 引 言 本文主要论述的是“RPC 实现原理”,那么首先明确一个问题什么是 RPC 呢?RPC 是 Remote Procedure Call
源码地址(包含所有与springmvc相关的,静态文件路径设置,request请求入参接受,返回值处理converter设置等等): spring-framework/WebMvcConfigurat
请通过简单的java类向我展示一个依赖注入(inject)原理的小例子虽然我已经了解了spring,但是如果我需要用简单的java类术语来解释它,那么你能通过一个简单的例子向我展示一下吗?提前致谢。
1、背景 我们平常使用手机和电脑上网,需要访问公网上的网络资源,如逛淘宝和刷视频,那么手机和电脑是怎么知道去哪里去拿到这个网络资源来下载到本地的呢? 就比如我去食堂拿吃的,我需要
大家好,我是飞哥! 现在 iptables 这个工具的应用似乎是越来越广了。不仅仅是在传统的防火墙、NAT 等功能出现,在今天流行的的 Docker、Kubernets、Istio 项目中也经
本篇涉及到的所有接口在公开文档中均无,需要下载 GitHub 上的源码,自己创建私有类的文档。 npm run generateDocumentation -- --private yarn gene
我最近在很多代码中注意到人们将硬编码的配置(如端口号等)值放在类/方法的深处,使其难以找到,也无法配置。 这是否违反了 SOLID 原则?如果不是,我是否可以向我的团队成员引用另一个“原则”来说明为什
我是 C#、WPF 和 MVVM 模式的新手。很抱歉这篇很长的帖子,我试图设定我所有的理解点(或不理解点)。 在研究了很多关于 WPF 提供的命令机制和 MVVM 模式的文本之后,我在弄清楚如何使用这
可比较的 jQuery 函数 $.post("/example/handler", {foo: 1, bar: 2}); 将创建一个带有 post 参数 foo=1&bar=2 的请求。鉴于 $htt
如果Django不使用“延迟查询执行”原则,主要问题是什么? q = Entry.objects.filter(headline__startswith="What") q = q.filter(
我今天发现.NET框架在做计算时遵循BODMAS操作顺序。即计算按以下顺序进行: 括号 订单 部门 乘法 添加 减法 但是我四处搜索并找不到任何文档确认 .NET 绝对 遵循此原则,是否有此类文档?如
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
API 回顾 在创建 Viewer 时可以直接指定 影像供给器(ImageryProvider),官方提供了一个非常简单的例子,即离屏例子(搜 offline): new Cesium.Viewer(
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!