一、服务端架构的演进
1、单体架构
在 Web 应用程序发展的早期,大部分工程是将所有的服务端功能模块打包成单个巨石型应用,最终会形成如下图所示的架构。
优点:
- 开发简单
- 技术单一
- 部署方便
缺点:
- 随着业务的发展,应用会越来越庞大
- 技术栈单一,不易扩展
- 牵一发而动全身
2、垂直分层架构
随着单体应用越来越庞大,单体架构中不同业务模块的差异就会显现,将大应用拆分成一个个单体结构的应用。垂直分层是一个典型的对复杂系统进行结构化思考和抽象聚合的通用性方法。
优点:
- 分担部分流量
- 服务间相互独立,可以针对单个服务模块进行优化
- 易于水平扩展
缺点:
- 集群搭建变得复杂
- 可能存在大量耦合代码,调用关系错综复杂
- 难以维护
3、微服务架构
微服务是一种小型的SOA架构(面向服务的架构),其理念是将业务系统彻底地组件化和服务化,形成多个可以独立开发、部署和维护的服务或者应用的集合,以应对更快的需求变更和更短的开发迭代周期。
优点:
- 服务模块解耦
- 团队分工更容易,更明确
- 独立部署,可针对独立模块进行发布
- 扩展能力强
缺点:
- 服务划分标准多样
- 增加系统复杂度
- 部署更复杂
- 对整个团队的要求更高
微服务特点:
- 在分布式环境中,将单体应用拆分为一系列服务,共同组成整个系统。
- 每个服务都是轻量级,单独部署。
- 每个微服务注重自己的核心能力的开发,微服务组件之间采用RPC轻量级通信方式进行通信。
- 按照业务边界进行划分。
- 微服务是一种编程架构思想,有不同的语言实现。
二、Go语言中的微服务
1.Go Micro
那么,什么是 Go Micro ?
它是一个可拔插的 RPC 框架,用于在 Go 中编写微服务。开箱即用,您将看到:
- 服务发现 - 自动向服务发现系统注册的应用程序。
- 负载均衡 - 客户端负载均衡,用于平衡服务实例之间请求的负载。
- 同步通信 - 提供请求/响应传输层。
- 异步通信 - 内置发布/订阅功能。
- 消息编码 - 基于消息的 Content-Type 请求头的编码/解码。
- RPC 客户端/服务器打包 - 利用上述特性并公开接口来构建微服务。
Go Micro 架构可以描述为三层堆栈。
顶层包括 Server-Client 模型和服务抽象。该服务器是用于编写服务的基础。而客户端提供了一个接口,用于向服务端发起请求。
底层包含以下类型的插件:
- Broker - 提供一个消息代理接口,用于异步发布/订阅通信。
- Codec - 用于编码/解码消息。支持的格式包括 json,bson,protobuf,msgpack 等。
- Registry - 提供服务发现机制(默认为 Consul )。
- Selector - 基于注册表构建的负载均衡抽象。 它允许使用诸如random,roundrobin,leastconn 等算法“选择”服务。
- Transport - 服务之间同步请求/响应通信的接口。
2.Go Kit
Go Kit 是一个用于在Go中构建微服务的编程工具包。与 Go Micro 不同,它是一个旨在导入二进制包的库。
Go Kit 遵循简单的规则,例如:
- 没有全局状态
- 声明性构造
- 显式依赖
- 接口作为契约
- 领域驱动设计
在 Go Kit 中,您可以找到以下包:
- 身份验证 - basic和JWT。
- 传输 - HTTP,Nats,gRPC 等。
- 日志记录 - 服务中结构化日志记录的通用接口。
- 软件度量 - CloudWatch,Statsd,Graphite等。
- 追踪 - Zipkin 和 Opentracing。
- 服务发现 - Consul,Etcd,Eureka等。
- 熔断器 - Hystrix 的 Go 语言实现。
3.Gizmo
Gizmo 是纽约时报的微服务工具包。它提供了将服务器和 pubsub 守护进程组合在一起的软件包。它公开了以下包:
- server - 提供两种服务器实现:SimpleServer(通过 HTTP ),RPCServer(通过 gRPC )。
- server/kit - 基于 Go Kit 的实验包。
- config - 包含功能:解析 JSON 文件,Consul 键值对中的 JSON blob ,或者环境变量。
- pubsub - 提供通用接口,用于从队列中发布和使用数据。
- pubsub/pubsubtest - 包含发布者和订阅者接口的测试实现。
- web - 公开用于从请求查询和有效负载中解析类型的函数。
Pubsub包提供了使用以下队列的接口:
- pubsub/aws - 适用于 Amazon SNS/SQS。
- pubsub/gcp - 适用于 Google Pubsub。
- pubsub/kafka - 适用于 Kafka主题。
- pubsub/http - 用于通过 HTTP 发布。
比较框架