golang 汇编学习小结

本文学习参考自:plan9 assembly 完全解析Go汇编语言

寄存器

Go 汇编的4个伪寄存器,手写Go 汇编的时候使用:

  • FP:用于引用参数和返回值
  • PC:程序计数器
  • SB:用于引用全局符号
  • SP:指向当前栈帧的BP,引用局部变量

Read more...

2019-10-06

Golang中使用断路器

本文学习参考自:Circuit Breaker patterncep21/circuit

业务问题场景

在业务系统中,通常存在服务之间的相互调用,例如服务A调用服务B,当出现如下情形:

  1. 服务A与服务B之间的网络出现异常
  2. 服务B过载
  3. 服务B出现异常

服务A应该减少对服务B的调用量,甚至服务A应该停止调用服务B,有必要的话,还可以采取相应的降级措施`。当服务B恢复正常后,才开始继续调用服务B。


Read more...

2019-08-10

容器网络

本文学习总结自极客时间 深入剖析Kubernetes

单宿主机容器网络互通


容器通过Veth Pair连接到docker0网桥上,实现了容器与容器之间,容器与宿主机之间的网络互通。

  • Veth: virtual Ethernet devices
  • Veth Pair: 一对虚拟以太网设备,可以看作现实生活中的网线,能在不同namespace下传输流量

YouTube视频:Linux VETH Pair - Virtual Ethernet Pair

2个容器之间直接通过Veth Pair可以实现网络互通,但如果有n个容器之间需要互通的话,就可能需要创建n(n-1)/2个Veth Pair,就跟现实生活中需要把很多台计算机实现网络互通一样。

在现实生活中,通常是采用网桥,只需要将每台计算机通过一根网线连接在网桥上,那么计算机之间就可以实现网络互通了。

所以可以通过在操作系统上虚拟出一个网桥设备,将容器通过Veth Pair连接到网桥上,实现容器之间网络互通。

YouTube视频:Docker Advanced Networking

使用bridge网络的容器,路由表类似这样子:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.0.1      0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

对于172.17.0.0/16网段的路由是一条直连规则,凡是匹配到这条规则的IP包,应该经过eth0网卡,通过二层网络直接发往目的主机,因为当前主机和目的主机连接在同一个网桥上。而对于其他IP包,则需要发给网关,网关会根据自己的路由信息对数据包进行转发。


Read more...

2019-02-16

认识docker

本文学习总结自极客时间 深入剖析Kubernetes

进程:程序运起来后的计算机执行环境的总和。

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

Cgroups 技术是用来制造约束的主要手段,而Namespaces 技术则是用来修改进程视图的主要方法。


Read more...

2018-12-31

golang cgo 开发小结

工作上遇到一个需求,需要把一个C++的动态库的功能封装为Web接口。由于没有C++开发经验,C有点经验,于是考虑了两种方案:

  1. 封装为PHP扩展
  2. 在Golang中使用CGO

两种方案我都可以做,但最终决定采用第2种方案,主要考虑的因素是这个Web服务最终需要在客户那里进行私有化部署,采用PHP的话,部署的时候还需要Nginx、Fpm(当然也可以直接用Swoole),但是PHP代码是明文的,虽然可以买一些商业软件进行加密(比如Swoole Compiler)。如果直接用Golang的话,就可以直接给用户部署一个二进制程序(需要strip掉符号信息)就可以了,部署起来更方便。

下面将通过一个示例程序,演示如何在Golang中通过cgo调用C++。


Read more...

2018-03-09

ctrl+c'杀不死'docker container

有时使用ctrl+c杀掉容器时,发现行不通,得用docker stop <container>才行,于是就像弄明白为什么。

从dockerfile官方文档:https://docs.docker.com/engine/reference/builder/#entrypoint,得知ENTRYPOINT有两种形式:

  1. ENTRYPOINT ["executable", "param1", "param2"] (exec格式,推荐使用)
  2. ENTRYPOINT command param1 param2 (shell格式)

使用exec格式,容器的init进程(即PID为1的进程)就是我们指定的可执行程序。

使用shell格式,容器的init进程是/bin/sh,我们的ENTRYPOINT是以/bin/sh -c的子进程启动的。


Read more...

2018-02-16

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...

2017-12-24