golang深入
文章平均质量分 75
zhanglehes
这个作者很懒,什么都没留下…
展开
-
Golang HTTP Fileserver
fileserver是静态文件服务,其主要功能是根据提供文件查询与文件传输的功能。由golang标准库提供。原创 2022-07-19 16:36:08 · 1765 阅读 · 0 评论 -
kafka-go源码解析四(Writer)
概要kafka-go区分同步写与异步写。同步写能严格确保写入的顺序,因为在写成功之前它会block住应用程序,同时返回错误信息。有三种控制写入完成的时机,1是消息发送完成即返回,2是leader收到后即返回,3是isr收到后即返回,越往后数据的可靠性更高,它们均是通过配置参数来控制。异步写不用等返回结果,而是传入一个回调函数来接收处理返回结果(同步写也支持返回前回调)。异步写的性能更优异,而且在很多场景下(有一定的额外逻辑)也仍能保证数据的可靠性。为了提升写的性能,无论是同步写还是异步写都是以bat原创 2022-03-23 09:41:45 · 3328 阅读 · 0 评论 -
kafka-go源码解析三(Reader)
概要Reader是暴露给应用程序的接口,前一章提到的Consumer Group是集成在本类型中使用的。之前提到的Consumer Group主要处理消费topic的相关metadata信息,如relabance,commit offset,heartbeat等。而Reader类主要负责从kafka brokers中拉取数据。Reader有两种使用模式,一是单topic单partition的情形,由Application自己去管理offset的信息;而是Consumer Group的情形。因此在代码原创 2022-03-18 09:37:33 · 1161 阅读 · 1 评论 -
kafka-go源码解析二(Consumer Group)
概要Consumer group主要处理协调消费的问题。为了应对变化,消费时按照时间段被切分成不同的generation,在同一时刻所有的group中的clients对应同一个generation,同一时刻只会有一个generation,新的generation需要所有旧generation产生的goroutine结束后才会创建(后面代码分析会做解释)。使用generation的另一个好处是防止旧generation拉取或者提交的数据,保证数据的一致性。理论上讲,当group中的组员发生变化、监原创 2022-03-16 10:21:50 · 2754 阅读 · 0 评论 -
kafka-go源码解析一(Dialer)
概要git 地址 --GitHub - segmentio/kafka-go: Kafka library in GoDialer类型的主要作用是创建与kafka集群的连接。通过分析它的行为,可知它是建立在底层socket之上的,同时它也是作为上层api reader的一个基础组件。物理连接上,它考虑了超时控制,安全连接tls,认证sasl,域名转换,重试机制等。它的另一个重要作用是建立与指定topic partition leader 对应的broker的连接。源码分析类型.原创 2022-03-14 14:37:59 · 3244 阅读 · 0 评论 -
Golang Http RoundTrip解析
概要RoundTrip是发送和接收一次http请求的底层实现逻辑我们可以从中学习到1、如何去实现一个长链接2、如果去提升性能3、如何考虑完备各种边界情况4、http协议请求和连接的关系一个请求肯定会使用一个或者多个连接,通常是一个,但如果异常情况,如刚好连接在使用过程中失效了,则不排除使用多个连接一个连接可以在一次请求后就丢弃(关闭),但是对于长链接的情况,连接可以被放回到闲置连接池中,这样后续的请求到来时,就可以不必再次创建新的连接,而是复用之前的连接。要是到tcp的三原创 2021-12-29 14:29:56 · 4421 阅读 · 1 评论 -
使用golang实现对请求签名和验签
概要签名的作用是识别请求的发起者,通常对未通过签名验证的发起者不做业务处理。基础知识可以参考 -- https://zhuanlan.zhihu.com/p/384595092整个流程分为两部:请求的发起者按照一定算法进行签名,服务器接收到请求后会根据请求体中所带参数以及对应的签名算法进行验签。通常使用golang实现请求签名有两种方法,一是rsa签名,二是md5签名。Rsa签名是一种非对称的签名方式,相反md5签名是一种对称签名的方式。一般来说使用rsa签名的保密性会更高(通过后面介绍的实原创 2021-12-15 10:24:38 · 7120 阅读 · 2 评论 -
Golang性能优化技巧(三)
概述本文主要介绍闭包、channel和接口相关的性能开销golang中提供了很多语法糖,但它们都有较复杂的实现方式,因此使用它们时需要小心,在对性能要求较高的场景尽量不要使用匿名函数的性能开销代码import "testing"func test(x int) int { return x * 2}// 普通函数调用func BenchmarkTest(b *testing.B) { for i := 0; i < b.N; i++ { _ = test(i)原创 2021-12-06 17:19:51 · 903 阅读 · 0 评论 -
Golang性能优化技巧(二)
概要本文继续介绍一些常用的性能优化技巧值拷贝还是地址拷贝Golang中有些类型在函数参数或返回值传递时,使用值拷贝;比如array,struct。有些类型在函数参数或返回值传递时,使用地址拷贝,比如slice,map,pointer。似乎使用地址拷贝可以降低“数据搬运”的工作量,因此效率更高。然而实际情况可能并非如此,以array和slice为例做对比,分别传递1024个int的数据,进行bench测试后的结果如下:go test -v -bench . -benchmemgoos:原创 2021-12-03 18:34:17 · 399 阅读 · 0 评论 -
Golang内存逃逸分析
概述在Go里面定义了一个变量,到底是分配在堆上还是栈上,Go官方文档告诉我们,不需要管,他们会分析,其实这个分析就是逃逸分析通俗来讲,当一个对象的指针被多个方法或线程引用时,我们称这个指针发生了逃逸。Golang内存分配的基本原则如果函数外部没有引用,则优先放到栈中;如果函数外部存在引用,则必定放到堆中;如果一个变量过大,则有可能分配在堆上逃逸分析变量在栈或是堆上分配内存,是由编译器决定的在 build 的时候,通过添加 -gcflags "-m" 编译参数就可以查看编译原创 2021-12-03 10:31:36 · 708 阅读 · 0 评论 -
Golang性能优化技巧(一)
概述本文介绍string和[]byte的转换,在某些场景下合理的转换方式可以提升服务的整体性能。背景介绍string和[]byte的底层数据结构不一致Type stringStruct string { Uint8* str; Int. len}Type []byteStruct []uint8 { Uint8* array; Int len; Int cap;}使用通常的类型转换方式,会复制整个字符串。如不修改数据,仅转换类原创 2021-12-02 10:48:51 · 429 阅读 · 0 评论 -
hey压测工具
概要hey是一款golang编写的开源压测工具。本文主要介绍其功能,结果展示,以及对其功能的深入思考。地址http://github.com/rakyll/hey命令hey [options] url参数 参数 解释 -n 总请求数目 -c 并发数目 -q 单个work的qps -z原创 2021-11-18 19:00:54 · 1476 阅读 · 0 评论 -
GO MODULE 包管理
本文介绍golang包管理工具。在golang v1.11版本之前使用gopath进行管理,但在不同项目对同一包不同版本依赖时会造成问题。golang v1.11之后的版本引入了go module进行包管理。GOPATH在1.11版本之前,golang是通过GOPATH这个环境变量来管理包依赖(包括第三方包和自己工程中的子包)。同时使用go get命令下载的包都会被放在GOPATH指定的目录下面。它的固定格式如下:$GOPATH bin/ # D原创 2021-10-22 17:31:01 · 291 阅读 · 0 评论 -
Golang happen before
Happen before定义In the following descriptions, if we say eventAis guaranteed to happen before eventB, it means any of the goroutines involved in the two events will observe that any of the statements presented before eventAin source code will be exec...原创 2021-10-19 10:25:52 · 247 阅读 · 0 评论 -
gengine源码解析
概要关于gengine是干什么的,请参考B站新一代golang规则引擎的设计与实现 - 云+社区 - 腾讯云本文主要通过两部分来解析gengine源码,一是介绍框架代码,理清楚该系统的架构;二是以跟随实际例子,看看在编译环节和执行环节分别做了哪些工作gengine是基于antlr4来实现编译和执行的,之前也对该工具进行过介绍,可以参考Antlr4简介_zhanglehes的专栏-CSDN博客框架代码RuleBuilder.go文件RuleBuilder.go 用于从字符串中解析出具体原创 2021-09-29 19:26:43 · 1227 阅读 · 0 评论 -
Golang pprof简介
目录概要pprof的作用使用方式交互式常用命令以profile为例,其余的指标也是用一样的命令Top NList funcTracesweb funcBaseDebug=[num]排查内存泄漏内存逃逸内存泄漏的方式如何判断goroutine泄露概要一般而言,性能分析可以从三个层次来考虑:应用层、系统层、代码层。应用层主要是梳理业务方的使用方式,让他们更合理地使用,在满足使用方需求的前提下,减少无意义的调用;系统层关注服务的架构,例如原创 2021-09-28 20:32:11 · 580 阅读 · 0 评论 -
GOLANG GC基础和调试工具
主要功能Garbage collectors have the responsibility of tracking heap memory allocations, freeing up allocations that are no longer needed, and keeping allocations that are still in-use.实现步骤Mark Setup – STWWhen a collection starts, the first activity tha原创 2021-09-23 14:38:13 · 380 阅读 · 0 评论 -
Golang调度器
目录大量的进程/线程出现了新的问题对于没有协程的程序,我们启动多少个线程比较合适GMP模型(golang调度器模型)调度器组成部分M与P的关系调度器的选取原则调度流程work stealGolang的版本参考文献大量的进程/线程出现了新的问题高内存占用(每个线程需要占用4M的内存) 调度的高消耗CPUN个协程绑定1个线程,优点就是协程在用户态线程即完成切换,不会陷入到内核态,这种切换非常的轻量快速。对于没有协程的程序,我们启动多少个线程比较合适原创 2021-09-14 10:35:58 · 257 阅读 · 0 评论