- 博客(57)
- 收藏
- 关注
原创 golang开发 gorilla websocket的使用
我们使用二进制数据流,自定义的协议是这样的,先是无符号的 uint 占4个字节,表示行为逻辑,比如111-获取信息, 110- 加好友等等后面是具体的数据,跟HTTP请求的GET或者POST参数类似,具体数据格式定义好就行,比如可以使用JSON数据、可以使用RPC定义好的数据格式修改完之后 client.go 代码是这样的for {select {returnbinary.Write(buf, binary.BigEndian, []byte("我们都好"))if err!= nil {
2024-05-30 16:29:47
1402
2
原创 golang开发 深入理解 context
可以看到最终实现结果和场景,跟Sameer Ajmani在博客描述的是一样的,context的出现主要两个作用,控制 goroutine,goroutine之间传值。可以看到介绍里面主要说的是,应用中怎么控制大量的goroutine退出释放资源、请求范围内怎么传值,也就是说,context的引入主要是为了解决这两个问题。context初始化的方法有五个,一个是main goroutine 初始化,一个主要是是用来传值的,经常使用的就三个。超时的时候执行结果,超过三秒的超时时间,依赖超时时间。
2024-04-16 07:15:38
272
原创 golang开发:goroutine在项目中的使用姿势
很多初级的Gopher在学习了goroutine之后,在项目中其实使用率不高,尤其一些跨语言过来的人,对并发编程理解不深入,可能很多人只知道go func(),或者掌控不够,谨慎一些,尽量少使用或者不使用,用的话就是go func(),主要列一下我们这边的主要使用方法。
2024-03-10 14:58:05
973
原创 openresty package path
openresty lua_package_path 是整个openresty最基础的功能,不理解path就无法做项目,更无法写框架。先看下文档lua_package_pathhttps://github.com/openresty/lua-nginx-module#lua_package_pathSets the Lua module search path used by script...
2022-12-16 10:00:00
1804
2
原创 网络工具netstat与ss
建议使用ss命令,2001年的时候netstat 1.42版本之后就没更新了,之后取代的工具是ss。netstat命令在很多场景下比较慢。ss可以显示跟netstat类似的信息,但是速度却比netstat快很多,netstat是基于/proc/net/tcp获取 信息,而ss是直接从内核读取信息。
2022-12-16 08:37:36
1256
原创 nginx 客户端返回499的错误码
我们服务器客户端一直有返回错误码499的日志,以前觉得比例不高,就没有仔细查过,最近有领导问这个问题,为什么耗时只有0.0几秒,为啥还499了?最近几天就把这个问题跟踪定位了一下,这里做个记录。
2022-10-30 10:00:00
2403
原创 golang开发:go并发的建议(完)
上次说了一下Go语言布道师 Dave Cheney对Go并发的建议,个人觉得最重要的一条,这次主要想说一下这个。 Never start a goroutine without knowning when it will stop
2022-10-08 07:57:19
1069
原创 某云负载均衡获取客户端真实IP的问题
某云负载均衡真实IP的问题,我们这边已经遇到过两次了。而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会给LB部门上报,这个事就没法推进。我们这边的简单的网络架构设这样的。DNS->负载均衡->web机组。
2022-09-29 08:20:17
1135
原创 golang开发:go并发的建议
这个是前段时间看到Go语言的贡献者与布道师 Dave Cheney对Go并发的建议或者叫使用的陷阱(不是我自己的建议),结合自己最近几年对gorotine的使用,再回头看这几条建议,真的会茅塞顿开,觉得特别重要。这篇文章对并发的建议的章节地址https://dave.cheney.net/practical-go/presentations/qcon-china.html#_concurrencyDave CheneyDave Cheney 是 Go 编程语言的开源贡献者和项目成员。David 是.
2022-04-05 07:28:27
858
原创 nginx proxy_next_upstream 与openresty balancer.set_more_tries的使用
背景我们这边网关服务使用的 kong,前段时间上线一个服务,这个服务它报错了,产生了502的错误码,追查这个报错的时候发现了网关服务的两个可疑的地方,第一个疑点是我们在Kong上配置的 Retries = 5,但是实际实际上我们的代理重试至多只会重试三次。第二个疑点是我们的重试只重试了502 和 504,大量的500错误没有重试。带着这两个问题了查了下kong和openresty代码。结论首先给出问题的结论第一个问题 Kong上配置的 Retries = 5,但是实际上只会重试三次。出现这个问题的原
2021-09-21 06:40:31
1912
原创 golang开发:Error的使用
Error是Go语言开发中最基础也是最重要的部分,跟其他语言的try catch的作用基本一致,想想在PHP JAVA开发中,try catch 不会使用,或者使用不灵活,就无法感知到程序运行中出现了什么错误,是特别可怕的一件事。Error 基础Golang中 error类型就是一个最基本interface,定义了一个Error()的方法type error interface { Error() string}平常使用中errors.New("error")在Golang中这样定义.
2021-07-20 06:47:52
1792
1
原创 rendertron安装
前端时间做SEO的优化,使用的是GoogleChrome/rendertron,发现这个安装部署的时候还是会有一些要注意的地方,做个记录为什么要使用rendertron目前很多网站都是使用 vue、recat等框架开发的网站,一般都是在服务器上只有一个index.html,index.html引入JS,通过JS在客户端的浏览器上渲染出页面。如果是搜索引起的爬虫,它不像浏览器可以直接渲染,它只能拿到一段无意义的JS代码,这些代码对SEO的收录没有任何意义。所以Google就做了rendertron.
2021-01-25 07:50:30
1001
原创 golang开发:http请求redirect的问题
这两天在开发项目的时候遇到了一个问题,请求了一个URL,它会302到另一个地址,本意上只是想检查这个URL是否会做3XX的redirect跳转,结果每次reqeust都会返回最后一跳的结果。后来就看了下源码,了解下请求跳转的机制实现代码看下实现的简单代码func main() { client := &http.Client{} url := "http://www.qq.com" reqest, err := http.NewRequest("GET", url, nil) if.
2020-10-27 07:40:40
7460
原创 golang开发:channel使用
channel主要是用于多个goroutine之间通信channel语法channel是引用类型,需要实用make来创建channel,如下make(chan Type, [buffer])chan Type 通道的类型buffer 是可选参数,代表通道缓冲区的大小(省略则代表无缓冲)向channel里面写入数据使用 <- 符号q := make(chan bool)q<-true从channel里面读取数据也是使用 <- 符号,只不过写入的channel在右边,读.
2020-09-26 19:38:11
1139
原创 golang开发:select多路选择
select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,select 会随机执行一个可运行的 case。如果没有 case 可运行,goroutine 将阻塞,直到有 case 可运行。select 多路选择select写法上跟switch case的写法基本一致,只不过golang的select是通信控制语句。select的执行必须有通信的发送或者接受,如果.
2020-09-26 08:16:03
1071
原创 golang开发:WaitGroup Mutex
CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,最初于Tony Hoare的1977年的论文中被描述,影响了许多编程语言的设计。golang CSP模型golang语言并没有完全实现了CSP模型的所有理论,仅仅是借用了 process和channel这两个概念。process是在golang语言上的表现就是 goroutine, 是实际并发执行的实体,每个实体之间是通过channel通讯来实现数据共享。最经典的数据.
2020-09-15 07:21:26
915
原创 关于Nginx mmap(MAP_ANON|MAP_SHARED, 314572800)报错
mmap 报错解决今天修改了一下测试环境的Nginx的nginx.conf,然后做检测的时候报了一个错误/usr/local/bin/nginx -c /usr/local/etc/openresty/conf/nginx.conf -tnginx: [alert] mmap(MAP_ANON|MAP_SHARED, 314572800) failed (12: Cannot allocate memory)nginx: configuration file /usr/local/etc/open
2020-09-12 07:58:50
2024
原创 APISIX的安装和简单使用
APISIX 是一个云原生、高性能、可扩展的微服务 API 网关。它是基于 Nginx 和 etcd 来实现,和传统 API 网关相比,APISIX 具备动态路由和插件热加载,特别适合微服务体系下的 API 管理。APISIX安装首先安装依赖https://github.com/apache/incubator-apisix/blob/master/doc/zh-cn/install-dependencies.md# 安装 OpenResty, etcd 和 编译工具sudo yum ins.
2020-07-19 00:14:15
6011
原创 tmux使用--同步多终端输入
最近一直需要同时操作多个远程机器,就学习了下tmux的简单使用。tmux(terminal multiplexer)是终端复用神器。对个窗格同时使用特别好用,同步操作多台机器特别好用。tmux安装Ubuntu 或 Debianapt-get install tmuxCentOS 或 Fedorayum install tmuxMacbrew install tmux安装完成完成后输入 tmux 回车,就会进入tmux窗口tmux的简单使用主要介绍下窗格的使用tmux有很多快捷键,.
2020-07-13 22:50:43
4149
1
原创 vagrant 多个box的操作|共享目录失败
本来机器上已经有一个Ubuntu的box了,今天想在安装一个centos的box,结果还折腾了很长时间。多个机器的命令添加box的时候需要使用名称,一个的时候可以忽略名称vagrant box add Ubuntu.box多个的时候必须指定名称vagrant box add centos CentOS-7-x86_64-Vagrant-1910_01.VirtualBox.boxinit也一样,需要指定刚刚创建的名字vagrant init centos然后执行 up,竟然报错了v.
2020-05-17 21:41:12
1598
原创 golang开发:环境篇(七) Go mod 使用
Glide用的好好的,为什么要使用Modules在 Go 1.11 中 ,官方加入package management tool,称为Go Modules。Go mod 没有出现之前,用的最多的包管理器就是 govendor、glide等,这些工具都未达到Go对包管理的预期,比如每次下载,比如墙外下载,比如对GOPATH的依赖,比如多版本的控制等等。然后Go Modules就出现了,它不依赖于G...
2020-04-15 22:42:04
1762
原创 表格的交集合集等的命令处理
工作中经常遇到运营同学需要统计数据,需要从各种表里查询出来各种数据做组织和合并处理,了解了这些命令处理表格就非常简单高效。而且处理的速度比写各种复杂的SQL要高效的多。当然了,只能处理CSV数据。几个基础命令sort 排序命令 uniq 唯一命令sort 参数说明-n依照数值的大小排序-uunique,输出的结果是去重-r默认是升序,以降序来排序...
2020-03-14 19:27:46
955
原创 Linux中screen命令
screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。screen重要性screen的重要性,主要是体现在它可以方便的在服务器上一直运行,只要服务器没有宕机,没有断电它就可以做到不用停止。其实后端工程师经...
2020-02-25 22:49:12
1325
原创 Linux中sed基础
sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件...
2019-12-15 12:33:43
181
原创 Linux:AWK基础
AWK是一个强大的文本分析工具,算是Linux系统特别有用的命令了,在日志分析、文件内容分析中扮演特别重要的角色。AWK说明简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。...
2019-12-07 07:56:43
458
原创 golang开发:类库篇(五)go测试工具goconvey的使用
为什么要使用goconvey测试程序goconvey 集成go test,go test 无缝接入。管理运行测试用例,而且提供了丰富的函数断言、非常友好的WEB界面,直观的查看测试结果。如果没有goconvey的话,编写一个测试结果,首先运行被测试函数,然后判断被测试函数的运行结果,各种if判断,各种输出提示信息,而且回归测试也比较麻烦。但是如果使用了goconvey这些都就变得无比的简单。...
2019-09-17 07:16:42
1316
原创 浅谈限流(下)实战
常见的应用限流手段应用开发中常见的限流的都有哪些呢?其实常用的限流手段都比较简单,关键都是限流服务的原子化。为了在LB上实现高效且有效的限流,普遍的做法都是Nginx+Lua或者Nginx+Lua+Redis去 实现服务原子化,所以市面上比较常用的waf框架都是基于Openresty去实现的。我们看下比较常用的几个限流方式。Openresty+Redis...
2019-09-10 08:07:15
351
原创 golang开发:类库篇(四)配置文件解析器goconfig的使用
为什么要使用goconfig解析配置文件目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量。例如,生产环境跟测试环境使用同一份配置,但是相应的环境下的变量的值是不一样的,通过环境获其取对应的的key value。没明白没关系,举例子的时候就明白了。PHP的框架yaf。golang的框架beego。对配置的书写和...
2019-07-20 08:44:13
749
原创 golang开发:类库篇(三)命令行工具cli的使用
为什么要使用命令行觉得这个问题不应该列出来,又觉得如果初次进行WEB开发的话,可能会觉得所有的东西都可以使用API去做,会觉得命令行没有必要。其实,一个生产的项目命令行是绕不过去的。比如运营需要导出报表、统计下付费用户、服务不稳定修改下订单状态等等,再者,命令行的工具基本都是内部使用,调试日志可以随意点,退一万步来说,即使有问题了,还可以再次修改。不像API是是随机性的,有些业务发生错误和异常...
2019-07-14 18:53:44
873
原创 关于Keepalive的那些事
服务端很多同学包括自己对keepalive理解不清晰,经常搞不清楚,TCP也有keepalive,HTTP也有keepalive,高可用也有,经常混淆这几个概念。做下这几个概念的简述,尽管名字基本上是一样的,但是所表示意义和范畴却大相径庭。高可用 KeepalivedKeepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障。它的作用是检测服务器的状态,...
2019-07-13 22:34:09
1256
原创 golang开发:类库篇(二) Redis连接池的使用
为什么要使用连接池一个数据库服务器只拥有有限的连接资源,一旦所有的连接资源都在使用,那么其它需要连接的资源就只能等待释放连接资源。所以,在连接资源有限的情况下,提高单位时间的连接的使用效率,缩短连接时间,就能显著缩短请求时间。所以就有了连接池的概念,在初始化时,创建一定数量的连接,先把所有连接存起来,然后,谁需要使用,从这里取走,干完活立马放回来。 如果请求数超出连接池容量,那么就排队等待、退...
2019-07-09 07:07:28
667
转载 寒门女孩清华毕业典礼上发言
毕业生代表张薇在清华2019年本科生毕业典礼上的发言 – 坚持与担当尊敬的各位老师、亲友、来宾,亲爱的同学们: 大家上午好!我是工业工程系的张薇,非常荣幸能够作为2019届毕业生代表在这里发言。 几年前,因为清华园,我们遇见了彼此。不经意间,清芬园开张了,食堂的餐勺换了,学堂路两旁的树长出了新枝,我们也成长为了更好的我们。我总觉得我们这届学生是幸运的,我们共同见证了艺术博物馆的...
2019-07-08 21:22:43
533
原创 golang开发:类库篇(一) Zap高性能日志类库的使用
为什么要用zap来写日志原来是写PHP的,一直用的error_log,第一次写Go项目的时候,还真不知道该怎么写日志,后来就按照PHP的写法自己不成规范的捣鼓写。去了新公司之后,发现用的是zap。后来查询了解了下zap,前同事反应他们很多大公司都在使用zap写日志,GitHub上star 高达7K多,足以说明它的广泛性稳定性,肯定最主要的是高效性。是Uber开源的高性能的日志库...
2019-06-30 04:57:12
3367
原创 重定向Redirect 的常识
今天下班的时候看到了一些重定向的基础知识,也算开了眼界。以前也经常使用301和302,但从来没有使用过和了解过其他的3XX的状态码,发现原来里面涉及的知识和解决的问题的问题还不少。重定向的流程浏览器首先访问服务器A的URL,服务器A返回带着location为B的URL的 header 和3XX的状态码,浏览器读取响应的3XX状态码,获取到头部的 location,然后跳转到服务器B的URL...
2019-06-28 23:11:57
1838
原创 golang开发:环境篇(六) Go运行监控Supervisord的使用
为什么要使用Supervisord17年第一次写Go项目的时候,用Go开发项目倒没没费多大劲,很快就开发完成了。到了在测试环境部署的时候,由于不知道有 Supervisord 这个软件,着实花了些功夫。总不能跟开发环境一样,直接执行编译生成的二进制文件吧,即使 后台执行了,万一它挂了,没人知道,即使测试人员发现了,开发还得登录到服务器再次启动下这个二进制文件。很明显这个解决方案没有任何意义,后来...
2019-06-22 08:53:40
911
原创 golang开发:环境篇(五)实时加载工具gin的使用
gin 工具是golang开发中非常有用且有效的工具,有效的提高了开发调试go程序的效率。为什么要使用gin我们知道golang是编译型语言,这就表示go程序的每次改动,如果需要查看改动结果都必须重新编译一次,即go build .像我们从事go web的开发,可能是从其他解释型语言跨过来的,就特别的不适应这种调试开发,改完代码需要编译go build。然后,gin的出现就为了解决这种需...
2019-06-19 21:56:25
1249
原创 golang开发:环境篇(四)包管理器 glide的使用
glide 是golang项目开发中是特别重要的软件,没有它,golang的项目可能都无法发布。为什么要使用glide平时我们开发Go项目的时候,使用第三方的包的时候都直接使用go get 去获取第三方的包,但是go get获取到的包是项目的develop分支,我们开发的时候倒是可以不怎么关注。但是如果到了生产环境,直接使用go get 是有很大风险的,因为,众所周知,develop是开...
2019-06-15 13:14:56
453
原创 golang开发:环境篇(三)开发利器Goland安装与激活
这节主要介绍下golang开发的最主要的IDE,Goland。可以有效提高开发效率。用过一段时间 IntelliJ+GO插件,其实功能上跟goland差不多。不过团队的其它开发者基本都是Goland,后来为了统一各种格式和开发规范,也就换成了Goland。IDE的使用,功能基本都类似,哪个方便使用哪个。最好团队都使用一样的IDE。下载安装Goland下载地址:https://www.jet...
2019-06-09 07:59:56
1860
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人