概览中我们看到我们的服务会运行在docker swarm中,这意味着我们所有的服务,包括支持服务(服务器配置,边缘等)和微服务程序都会运行在docker swarm中。在这个项目结束时,我们运行:

docker service ls

我们会看到下面这些服务

![图片上传中…]

注意:上面这些服务远多于我们在第五章里搭建的s

android 上层应用调用hal android调用go_android 上层应用调用hal

go微服务占用很小的内存-但是性能怎么样?对编程语言做有意义的基测很难。从基测网站上提交的算法上看,go比java8大部分时间会快。go大部分情况和c++差不多快,但在一些基测上,要慢很多。就是说,对于普通的微服务工作-负载HTTP/RPC,序列化/反序列化数据结构,网络吞吐方面,go可以表现的不错。

另一个重要的特性是go具有垃圾回收功能,在go 1.5GC的垃圾回收中只需要停顿几微秒。go的垃圾回收也许不是那么成熟,但是在1.2之后,他表现的很稳定。更为惊奇的是,你可以更改通过更改整个栈相对于类的大小,来更改垃圾回收的性能。

然而,我们在测试性能的同时会写我们的第一个微服务,之后我们会加入熔断,追踪,日志等功能。在我们加入越来越多的功能之后,我们会用Gatling来测试我们的性能。

启动时间

另一个go的特性是它的启动速度非常快。一个普通的HTTP服务器加上一些路由和json序列化功能的服务在几百毫秒就可以启动。当我们在docker中运行时,我们可以运行它们在几秒之内。然而,一个spring boot的微服务需要至少10秒。这个看起来好像没什么影响,但是在你需要快速应对大流量的处理时将会非常有用。

静态链接二进制

另一个优点go的静态链接的二进制包含所有的依赖在一个可执行的二进制文件中,我们可以把这个包放在docker容器中。同时这个文件不大,一般来说10-20MB。这样我们就能得到一个很简单的dokerfile.我们可以用一个很基本的docker镜像来开始。我用的是 iron/base,这个镜像大约6MB。

FROM iron/base
EXPOSE 6868
ADD eventservice-linux-amd64 \
ENTRYPOINT [“./eventservice-linux-amd64”, “-profile=test”]

换句话说,不需要JVM或者其他运行的组件,只需要这个镜像里标准的c库