Weakyon Blog

Weakyon

内网穿透

买了一台阿里云的VPS,有了公网IP就想着内网穿透的事情 一台内网服务器A,一台外网服务器B,我希望通过外网连接SSH来连接到A 也就是在家里连公司内网的办公虚拟机 中间踩了几波坑,记录一下 一 ssh反向代理(不推荐) 最简单的内网穿透就是利用ssh反向代理 在B上设置/etc/sshd_config中修改GatewayPorts no为yes来转发外网的ip请求,随后重启ss...

当主重启时sentinel没有切换导致数据丢失

说来惭愧,codis是去年年初就开始调研的。因为想codis和k8s一起上,重心一直在k8s这边。 导致codis上线一拖再拖,我们DBA用着twemproxy那一套老旧的方案快奔溃了。 上个月调研的时候发现codis改了HA的方案,上了sentinel。 我们之前在codis-HA方案上确实是踩了坑,有一套环境丢了数据。希望sentinel能更好一些。但是很快就发现了数据丢失的情况。...

golang并发模式的思考

golang的使用一直是野路子。在看了几个国外开源项目(nsq,skynetservices)以后,才发现管道的重要性。 其实在公司的大型项目开发过程中早就意识到了这个问题,那就是mutex的使用是可以完全被channel所替代的。 但是channel的一些场景用mutex去实现会非常复杂。 一 实际开发中的例子 举一个资源池的例子 package main import ( ...

golang的http客户端读写超时设置

net/http库中提供的Client中的Timeout字段是针对整个读写过程的。 也就是说如果下载或者上传一个很大的文件,Timeout字段设置为10秒,那么到10秒的时候不管你在做什么这个连接会报出Timeout 而一般而言,客户端其实需要的是每个连接的read,write timeout。这里需要设置Client中的Transport字段 Transport字段是一个接口 ty...

模板模式实践--设计模式

在模板模式中,一个抽象类公开定义了执行他方法的模板,但是没有给出方法的实现。 方法的实现延迟到由继承的子类来实现。 抽象实现 然而golang并没有继承,所以只能用组合接口的方式,来实现继承重写方法,使得父类能直接调用抽象出的方法。 这是golang的实现 package main import ( "fmt" ) const ( typeA = iota typeB...

命令模式实践--设计模式

大学的时候对设计模式走入了误区,总以为那是没什么用的东西,看了局限自己的思维,让自己无法发挥自己的灵性天马行空的编码。 这实在是个错误,是随着代码慢慢码多了,原来觉得没什么问题的代码,耦合越来越严重。才寻求解决办法。 命令模式最初看的别人文章的时候觉得没什么用,因为每个人的理解都不一样。 有的人的重点在于JAVA没有回调函数,所以把命令模式当作当作JAVA的回调函数。 有的人的重点在...

golang的协程调度

众所周知,golang作为协程调度模型,是非抢占式而是自主放弃式的。 我的理解是,当一个协程进行IO的阻塞操作时,就会让出CPU,让调度程序来调度其他协程来进行操作 调度程序并不会因为你的实际调用时间过长就干掉你,如果你觉得自己调用时间太长,可以用runtime库的Gosched()让出CPU 但实际的测试(基于1.7版本)和之前的理解有差距,测试过程是递进的,可以直接跳过看结论 1...

过载保护初探

1. 过载原理 过载是指当前负载超出了系统的最大处理能力,例如系统的极限QPS是100,但实际的请求达到了1000QPS 对一个完全没有过载保护的系统来说,原本是0.01秒完成的请求,并不是直觉上皆大欢喜的0.1秒完成 而是一部分请求稍微延长了请求时间,而另外一部分请求超时很多秒 这种现象的本质原因,是因为不管是基于epoll的异步调度模型,还是golang的协程模型等等 网络,C...

用mysql触发器做数据统计

做文件系统的后台数据统计,需要实时统计数据库存储文件状况 写代码来做的话,文件的sql操作和文件表的更新要做到原子性,就很复杂。所以需要依赖mysql本身的功能。 事务,存储过程和触发器都能做到。 对于数据统计来说,由于本身对业务逻辑相对独立(操作完全独立的汇总表),因此我认为触发器就足堪大用了 一 具体实现 文件表大致是这样的 create table if not exist...

golang中使用url encoding遇到的小坑

一 问题描述 url encoding在golang 1.7中使用的是net/url库 然而这个库有个小陷阱 主要问题是空格在http编码中是编码为%20还是+ 从API列表看,编码用的是QueryEscape,解码用的是QueryUnescape 这个函数会将空格编码成+,但是%20和+都可以解码成空格 fmt.Println(url.QueryEscape(" test"))...