tcpkill在go语言下的实现和增强

tcpwall当我们想要阻止某些TCP连接的建立,在Linux平台上有一个很好的解决方案iptables,但是对那些已经建立的tcp连接,iptables就不能做到随心所欲的阻断了。我在互联网上检索的时候发现了tcpkill这个工具,tcpkill是一个网络分析工具集dsniff中的一个小工具。在Linux上可以直接通过dsniff包安装,使用方式也非常简单。通过测试我发现tcpkill在执行命令之后并不会立刻阻断tcp连接,而是等待有数据传输时,才会阻断,因此在执行完命令之后程序并不会主动退出...阅读全文

Segmentfault 2020-11-01 21:32:32 我在对面的角落

golang 变量bool, slice, string, rune, 数组

boolbool占1位,但是按照8位对齐字符串, 数组,slice字符串结构runtime/string .go type stringStruct struct { str unsafe.Pointer len int } type slice struct { array unsafe.Pointer len int cap int } 数组存储结构和C一样基于字符串创建的切片和原字符串指向相同的底层字符数组, 字符串的切片操作返回的子串仍然是string,而非slice。切片数组返回的是,...阅读全文

Segmentfault 2020-11-01 19:32:32 xxx小M

Golang Context 实现

一、应用场景 二、使用示例 RPC超时控制 Context传递LogID 三、使用原则 四、源码实现 4.1 思考 4.2 标准实现 4.2.1 cancelCtx 4.2.2 timerCtx 4.2.3 valueCtx 一、应用场景 链路跟踪,业务需要传递上下游元信息; 主协程和子协程同步信号,减少计算资源的浪费。例如rpc调用时的超时控制。 二、使用示例 RPC超时控制 // RPCTimeoutMW . func RPCTimeoutMW(next endpoint.EndPoint)...阅读全文

简书 2020-10-29 11:32:42 梦工厂

Docker中Dockerfile多From 指令存在的意义

from 老版本Docker中为什么不支持多个 FROM 指令 Docker 17.05版本以后,新增了Dockerfile多阶段构建。所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 FROM 指令。这样做有什么意义呢? 老版本Docker中为什么不支持多个 FROM 指令 在17.05版本之前的Docker,只允许Dockerfile中出现一个FROM指令,这得从镜像的本质说起。 在《Docker概念简介》 中我们提到,你可以简单理解Docker的镜像是一个压缩文件,其中包含...阅读全文

简书 2020-10-29 11:32:42 V7hinc

