Go实现Microserver最佳实践寻求

有关基于GO构建微服务的相关技术栈 - 技术收集

1. 理论方面

1.1. 耗子大叔

  • 分布式架构冰与火
    • 原因:增大系统容量与提升系统可用性
    • 复杂:功能开发、部署、隔离、架构设计、性能和吞吐、运维、上手、技术、测试和排错、扩容、维护管理
  • AWS分布式
    • 难点
      • 分布式团队架构
      • 查错
      • 吃自己狗粮
      • 运维优先,简单和自动化
      • 内外部服务一致(内部服务也有对外服务能力)
    • 问题
      • 异构系统标准问题(通讯协议、配置三层、状态码)
      • 服务依赖(服务拆分、数据库拆分)
      • 故障概率增大(运维困难)
      • 基础层、平台层、应用层、接入层(网关)
  • 技术栈
    • 两件事:提高整体系统吞吐,服务更高流量;提高系统稳定性,让系统的可用性更高
      • 提高架构性能:加缓存(缓存系统)、负载均衡(网关)、异步调用(异步系统)、数据镜像(数据一致性问题)和数据分区(依赖数据路由,存在数据Join问题)
      • 提高架构稳定:服务拆分(故障隔离、模块复用,但带来服务依赖)、服务冗余(去单点、弹性伸缩)、限流降级(保护)、高可用架构、高可用运维(CI/CD)
    • 解决方式:
      • 服务治理:服务拆分、调用、发现、依赖、关键度定义,解决服务间链关系
      • 架构软件管理:服务编排、聚合、事务、版本、生命周期管理
      • DevOps
      • 自动化运维
      • 资源调度
      • 整体监控
      • 流量控制(负载君合、服务路由、熔断、降级、限流)
      • Docker+K8S
    • 纲(五个关键点):
      • 流量调度
      • 服务/资源调度
      • 数据/状态调度
      • 应用整体监控监控
      • 开发和运维自动化
  • 监控系统(Zipkin、Google Dapper系统)
    • 功能:全栈监控(基础层、中间层、应用层)、关联分析、跨系统调用的串联、报警和自动处置、系统可用性分析
    • 标准化:日志结构、格式、分析、统一平台
    • 坏与好:监控数据隔离、监控数据项太多; 整体SLA、指标聚合、快速定位(无侵入的trace跟踪)
  • 服务治理
    • 功能:服务关键程度、依赖关系、服务发现、整体架构版本管理、应用生命周期全管理
    • 整体版本管理:manifest、VersionSet
    • 服务与资源调度:状态的维持和拟合、弹性伸缩和故障迁移、作业和应用调度、作业工作流编排、服务编排
    • 服务拟合(K8S调度控制系统)
    • 弹性伸缩
    • 故障转移:宠物模式(救活)、奶牛模式(新生)

1.2. 微服务理论相关

1.3. 监控度量可视化

2. VM管理模式

2.1. 技术栈

2.1.1. 问题

  • 多技术栈
  • 多框架
  • 多语言
  • 遗留系统

2.1.2. 统一技术栈

基于k8s+istio,集合golang生态输出

2.1.3. IPC通信协议

  • SOAP
  • XML
  • JSON over HTTP
  • GRPC

2.1.4. 微服务/服务网格基础架构部分

  • 流量调度的负载均衡
  • 服务注册、服务发现
  • 容错处理
  • 服务检测 (Observability & Insight)
  • 监控和跟踪 (Monitoring & Tracing)
  • 服务熔断 (Circuit Breaking)

2.2. Java 微服务开源工具组件(Netflix,OSS)

  1. Eureka:服务注册 / Consul (golang)
  2. Ribbon: Client Side LB
  3. Hystrix: Circuit Breaker
  4. Zipin: 分布式链路跟踪 / jaeger (golang) / opentracing
  5. Prometheus: 监控 (golang)
  6. 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设计思想(面向切面编程),其相关特性:

  1. 低耦合:Envoy是一款独立的高性能服务器,内存占用少。它与任何应用程序语言或框架一起运行。
  2. HTTP2和GRPC支持:Envoy为传入和传出连接提供HTTP/2和gRPC的一流支持。它是一个透明的HTTP/1.1到HTTP/2代理。
  3. 高级负载平衡:Envoy支持高级负载均衡功能,包括自动重试,断路,全局速率限制,请求阴影,区域本地负载平衡等。
  4. 提供强大的API:Envoy提供强大的API,用于动态管理其配置。
  5. 可观测性:在L7层流量的深度可观察性,分布式跟踪的本机支持以及MongoDB,DynamoDB等的线级可观察性。

