自己动手撸一个支持超时与重试Go HTTP Client

之前写过一篇上下文中断在Go语言中的使用 的文章,简单的介绍了上下文中断在Go语言中使用与原理!那么这篇博客,就来讲讲上下文中断在实际中的使用!大家如果不是很了解的话可以点击前面的链接了解下! 在实际开发过程中,太多故障是因为超时没有设置或者设置的不对而造成的。而这些故障都是因为没有意识到超时设置的重要性而造成的。如果应用不设置超时,则可能会导致请求响应慢,慢请求累积导致连锁反应,甚至应用雪崩。而有些中间件或者框架在超时后会进行重试(如设置超时重试两次),读服务天然适合重试,但写服务大多不能重试,重试次数太多会导致多倍请求流量,即模拟了DDoS攻击,后果可能可想而知! 先看看实现: package httpclient import ( “bytes” “context” “crypto/tls” Continue Reading …

上下文中断在Go语言中的使用

越来越多的小伙伴开始使用Go语言开发应用,大多数情况会使用上下文操作,如进行HTTP调用,或从数据库中获取数据,或与go-routines执行异步操作。 最常见的用途是传递可供所有下游操作使用的常用数据。 为什么我们需要中断操作? 通常情况下我们我们的应该通过HTTP 发起请求,然后查询数据库再通过HTTP请求将数据返回 如果一切都完美的话时序图应该像下面这样: 但是,如果用户在中间取消请求会发生什么? 例如,如果客户端中间请求关闭浏览器,就可能发生这种情况。 如果没有取消,应用服务器和数据库将继续工作资源会被浪费: 理想情况下,如果我们知道进程(在本例中为HTTP请求)停止,我们希望进程的所有下游组件都需要停止: Continue Reading …

使用 Google BBR 加速VPS网络

在使用Google BBR之前,我们首先要了解它是什么。在TCP连接中,由于需要维持连接的可靠性,引入了拥塞控制和流量管理的方法。Google BBR就是谷歌公司提出的一个开源TCP拥塞控制的算法。在最新的linux 4.9及以上的内核版本中已被采用。Shadowsocks不经过其它的任何的优化就能轻松的跑满带宽。由于Google BBR是最近几年才开始流行起来的,任何低于4.9的linux内核版本都需要升级到4.9及以上才能使用! modprobe tcp_bbr echo “tcp_bbr” >> Continue Reading …

伪随机数的产生和流密码

能够应用到大量密码函数的一种功能是随机或伪随机数的产生。对这个功能的要求是产生的数据流必须不能预测。 流密码是对称密码算法,从明文输入流逐位或逐字节产生密文输出。使用最为广泛的此类密码是RC4。 一个重要的密码函数是具有强密码学意义的伪随机数发生器。伪随机数发生器(PRNG)在许多密码和安全应用中有使用。 伪随机数发生器(PRNG) 真随机数发生器(TRNG) 在网络安全的各种应用里,随机数在加密算法中扮演重要的角色。 伪随机数的产生的原则 大量的基于密码学的网络安全算法和协议都使用了二进制随机数。 随机性 一般认为随机序列应有良好的统计特性。分布均匀性:序列中的位分布应是均匀的,即0和1出现的频率大约相等。 Continue Reading …

如何搭建一个集中式的日志管理系统

日志是任何系统的重要组成部分,当发生错误时,它们会提供系统正在执行的操作以及导致错误的原因。 几乎每个系统都会以某种形式生成日志,这些日志将写入本地磁盘上的文件。当我们查看日志文件的时候我们就能够很快的定位问题,并且修复Bug。 然而随着互联网的发展,我们的系统越来越复杂,分布式系统、微服务架构,我们的应用跑在成百上千台服务器上。这时候一个集中式的日志管理系统是很有必要的。 集中式日志应系统大体分为四个部分 – 收集日志,传输,存储和分析(可视化)。 我们将深入研究这些部分,并了解我们如何构建应用程序。 日志收集 所有应可能以不同的方式创建日志,有些应用程序直接在文件中记录系统日志和其他日志。 在Linux服务器上运行的典型Web应用程序时,在/ Continue Reading …

MySQL存储引擎中MyISAM与InnoDB

存储引擎简介 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。 例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。 MyISAM与InnoDB的区别是什么? 1、 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。 Continue Reading …

阅读hyperledger fabric源码学习Go并发编程

Hyperledger (或 Hyperledger项目)是一个 开放源 的”区块链” 和相关工具的总括项目,[1] 由 Linux基金会在2015年12月发起该项目,[2] 以支持基于区块链技术的去中心化账本的写作开发。 源码地址:https://github.com/hyperledger/fabric Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。那么我们看看hyperledger fabric是怎么实现Go并发编程的呢? 并发(concurrency)和并行(parallellism) 并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒)是否执行解决了两个或两个以上任务。 并行(parallellism):两个或两个以上的任务在同一时刻被同时执行。 并发说的是逻辑上的概念,而并行,强调的是物理运行状态。并发“包含”并行。 Go的CSP并发模型 Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++等语言中的多线程开发。另外一种是Go语言特有的,也是Go语言推荐的:CSP(communicating Continue Reading …