有关基于 GO 构建微服务的相关技术栈 - 技术收集
1. 理论方面
1.1. 陈皓
- 分布式架构冰与火
- 原因:增大系统容量与提升系统可用性
- 复杂:功能开发、部署、隔离、架构设计、性能和吞吐、运维、上手、技术、测试和排错、扩容、维护管理
- AWS 分布式
- 难点
- 分布式团队架构
- 查错
- 吃自己狗粮
- 运维优先,简单和自动化
- 内外部服务一致(内部服务也有对外服务能力)
- 问题
- 异构系统标准问题(通讯协议、配置三层、状态码)
- 服务依赖(服务拆分、数据库拆分)
- 故障概率增大(运维困难)
- 基础层、平台层、应用层、接入层(网关)
- 难点
- 技术栈
- 两件事:提高整体系统吞吐,服务更高流量;提高系统稳定性,让系统的可用性更高
- 提高架构性能:加缓存(缓存系统)、负载均衡(网关)、异步调用(异步系统)、数据镜像(数据一致性问题)和数据分区(依赖数据路由,存在数据 Join 问题)
- 提高架构稳定:服务拆分(故障隔离、模块复用,但带来服务依赖)、服务冗余(去单点、弹性伸缩)、限流降级(保护)、高可用架构、高可用运维(CI/CD)
- 解决方式:
- 服务治理:服务拆分、调用、发现、依赖、关键度定义,解决服务间链关系
- 架构软件管理:服务编排、聚合、事务、版本、生命周期管理
- DevOps
- 自动化运维
- 资源调度
- 整体监控
- 流量控制(负载君合、服务路由、熔断、降级、限流)
- Docker+K8S
- 纲(五个关键点):
- 流量调度
- 服务/资源调度
- 数据/状态调度
- 应用整体监控监控
- 开发和运维自动化
- 两件事:提高整体系统吞吐,服务更高流量;提高系统稳定性,让系统的可用性更高
- 监控系统(Zipkin、Google Dapper 系统)
- 功能:全栈监控(基础层、中间层、应用层)、关联分析、跨系统调用的串联、报警和自动处置、系统可用性分析
- 标准化:日志结构、格式、分析、统一平台
- 坏与好:监控数据隔离、监控数据项太多; 整体 SLA、指标聚合、快速定位(无侵入的 trace 跟踪)
- 服务治理
- 功能:服务关键程度、依赖关系、服务发现、整体架构版本管理、应用生命周期全管理
- 整体版本管理:manifest、VersionSet
- 服务与资源调度:状态的维持和拟合、弹性伸缩和故障迁移、作业和应用调度、作业工作流编排、服务编排
- 服务拟合(K8S 调度控制系统)
- 弹性伸缩
- 故障转移:宠物模式(救活)、奶牛模式(新生)
1.2. 微服务理论相关
- 构建分布式应用系统相关理论
- http://dockone.io/article/9218
1.3. 监控度量可视化
2. VM 管理模式
2.1. 技术栈
2.1.1. 问题
- 多技术栈
- 多框架
- 多语言
- 遗留系统
2.1.2. 统一技术栈
基于 k8s+istio,集合 golang 生态输出
2.1.3. IPC 通信协议
SOAPXML- JSON over HTTP
- GRPC
2.1.4. 微服务/服务网格基础架构部分
- 流量调度的负载均衡
- 服务注册、服务发现
- 容错处理
- 服务检测 (Observability & Insight)
- 监控和跟踪 (Monitoring & Tracing)
- 服务熔断 (Circuit Breaking)
2.2. Java 微服务开源工具组件(Netflix,OSS)
- Eureka:服务注册 / Consul (golang)
- Ribbon: Client Side LB
- Hystrix: Circuit Breaker
- Zipin: 分布式链路跟踪 / jaeger (golang) / opentracing
- Prometheus: 监控 (golang)
- Grafana: 数据可视化面板 (golang)
2.3. 负载均衡、限流、熔断
2.3.1. Zuul
Zuul 是一项边缘服务,提供动态路由,监控,弹性,安全性等。
2.3.2. Ribbon
Ribbon 是一个客户端 IPC 库,在云中经过实战测试。它提供以下功能:
- 负载均衡
- 容错
- 异步和反应模型中的多协议(HTTP,TCP,UDP)支持
- 缓存和批处理
2.3.3. Hystrix
Hystrix:分布式系统的延迟和容错 Hystrix 不再处于活动开发阶段,目前处于维护模式。
2.4. 分布式链路跟踪
- 可观察性要求对日益复杂的体系结构有深入的了解
- 集成工具集将为团队生产力带来重要的改进
- 确保您选择的技术能够支持当前挑战所要求的规模、性能和成本效益方面的这些需求
2.4.1. Dapper 分布式系统跟踪理论
2.4.2. Zipkin
Zipkin 是一种分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的计时数据。功能包括收集和查找此数据。
该存储库包括一个无依赖的 Java 库和一个 spring-boot 服务器。存储选项包括内存,MySQL,Apache Cassandra 和 Elasticsearch。传输选项包括 HTTP,Apache ActiveMQ,Apache Kafka,gRPC,RabbitMQ 和 Scribe(Apache Thrift)。
2.4.3. Prometheus(devops)
Prometheus 是一个云原生计算基础项目,是一个系统和服务监控系统。它以给定的时间间隔从配置的目标收集指标,评估规则表达式,显示结果,并且如果观察到某些条件为真,则可以触发警报。
2.4.4. Grafana
数据可视化面板
2.4.5. Metrics
Metrics 是一个 Java 库,可以让您无比深入地了解代码在生产中的作用
2.4.6. opentracing + jaeger
- jaeger:
- 开源,端到端的分布式跟踪
- 迁移到分布式架构时出现的大多数操作问题最终都基于两个方面:网络和可观察性
- Uber 出品
- opentracing:
- OpenTracing 由 API 规范,已实现规范的框架和库以及项目文档组成。
- OpenTracing 项目正致力于为分布式跟踪创建更标准化的 API 和工具。
2.5. 错误异常跟踪
2.5.1. Sentry
2.6. 配置管理
2.6.1. Puppet
Puppet 是一个开放核心的 软件配置管理工具。
由 Luke Kanies 于 2005 年创建。它是用 C ++,Clojure 和 Ruby 编写的,
Puppet 旨在以声明方式管理类 Unix 和 Microsoft Windows 系统的配置。用户使用 Puppet 的声明性语言或 Ruby DSL(特定于域的语言)来描述系统资源及其状态。
2.6.2. Chef
Chef 是用 Ruby 和 Erlang 编写的配置管理工具的名称,2009 年 1 月初始版本
它使用纯 Ruby,特定于域的语言(DSL)来编写系统配置,用户编写描述 Chef 如何管理服务器应用程序和实用程序(如 Apache HTTP Server,MySQL 或 Hadoop)以及如何配置它们的“配方“
2.6.3. Ansible
Ansible 是一个开源 软件供应,配置管理和应用程序部署工具,2012 年 2 月初始版本
它包含自己的声明性语言来描述系统配置,模块大多是独立的,可以用标准脚本语言(如 Python,Perl,Ruby,Bash 等)编写。
Ansible 由 Michael DeHaan 编写并于 2015 年被 Red Hat 收购.Ansible 是无代理的,通过 SSH 或远程 PowerShell 临时连接以执行其任务。
2.6.4. Salt
Salt(有时也称为 SaltStack)是基于 Python 的开源软件,用于事件驱动的 IT 自动化,远程任务执行和配置管理。2011 年 3 月初始版本
支持“基础架构即代码 ”方法,用于数据中心系统和网络部署与管理,配置自动化,SecOps 编排,漏洞修复和混合云控制。
2.6.5. opentracing
分布式跟踪(也称为分布式请求跟踪)是一种用于分析和监视应用程序的方法,尤其是那些使用微服务架构构建的应用程序。
分布式跟踪有助于查明故障发生的位置以及导致性能低下的原因。
2.7. 服务注册/发现
- DNS
- Kubernets
- Consul
- Eureka
2.7.1. Consul
Consul 是一种分布式,高可用性和数据中心感知解决方案,用于跨动态分布式基础架构连接和配置应用程序。 Consul 是一种服务发现和配置工具。Consul 具有分布式,高可用性和极高的可扩展性。 Consul 提供了几个关键功能:
- 服务发现 - 使用简单的服务来注册自己并通过 DNS 或 HTTP 接口发现其他服务。也可以注册 SaaS 提供商等外部服务。
- 运行状况检查 - 运行状况检查使 Consul 能够快速向运营商发出有关群集中任何问题的警报 与服务发现的集成可防止将流量路由到不健康的主机,并启用服务级别的断路器。
- 密钥/值存储 - 灵活的密钥/值存储可以存储动态配置,功能标记,协调,领导者选举等。简单的 HTTP API 使其易于在任何地方使用。
- 多数据中心 - Consul 可以识别数据中心,并且可以支持任意数量的区域而无需复杂的配置。
- 服务分段 - Consul Connect 通过自动 TLS 加密和基于身份的授权实现安全的服务到服务通信。
3. Envoy + Istio
ESB 架构:一个 ESB 是一个预先组装的 SOA 实现,它包含了实现 SOA 分层目标所必需的基础功能部件 (所有流量打一组)
ESP 架构:(服务网格,流量被分摊到每个 Server)
Istio 解决了开发人员和运维在单体应用程序向分布式微服务架构过渡时所面临的挑战。
3.1. 服务网格(Service Mesh)
术语服务网格用于描述构成应用程序的微服务网络以及它们之间的交互。
随着服务网格的大小和复杂性的增加,理解和管理服务变得更加困难,其要求可包括服务发现
,负载平衡
,故障恢复
,指标收集和监控
,以及通常更加复杂的运维需求。
服务网格通常还具有更复杂的操作要求,如A/B测试
,金丝雀部署
,流量限制
,访问控制
和端到端身份验证
。
Istio 提供了一个完整的解决方案,通过为整个服务网格提供行为洞察和操作控制来满足微服务应用程序的多样化需求。
3.2. Envoy (边车模式/pod)
Envoy 是一个开源边缘和服务代理,专为云原生应用程序而设计。
想要让服务支持 Istio,只需要在您的环境中部署一个特殊的sidecar代理
,使用 Istio 控制平面功能配置和管理代理,拦截微服务之间的所有网络通信:
基于 AOP 设计思想(面向切面编程),其相关特性:
- 低耦合:Envoy 是一款独立的高性能服务器,内存占用少。它与任何应用程序语言或框架一起运行。
- HTTP2 和 GRPC 支持:Envoy 为传入和传出连接提供 HTTP/2 和 gRPC 的一流支持。它是一个透明的 HTTP/1.1 到 HTTP/2 代理。
- 高级负载平衡:Envoy 支持高级负载均衡功能,包括自动重试,断路,全局速率限制,请求阴影,区域本地负载平衡等。
- 提供强大的 API:Envoy 提供强大的 API,用于动态管理其配置。
- 可观测性:在 L7 层流量的深度可观察性,分布式跟踪的本机支持以及 MongoDB,DynamoDB 等的线级可观察性。
3.3. Istio
一个连接,管理和保护微服务的开放平台,Istio 是一个开放平台,用于提供统一的方式来集成微服务,管理跨微服务的流量,实施策略和聚合遥测数据。
Istio 的控制平面在底层集群管理平台上提供了一个抽象层,例如 Kubernetes
Istio 的核心功能:
流量控制:
- 通过简单的规则配置和流量路由,可以控制服务之间的流量和 API 调用。Istio 简化了
断路器
、超时
和重试
等服务级别属性的配置,并且可以轻松设置A/B测试
、金丝雀部署
和基于百分比的流量分割的分阶段部署
等重要任务。 - 开箱即用的故障恢复功能
- 通过简单的规则配置和流量路由,可以控制服务之间的流量和 API 调用。Istio 简化了
安全:
- 使开发人员可以专注于应用程序级别的安全性,Istio 提供底层安全通信信道,并大规模管理服务通信的认证、授权和加密。
- 虽然 Istio 与平台无关,但将其与 Kubernetes(或基础架构)网络策略结合使用,其优势会更大,包括在网络和应用层保护 pod 间或服务间通信的能力
3.4. Istio 架构
- Envoy:每个微服务的 Sidecar 代理,用于处理集群中服务之间以及从服务到外部服务之间的入口/出口流量。代理形成一个安全的微服务网格,提供丰富的功能,如发现,丰富的第 7 层路由,断路器,策略实施和遥测记录/报告功能。
- Mixer:代理和微服务利用的中央组件,用于执行授权,速率限制,配额,身份验证,请求跟踪和遥测收集等策略。
- Pilot:运行时配置代理的组件
- Citadel、Citadel Agent:安全堡垒,基于服务标识进行 ACL、TLS
- Galley:用于在 Istio 中验证,摄取,聚合,转换和分发配置的核心组件。
控制面板,特性支持:
- IPC
- 路由规则
- Retries
- 熔断
- 性能检测
- 链路跟踪
3.5. 词条
- TOS:服务条款 (也称为使用条款和条款和条件,通常缩写为 TOS 或 ToS,ToU 或 T&C)是必须遵守以便使用服务的规则
3.5.1. 解决技术
- Envoy:ENVOY 是一个开源边缘和服务代理,专为云原生应用程序而设计
- Istio:
- 一个连接,管理和保护微服务的开放平台,Istio 是一个开放平台,用于提供统一的方式来集成微服务,管理跨微服务的流量,实施策略和聚合遥测数据。
Istio 的控制平面在底层集群管理平台上提供了一个抽象层,例如 Kubernetes。 组成:
- Envoy:每个微服务的 Sidecar 代理,用于处理集群中服务之间以及从服务到外部服务之间的入口/出口流量。代理形成一个安全的微服务网格,提供丰富的功能,如发现,丰富的第 7 层路由,断路器,策略实施和遥测记录/报告功能。
- Mixer:代理和微服务利用的中央组件,用于执行授权,速率限制,配额,身份验证,请求跟踪和遥测收集等策略。
- Pilot:运行时配置代理的组件
- 证书: Citadel、Citadel Agent:
- Galley:用于在 Istio 中验证,摄取,聚合,转换和分发配置的核心组件。
3.5.2. 为什么要使用 Istio
Istio 目前支持基于 Kubernetes 和 Consul 的环境
- HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
- 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制。
- 可插入的策略层和配置 API,支持访问控制、速率限制和配额。
- 对出入集群入口和出口中所有流量的自动度量指标、日志记录和追踪。
- 通过强大的基于身份的验证和授权,在集群中实现安全的服务间通信。
3.6. 消息队列组件
- nats
- rabbitmq
- kafka
- nsq https://medium.com/@philipfeng/modern-open-source-messaging-apache-kafka-rabbitmq-nats-pulsar-and-nsq-ca3bf7422db5
4. Go 单体应用与微服务
4.1. 技术解决方案和资讯
- https://martinfowler.com/articles/microservices.html
- ServerMersh 系列:
- 基于 Kubernetes 的微服务可观测性与 Istio 服务网格 1:https://programmaticponderings.com/2019/03/10/kubernetes-based-microservice-observability-with-istio-service-mesh-part-1/
- 基于 Kubernetes 的微服务可观测性与 Istio 服务网格 2:https://programmaticponderings.com/2019/03/21/kubernetes-based-microservice-observability-with-istio-service-mesh-part-2/
- 使用 Go,gRPC 和基于协议缓冲区的微服务实现 Istio 可观察性:https://programmaticponderings.com/2019/04/17/istio-observability-with-go-grpc-and-protocol-buffers-based-microservices/
4.2. Go Web 框架
https://github.com/mingrammer/go-web-framework-stars
- https://github.com/kataras/iris
- https://github.com/go-chi/chi (轻量级,惯用和可组合的路由器,用于构建 Go HTTP 服务:)
- gin
- echo
- Beego
- go-restful
4.3. 最佳实践 Collect
4.3.1. 微服务 DevOps
- 服务发现
- Consul:Consul 是用于服务发现和配置的工具。 Consul 是分布式的,高度可用的,并且具有极高的可伸缩性。
4.3.2. Segment
- GRPC
- 标准:https://cloud.google.com/apis/design/
- uber/prototool
- lyft/protoc-gen-validate
- grpc-gateway(REST Mapping 映射)
- PB(uber/prototool)
- Envoy
- 前端代理
- rate-limits and authenticates every request
- transcodes a #REST/#JSON request to an upstream GRPC request
- 可视化、安全、可信赖
- GRPC servers
- running an Envoy sidecar
- Datadog(stats)
- Swagger service definitions
- 过于奢望
4.3.3. 存储系统
- Etcd:
- 是分布式键值存储,它提供了一种可靠的方式来跨机器集群存储数据。
- 自动选举
- Redis
4.3.4. 数据库管理系统
- Mysql
- Postgresql
4.3.5. 搜索系统
- ES
4.3.6. 监控
- 应用监控:ELK
- 资源监控:Grafana+Prometheus
- APM 分析:
- Newrelic
- Jmetre
- 日志收集:DataDog
4.3.7. GO 应用开发
- 通信协议
- PB
- 配置
- Yaml
- 日志
- 路由
- http.ServeMuxin
- HttpTreeMux
- HttpRouter
- Gorilla Mux