3.3. Istio

一个连接,管理和保护微服务的开放平台,Istio是一个开放平台,用于提供统一的方式来集成微服务,管理跨微服务的流量,实施策略和聚合遥测数据。

Istio的控制平面在底层集群管理平台上提供了一个抽象层,例如Kubernetes

Istio的核心功能:

  • 流量控制:
    • 通过简单的规则配置和流量路由,可以控制服务之间的流量和API调用。Istio 简化了断路器超时重试等服务级别属性的配置,并且可以轻松设置A/B测试金丝雀部署基于百分比的流量分割的分阶段部署等重要任务。
    • 开箱即用的故障恢复功能
  • 安全:
    • 使开发人员可以专注于应用程序级别的安全性,Istio提供底层安全通信信道,并大规模管理服务通信的认证、授权和加密。
    • 虽然 Istio 与平台无关,但将其与 Kubernetes(或基础架构)网络策略结合使用,其优势会更大,包括在网络和应用层保护 pod 间或服务间通信的能力
  • 可观察性: +

3.3.1. Istio架构

  • Envoy:每个微服务的Sidecar代理,用于处理集群中服务之间以及从服务到外部服务之间的入口/出口流量。代理形成一个安全的微服务网格,提供丰富的功能,如发现,丰富的第7层路由,断路器,策略实施和遥测记录/报告功能。
  • Mixer:代理和微服务利用的中央组件,用于执行授权,速率限制,配额,身份验证,请求跟踪和遥测收集等策略。
  • Pilot:运行时配置代理的组件
  • Citadel、Citadel Agent:安全堡垒,基于服务标识进行ACL、TLS
  • Galley:用于在Istio中验证,摄取,聚合,转换和分发配置的核心组件。

控制面板,特性支持:

  • IPC
  • 路由规则
  • Retries
  • 熔断
  • 性能检测
  • 链路跟踪

3.4. 词条

  • TOS:服务条款 (也称为使用条款和条款和条件,通常缩写为TOS或ToS,ToU或T&C)是必须遵守以便使用服务的规则

3.4.1. 解决技术

  • Envoy:ENVOY是一个开源边缘和服务代理,专为云原生应用程序而设计
  • Istio:
  • 一个连接,管理和保护微服务的开放平台,Istio是一个开放平台,用于提供统一的方式来集成微服务,管理跨微服务的流量,实施策略和聚合遥测数据。 Istio的控制平面在底层集群管理平台上提供了一个抽象层,例如Kubernetes。 组成:
    • Envoy:每个微服务的Sidecar代理,用于处理集群中服务之间以及从服务到外部服务之间的入口/出口流量。代理形成一个安全的微服务网格,提供丰富的功能,如发现,丰富的第7层路由,断路器,策略实施和遥测记录/报告功能。
    • Mixer:代理和微服务利用的中央组件,用于执行授权,速率限制,配额,身份验证,请求跟踪和遥测收集等策略。
    • Pilot:运行时配置代理的组件
    • 证书: Citadel、Citadel Agent:
    • Galley:用于在Istio中验证,摄取,聚合,转换和分发配置的核心组件。

3.4.2. 为什么要使用 Istio

Istio目前支持基于Kubernetes和Consul的环境

  • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡。
  • 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制。
  • 可插入的策略层和配置 API,支持访问控制、速率限制和配额。
  • 对出入集群入口和出口中所有流量的自动度量指标、日志记录和追踪。
  • 通过强大的基于身份的验证和授权,在集群中实现安全的服务间通信。

3.5. 消息队列组件

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

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应用开发