求根到叶子节点数字之和--leetcode每日一刷golang实现

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。 例如,从根到叶子节点路径 1->2->3 代表数字 123。 计算从根到叶子节点生成的所有数字之和。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入: [1,2,3] 1 / \ 2 3 输出: 25 解释: 从根到叶子节点路径 1->2 代表数字 12. 从根到叶子节点路径 1->3 代表数字 13. 因此,数字总和 = 12 + 13 = 25. 示例 2: 输入: [4,9,0,5,...阅读全文

简书 2020-10-29 10:32:40 牙哥

技术选型:为什么批处理我们却选择了Flink

最近接手了一个改造多平台日志服务的需求,经过梳理,我认为之前服务在设计上存在缺陷。经过一段时间的技术方案调研,最终我们决定选择使用 Flink 重构该服务。 目前重构后的服务已成功经受了国庆节流量洪峰的考验,今日特来总结回顾,和大家分享一下经验。 业务需求及背景 在了解改造服务的需求前,我们首先要明确,要解决什么问题以及目前的服务是如何解决的。 当前的业务逻辑还是比较清晰的: 采集同一时段不同数据源的日志; 对采集的数据进行处理; 将处理后的数据上传到指定位置,供客户下载。 我们面临的痛点和难点...阅读全文

简书 2020-10-28 19:32:52 又拍云

密码学入门之密码

最近在研读《图解密码技术》这本书,将有一系列的密码学学习笔记,涉及到密码的相关概念、对称加密、非对称加密、单向散列函数、消息认证码、数字签名、数字证书等内容,同时涉及到代码部分也会使用Golang进行展示,感兴趣的可以关注更新哦。好了,今天先讲讲密码学中的一些概念性的问题。 1.密码学简介 2.对称加密 3.分组加密模式 4.非对称加密 5.单向散列函数 6.消息认证码 7.数字签名 8.证书 9.SSL/TLS 发送者、接收者和窃听者 请想象一个Alice向Bob发送电子邮件的场景。在这个场景...阅读全文

linux下定位多线程内存越界问题实践总结

最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用强大的mprotect+backtrace+libsigsegv等工具成功定位了问题。整个定位过程遇到的问题和解决办法对于多线程内存越界问题都很典型,简单总结一下和大家分享。现象core是在系统集成测试过程中发现的。服务器程序MergeServer...阅读全文

简书 2020-10-28 15:42:29 linux大本营

熔断原理与实现Golang版

在微服务中服务间依赖非常常见,比如评论服务依赖审核服务而审核服务又依赖反垃圾服务,当评论服务调用审核服务时,审核服务又调用反垃圾服务,而这时反垃圾服务超时了,由于审核服务依赖反垃圾服务,反垃圾服务超时导致审核服务逻辑一直等待,而这个时候评论服务又在一直调用审核服务,审核服务就有可能因为堆积了大量请求而导致服务宕机 <img src="https://raw.githubusercontent.com/tal-tech/zero-doc/main/doc/images/call_chain.png...阅读全文

简书 2020-10-28 12:32:39 kevwan

2020-10-28 最近折腾了一下Julia

不要百度Julia,八成会有惊吓 我说的Julia是这个 - MIT 2012年推出的一门统计学语言。我最开始对这东西不怎么感冒,之前也看过很多现代化语言的语法,包括kotlin、golang、rust和julia。 其中,最喜欢的还是golang和kotlin。rust对我来说太复杂了,试了试就放弃了。 julia给我的感觉也差不多,语法像是几门语言的杂糅。 C:function和end关键字,写Python和go,甚至是R习惯了,经常漏写end Python:主要是类似numpy的矩阵操作 ...阅读全文

简书 2020-10-28 12:32:39 zhym1992

Go基础编程:变量、常量、命名

变量概念:变量是编程语言的最基本的组成元素,是一种占位符,用于引用计算机内存地址,可以存储计算结果或能表示结果,在程序运行期间内容改变的量。变量类型Go语言变量可以分为值类型和引用类型两种类型。值类型:包含 int、float、bool、string ,变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放。引用类型:有slice、map、chan、struct、interface、指针和函数,变量存储的是地址,这个地址对应的空间才是真正的存储数据,内存分配一般在堆上,通过GC回收。变量声明...阅读全文

Segmentfault 2020-10-31 19:32:32 一夕烟云

熔断原理与实现Golang版

在微服务中服务间依赖非常常见,比如评论服务依赖审核服务而审核服务又依赖反垃圾服务,当评论服务调用审核服务时,审核服务又调用反垃圾服务,而这时反垃圾服务超时了,由于审核服务依赖反垃圾服务,反垃圾服务超时导致审核服务逻辑一直等待,而这个时候评论服务又在一直调用审核服务,审核服务就有可能因为堆积了大量请求而导致服务宕机由此可见,在整个调用链中,中间的某一个环节出现异常就会引起上游调用服务出现一些列的问题,甚至导致整个调用链的服务都宕机,这是非常可怕的。因此一个服务作为调用方调用另一个服务时,为了防止被...阅读全文

Segmentfault 2020-10-31 14:32:32 kevinwan

Golang Channel原理

Channel是Golang实现CSP的核心。 基于channel通信主要涉及buf(数据)和sendq、recvq(维护阻塞的G),lock保证并发访问安全; 本质是一个基于环形缓存的有锁队列,但G的阻塞是在用户空间; 图片来源:https://i6448038.github.io/2019/04/11/go-channel/ 目录 新建channel 发送数据 协程直接发送数据 接收数据 协程直接接收数据 关闭channel Select原理 新建channel channel的运行时结构是...阅读全文

简书 2020-10-28 01:32:40 梦工厂

Golang中time包用法及一些注意事项

在我们日常软件开发过程中,经常会用到与时间相关的各种业务需求,下面来介绍 golang 中有关时间的一些基本用法,这里主要从 time 的几种 type 来开始介绍,以及使用中一些注意事项。 时间可分为时间点与时间间隔,golang 中time包也不例外,提供了以下两种基础类型 时间点(Time) 时间间隔(Duration) 除此之外 golang 也提供了以下类型,做一些特定的业务 时区(Location) Ticker Timer(定时器) 本文将按以上顺序来介绍 time 包的使用。 时...阅读全文

简书 2020-10-28 00:32:39 不屈真实

Golang错误处理机制

错误处理 1. error接口 Go语言引入了一个关于错误处理的标准模式。即error接口,该接口定义如下: type error interface { Error() string } 对于大多数函数,如果要返回错误,都可以按照如下方式返回,将error作为多重返回值的最后一个, 但这并不是强制的要求。 func Foo(param int) (n int, err error) { } n, err := Foo(0) if err != nil { //错误处理 } else { //使...阅读全文

简书 2020-10-27 21:32:39 ShawnLee_123