Code For Colorful Life
golang cgo 开发小结
工作上遇到一个需求,需要把一个C++的动态库的功能封装为Web接口。由于没有C++开发经验,C有点经验,于是考虑了两种方案:
- 封装为PHP扩展
- 在Golang中使用CGO
两种方案我都可以做,但最终决定采用第2种方案,主要考虑的因素是这个Web服务最终需要在客户那里进行私有化部署,采用PHP的话,部署的时候还需要Nginx、Fpm(当然也可以直接用Swoole),但是PHP代码是明文的,虽然可以买一些商业软件进行加密(比如Swoole Compiler)。如果直接用Golang的话,就可以直接给用户部署一个二进制程序(需要strip掉符号信息)就可以了,部署起来更方便。
下面将通过一个示例程序,演示如何在Golang中通过cgo调用C++。
Read more...
ctrl+c'杀不死'docker container
有时使用ctrl+c
杀掉容器时,发现行不通,得用docker stop <container>
才行,于是就像弄明白为什么。
从dockerfile官方文档:https://docs.docker.com/engine/reference/builder/#entrypoint,得知ENTRYPOINT
有两种形式:
ENTRYPOINT ["executable", "param1", "param2"]
(exec格式,推荐使用)ENTRYPOINT command param1 param2
(shell格式)
使用exec格式,容器的init进程(即PID为1的进程)就是我们指定的可执行程序。
使用shell格式,容器的init进程是/bin/sh
,我们的ENTRYPOINT
是以/bin/sh -c
的子进程启动的。
Read more...
Golang understanding interface
本文简单总结自Understanding Go Interfaces,对应的PPT。
In object-oriented programming, a protocol or interface is a common means for unrelated objects to communicate with each other.
Read more...
Golang profiling and optimizing
本文总结自Profiling and Optimizing Go,对应的PPT,有梯子的可以直接看视频,没梯子的也可以看下这篇文章:) 。
Golang的runtime内建了强大的分析工具pprof,能帮助我们对程序运行时的CPU、内存进行分析。
首先,跟随视频,将作者提供的代码clone下来。在我们的工作区执行go get -v github.com/prashantv/go_profiling_talk
即可。
进入src/github.com/prashantv/go_profiling_talk
,master分支是优化过的最快的版本,slow分支是优化前的版本,执行go run main.go
即可启动一个http服务。
代码说明:
- 以一个http服务运行,有两个请求路径
/hello
和/simple
/hello
的请求会增加一些统计信息的记录,然后输出Hello world
/simple
的请求则是简单的输出Hello world!
- 实践目的:通过pprof分析优化
/hello
接口的性能,使其与/simple
接口的性能差距尽量小。
Read more...
ES简单的通用日志方案
本文介绍笔者所使用的ES简单通用的应用日dudp志方案。
首先说明下需求:业务日志希望能够有一个地方能够统一存储,能够检索和展示报表,并且简便地接入新的业务日志。
于是设计了如下的架构:
- 业务通过udp协议的方式将日志以json编码的格式发送给udp2kafka服务,并且日志中包含需要写入的index
- udp2kafka将接收到的日志写入kafka
- kafka2es进行消费,根据日志中的index,写入到es相应的index中
Read more...
Golang动手写一个Http Proxy
本文主要使用Golang实现一个可用但不够标准,支持basic authentication的http代理服务。
为何说不够标准,在HTTP/1.1 RFC中,有些关于代理实现标准的条目在本文中不考虑。
Http Proxy是如何代理我们的请求
Http 请求的代理如下图,Http Proxy只需要将接收到的请求转发给服务器,然后把服务器的响应,转发给客户端即可。
Https 请求的代理如下图,客户端首先需要发送一个Http CONNECT请求到Http Proxy,Http Proxy建立一条TCP连接到指定的服务器,然后响应200告诉客户端连接建立完成,之后客户端就可以与服务器进行SSL握手和传输加密的Http数据了。
为何需要CONNECT请求? 因为Http Proxy不是真正的服务器,没有www.foo.com的证书,不可能以www.foo.com的身份与客户端完成SSL握手从而建立Https连接。 所以需要通过CONNECT请求告诉Http Proxy,让Http Proxy与服务器先建立好TCP连接,之后客户端就可以将SSL握手消息发送给Http Proxy,再由Http Proxy转发给服务器,完成SSL握手,并开始传输加密的Http数据。
Read more...