基于go搭建微服务实践教程 (一)

概览


下面这张图就是咱们将要搭建的项目的概览图。咱们将开始写第一个微服务以后咱们会一点点完成这张图的全部内容。java

clipboard.png

讲解:
白色虚线的方框内: docker swarm集群,运行在一个或多个节点上。
蓝色方框内: Spring cloud/Netflix OSS提供的支持系统,或者其余服务,好比zipkin
黄色方框/白色方框: 一个微服务。python

运行资源消耗


为何咱们要用go来写微服务?除啦有意思和有效率,另外一个主要缘由是go在运行时消耗的内存很是小。下面这张图对比了Spring boot,Spring cloud和go.(都是基于运行在docker swarm上的微服务)linux

clipboard.png

quotes-service是基于spring boot.compservice和accountservice是基于go.两个都是基于http服务器而且有许多库来和spring cloud集成。c++

可是内存消耗如今还要考虑么?咱们如今不是有GB级别的RAM能轻松负载一个java应用么?
能够这么说,可是对于一个大企业,他们不止运行几十个微服务,甚者成百上千的微服务。这样的话减小资源消耗就能省下不少钱。算法

来看一下亚马逊主机的价格:spring

clipboard.png

第二列为cpu数量,第四列为RAM大小。
咱们看到当RAM增长一倍,价钱也随着增长一倍。若是你的cpu足够,就没必要为缺乏内存而要多花一倍的钱,后面咱们也会看到go的服务在处理请求时甚至比spring boot 在闲置的时候少。docker

微服务非功能性要求


这篇博客不只仅关于go搭建微服务,更是如何在spring cloud环境下运行和搭建符合真正用于生产环境的微服务产品。包括:编程

  • 中心化配置
  • 服务发现
  • 日志
  • 分布式探寻
  • 熔断
  • 负载均衡
  • 边缘
  • 监测
  • 安全

这些内容都应该在为服务里实现,不只仅是用go,其余的语言,例如,java,python,写微服务产品时也应该实现这些功能.在这篇博客中我会尽可能从go语言角度覆盖这些内容。json

另外一方面要考虑的是关于微服务的实现,你可能听过:安全

  • HTTP/RPC/REST/SOAP/任何形式的APIS
  • 持久化数据的API (DB clients, JDBC, O/R mappers)
  • 消息处理API (MQTT, AMQP, JMS)
  • 测试 (单元测试,integration, system, acceptance test)
  • 编译工具/CI/CD

我会讲解这其中的一些。

在docker swarm上运行

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

docker service ls

咱们会看到下面这些服务

![图片上传中...]

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

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库
咱们以后会讲解如何编译二进制文件和-profile=test是什么意思。

总结


这篇博客中,咱们介绍为何要用go来作微服务。主要缘由是:

  • 小的内存消耗
  • 性能良好
  • 静态连接二进制文件的方便

下一篇文章中,咱们会开始写第一个微服务。

相关文章
相关标签/搜索