Go微服务 - 第一部分 - 介绍及理论基础

Go微服务理论基础介绍

蓝图概述

下图是咱们整个系列文章中构建的系统蓝图总体视图。然而,咱们将从头开始写咱们的第一个Go微服务,而后当咱们沿着博客系列的各部分进展时,咱们将会愈来愈接近下面的图所表明的结构。python

clipboard.png

图例基本以下:linux

  • 虚线白框: 在一个或多个节点上运行的逻辑Docker Swarm集群。
  • 蓝色框: 来自Spring Cloud/Netflix OSS栈或其余服务例如Zipkin的支持服务。
  • 沙色/白盒: 实际的微服务。

它或多或少和Magnus Larssons微服务博客系列中使用的蓝图相同,主要区别在于实际微服务是使用Go嵌入Java来实现的。qutoes-service是一个例外,它为咱们提供了基于JVM的微服务, 咱们能够用于和咱们的基于Go的微服务的无缝集成对比以及测试平台。算法

理论基础: 运行信息

有人会问,为何咱们要使用Go来写微服务呢? 除了可使用这么有趣和具备创造性的语言干活以外,使用Go构建微服务的主要理由是具备微小的内存占用。让咱们看看下面的截图,咱们正运行在Docker Swarm下的Go微服务以及基于Spring Bot和Spring Cloud架构的微服务。编程

clipboard.png

quotes-service是Spring启动的,而compservice和accountservice是基于Go的。二者都是使用大量类库部署和Spring Cloud基础设施集成起来用于处理HTTP的服务器。安全

2017年真的重要吗? 看看Java实现的微服务和Go实现的微服务所占的内存大小,就会让咱们感受到吃惊, 相差几十倍。确实如此,对于大型企业来讲,运行数十个服务都是少的,不少公司会运行成千上万的放在云提供上的微服务。当咱们运行大量的容器,节约资源会为公司节省大量的资金。服务器

微服务的非功能性需求

本文不只仅是关于如何使用Go语言构建微服务的 - 它一样是一个在Spring Cloud环境中表现良好的,而且是符合一个生产就绪的微服务领域所须要的品质。网络

考虑以下(顺序无特殊考虑):数据结构

  • 集中化配置: Centralized configuration.
  • 服务发现: Service Discovery.
  • 日志: Logging.
  • 分布式跟踪: Distributed Tracing.
  • 断路器: Circuit Breaking.
  • 负载均衡: Load balancing.
  • 边界: Edge.
  • 监控: Monitoring.
  • 安全: Security.

全部这些东西我认为当你决定尝试微服务的时候都须要考虑的,而不用管你具体使用Go语言、Java语言、js、python、C#仍是其余你喜欢的语言来编码。这个博客序列咱们从Go语言的视角来揭示全部的这些话题。架构

另一个视角是在你实际的微服务实现中的东西。无论你来自什么语言,你均可能有提供了以下功能的类库:负载均衡

  • HTTP/RPC/REST/SOAP/诸如此类的API.
  • 持久化API(DB客户端、JDBC、O/R映射).
  • 消息API(MQTT、AMQP、JMS).
  • 可测试性(单元测试/集成测试/系统测试/验收测试).
  • 构建工具(CI/CD)
  • 更多...

我不会涵盖这些话题的全部内容。若是我要这么作,我将会写一本书而不是博客系列文章。我将涵盖它们中的一小部分。

在Docker Swarm模式下运行

这些文章系列中的系统领域的基本前提是咱们的运行环境是Docker Swarm。意思就是全部服务 - 支持服务(配置服务器、边界服务等)或实际微服务实现都是部署为Docker Swarm服务中的。 当咱们到文章序列末尾的时候,有以下Docker命令:

clipboard.png

再次请注意,上面列举的服务包含了咱们在第五部分设置咱们的Swarm阵列的时候会包含的不少服务。

性能

好吧 - 由于Go微服务占用很小的内存信息 - 可是它们能执行吗? 有意图的对标不一样编程语言是很是难的。也就是说, 若是咱们拿例如benchmarkgame这样的网站来看,人们能够提交明确算法的各类语言中的实现, 而后互相进行性能比较,Go语言通常稍微比Java 8快些,稍微有点意外。 Go语言实际一般和C++对比稍微慢一点,只是基于一些基准测试场景而言。也就是说, Go语言对于通常的微服务工做负载来讲执行很好 - 服务HTTP/RPC, 序列化/反序列化数据结构, 处理网络I/O等等。

Go语言另一个特别重要的属性就是它具备垃圾回收机制的语言。在Go 1.5的垃圾回收主要重写以后,GC暂停通常几乎应该就几毫秒的样子。若是你来自JVM世界(我本身就是),Go语言的垃圾回收器可能还不是那么成熟,可是在Go 1.2之后引入的一些改变让它彷佛已经很是可靠了。这也是一个不可配置的奇迹--也有一个球形把手(GOGC), 你能够微调Go语言中的GC行为, 能够控制相对可到达对象的总堆尺寸。

然而 - 跟踪性能影响,由于咱们将构建咱们第一个微服务,而且添加诸如断路器、跟踪、日志等东西到里边, 这样能够很是有意思,所以咱们在后面的文章中将使用Gatling测试, 来看咱们不断向微服务添加更多功能后的性能变化。

启动时间

Go应用程序的另一个好特色就是它启动很是快。简单的带有一些路由、JSON序列化等的HTTP服务器通常启动时间最多100微秒。当咱们在Docker容器中运行咱们的Go微服务,咱们能够看到它们健康的就绪服务最多数秒之内, 而咱们相关的Spring Boot类型的微服务通常须要至少10秒才能就绪。虽然这不是最重要的特色,可是它确定是有用的,当你的环境须要经过快速扩展来处理没法预料的大访问量。

静态连接二进制文件

基于Go语言的Docker微服务的另一个大好处是,咱们能够在一个可执行二进制文件中得到静态连接的二进制全部依赖关系。虽然文件自己不是很紧凑(一个微服务通常来讲具备10-20Mb的样子), 最大的好处是咱们能获得很是简单的Dockerfile,而且咱们可使用很是裸露的基础Docker映像。 我使用了一个基础映像叫作iron/base, 它大概只有6MB。

FROM iron/base

EXPOSE 6868
ADD eventservice-linux-amd64 /
ENTRYPOINT ["./eventservice-linux-amd64", "-profile=test"]

换句话说就是 - 没有JVM或其余运行时的必要组件, 除了标准C库(libc)以外,都是包含在基本映像之中的。

咱们将在后续文章中更加深刻到如何构建咱们的二进制以及-profile=test的一些东西。

总结

本篇文章中,咱们介绍了一些使用Go语言构建微服务的一些关键因素: 例如内存信息占用少、良好的性能以及便捷的静态连接二进制。

中英文对照

  • 运行信息: Runtime footprint, 参考连接: https://bbs.csdn.net/topics/4...
  • 单元测试: Unit Test.
  • 集成测试: Integration Test.
  • 系统测试: System Test.
  • 验收测试: Acceptance Test.
  • 持续集成: Continuous Integration.
  • 持续部署: Continuous Deployment.

参考连接

相关文章
相关标签/搜索