腾讯亿级用户规模自研业务的上云实践解读,立即报名 了解详情
写点什么

从单体到微服务:使用服务网格迁移 Snap 的架构

  • 2020-05-07
  • 本文字数:1462 字

    阅读完需:约 5 分钟

从单体到微服务:使用服务网格迁移Snap的架构

经过两年的架构演进,Snap 从单体迁移到了云托管的微服务,这使得计算成本降低了 65%,同时减少了冗余并提升了客户的可靠性,所有的这些迁移都满足了安全性和隐私合规性的需求。


面向服务架构为工程师提供了可扩展性和所有权。开源的边缘(edge)代理Envoy是核心的构建块,能够为服务间通信创建一致的层。内部的 Web 应用 Switchboard 构成了 Snap服务网格的控制平面,它为服务的所有者提供了一个地方来管理他们的服务依赖。


在过去的两年间,云基础设施不断演化,Snap 已经从Google App Engine中的单体应用转变成了Kubernetes中的微服务,其中 Kubernetes 可以跨 Amazon Web Services 和 Google Cloud。


从零开始实现基于微服务的系统时,会面临一些挑战,包括对现有底层基础设施的考虑,如网络拓扑、认证、云资源供应、部署、日志和监控、流量路由、限速以及 staging 与生产环境。


正如Snap的工程博客中所描述的,为了找到一个可行的方案,他们也考虑了 Snapchatters 当前的经验。文中也指出,他们没有一个专门的团队,因此没有时间实现这项计划。


Snap 没有从头开始,而是决定使用开源的边缘代理服务 Envoy,实现其服务网格设计模式。


Envoy 提供了很多特性,比如支持 gRPC 和 HTTP/2、客户端负载均衡、可插拔的过滤器、借助一组动态管理API(如xDS)所实现的数据平面和控制平面的清晰分离。随着 AWS 和 Google Cloud 都提供了可用的 Envoy,于是 Envoy 就成为了 Snap 中服务与服务间的通信层。在 Snap,每个 Envoy 代理都连接一个自定义的控制平面,通过 xDS API 接收服务发现和详细的流量管理配置。


在使用服务网格的过程中,很重要的一点就是解决 Envoy 中关于移动客户端通信的问题。除此之外,当在 AWS 和 Google Cloud 上同时运行时,工程师要站在安全的角度管理他们的 Envoy 配置。


由此,形成了 Snap 服务网格。Snap 有一个名为 Switchboard 的内部 Web 应用,它担任 Snap 服务唯一的控制平面,这样服务的所有者就可以管理他们的服务依赖了。


Switchboard 配置的核心是它的服务。每个服务都有一个协议和基本的元数据,如所有者、email 列表和描述。这些服务所组成的集群可以位于任意的云供应商、可用区或环境中。Switchboard 服务有它们的依赖和消费者,也就是其他的 Switchboard 服务。如果 Snap 当时把整个系统的 API 接口全部暴露给工程团队的话,那么将会有大量配置,从而导致管理上的困难。


Switchboard 的配置变更是存储在 DynamoDB 中的。服务网格上的 Envoy 代理通过一个双向的 gRPC 流连接至 xDS 控制平面。当某个服务的 Envoy 配置生成时,控制平面会发送更新后的配置给一小部分 Envoy 代理,并且在测定它们的健康状况之后,才将变更提交至整个网格。


与此同时,服务的所有者可以直接通过 Switchboard 供应和管理 Kubernetes 集群,还可以通过金丝雀发布、健康检查端点和分区滚动更新生成 spinnaker 管道。


为了将暴露给互联网的服务数量降至最低,Snap 为其微服务设计了一个共享的、内部的、分区的网络。将会有一个 API 网关暴露到互联网上,这样的话,没有外部流量可以直接与内部网络进行通信。


这个 API 网关上运行的 Envoy 镜像和微服务上运行的 Envoy 镜像是一样的,连接到相同的控制面板。除此之外,还有自定义的 Envoy 过滤器,用来处理 Snapchat 的认证模式以及限速和负载 shedding 功能。


统一的 Snap 服务网格架构图如下所示:



Snap 的服务网格目前运行在 AWS 和 Google Cloud 的七个可用区上,网格上有 300 多个生产环境的服务。


原文链接:


Monolith to Microservices: Migrating Snap’s Architecture Using a Service Mesh


2020-05-07 10:241998

评论

发布
暂无评论
发现更多内容

🏆 【JVM 性能调优】「对象内存分配」输出常用参数

洛神灬殇

JVM 7月日更

凭借这5步,我30分钟学会了Python爬虫!

Jackpop

爬虫 爬虫教程

Rust从0到1-智能指针-Drop trait

rust smart pointer drop trait

Linux之find exec

入门小站

Linux

就在今天,浪潮云说第二期来啦

浪潮云

云计算

测试开发之网络篇-常用命令

禅道项目管理

Linux 命令行

pha分币APP系统开发资料

腾讯一面 Java Phaser 并发编程的理解与应用

陈皮的JavaLib

Java 面试 多线程

见康乘拼团软件开发|见康乘拼团系统APP开发

领域驱动设计101 - 聚合

luojiahu

领域驱动设计 DDD

Python利器!Jupyter最大威胁终于来了

Jackpop

Python Jupyter Notebook

深入理解搜索引擎——初识query理解

药老算法

搜索引擎 中文分词 query理解 query纠错 query分析

十二张图,一脚踹开消息队列的大门

三分恶

消息队列

Vue3 + TypeScript 开发实践总结

程序员海军

typescript 大前端 Vue3 框架

与微软、IBM同台 斯图飞腾Stratifyd入选G2文本分析Grid报告

Redisson 分布式锁源码 07:公平锁释放

程序员小航

Java redis 源码 分布式锁 redisson

如何看待技术采用生命周期 | 【话题讨论】

耳东@Erdong

云原生 话题讨论 7月日更

在线base64加密解密工具

入门小站

工具

图的应用——关键路径

若尘

数据结构

pha挖矿/phala挖矿APP系统开发内容

架构实战营模块8 课后作业

En wei

架构实战营

【LeetCode】主要元素Java题解

Albert

算法 LeetCode 7月日更

Fil和BTC有什么区别?Filecoin挖矿的行情如何?

IPFS BTC fil fil币

原来这就是Java IO啊····

华为云开发者联盟

Java 操作系统 进程 IO流 Java IO

如何对开发团队的人员进行绩效管理?

万事ONES

研发效能 ONES 绩效管理

React 18探秘(上)

Teobler

大前端 React

IntelliJ IDEA必备7款Python插件

Jackpop

IDEA pycharm

日更很费脑子啊

IT蜗壳-Tango

7月日更

Spring到底应该学哪些内容?

冰河

spring aop ioc 注解驱动 依赖反转

【Flutter 专题】92 图解 Dart 单线程实现异步处理之 Isolate (一)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

毕业季offer怎么拿?收下这份非典型求职面试指南

华为云开发者联盟

面试 职业规划 求职 毕业季 大学生

从单体到微服务:使用服务网格迁移Snap的架构_架构_A Kulkrani_InfoQ精选文章