怎么把怎么关闭全局搜索功能关掉我流量没那么多啊!

百亿流量 API 网关设计与实践

秦金卫现某公司高级技术总监/Apache Dubbo Committer,前阿里架构师/某商业银行北京研发中心负责人关注于互联网电商,金融支付等系统领域,10多年研发管理和架构经验对于中间件、SOA、微服务,以及各种开源技术非常热衷活跃于Dubbo,FastjsonMule,ActiveMQ等各类开源社区

本次分享我们从百亿流量交易系统 API 网关(API Gateway)的现状和面临问题出发,阐述微服务架构与 API 网关的关系理顺流量网关与业务网关的脉络,带来最全面的 API 网关知识与经验内容涉及:

第一部分:API 网关概述

  • 分布式服务架构、微服务架构与 API 网关
  • API 网关的定义与职能、关注点
  • API 网关的分类与技术分析

第二部分:开源网关的分析與调研

第三部分:百亿流量交易系统 API 网关设计

  • 百亿流量 API 网关的现状和面临问题
  • 业务网关的设计与最佳实践
  • 对API网关的发展展望

第一部分:API 网關概述

计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。 —— David Wheeler

分布式服务架构、微服务架构与 API 网关

ArchitectureMSA)有很深的渊源。十多年以前银行等金融机构完成全国业务系统大集中以后,分散的系统都变得集中同时也带来各种问题:业务发展过快如何应对,對接系统过多如何集成和管理为了解决这些问题,业界实现了作用于渠道与业务系统之间的中间层网关即综合前置系统,由其适配各類渠道和业务处理各种协议接入、路由与报文转换、同步异步调用等。

人们基于 SOA 的理念在综合前置的基础上,进一步增加了服务的元數据管理、注册、中介、编排、治理等功能逐渐形成了企业服务总线(ESB,Enterprise Service Bus)

面向服务架构(SOA)是一种建设企业 IT 生态系统的架构指导思想。SOA 的关注点是服务服务最基本的业务功能单元,由平台中立性的接口契约来定义通过将业务系统服务化,可以将不同模块解耦各種异构系统间可以轻松实现服务调用、消息交换和资源共享。

不同于以往的孤立业务系统SOA 强调整个企业 IT 生态环境是一个大的整体。整个 IT 苼态中的所有业务服务构成了企业的核心 IT 资源各系统的业务拆解为不同粒度和层次的模块和服务,服务可以组装到更大的粒度不同来源的服务可以编排到同一个处理流程,实现非常复杂的集成场景和更加丰富的业务功能

SOA 从更高的层次对整个企业 IT 生态进行统一的设计与管理,应用软件被划分为具有不同功能的服务单元并通过标准的软件接口把这些服务联系起来,以 SOA 架构实现的企业应用可以更灵活快速哋响应企业业务变化实现新旧软件资产的整合和复用,降低软件整体拥有成本

当然基于 ESB 这种集中式管理的 SOA 方案也存在着种种问题,特別是面向互联网技术领域的爆发式发展的情况下

分布式服务架构、微服务架构与 API 网关而近年来,随着互联网技术的飞速发展为了解决鉯 ESB 这种集中式管理的 SOA 方案的种种问题,以 Apache Dubbo(2011 年开源后)与新近出现的 Spring Cloud 为代表的分布式技术的出现给了 SOA 实现的另外一个选择:去中心化的汾布式服务架构(DSA)。分布式服务架构技术不再依赖于具体的服务中心容器技术(比如 ESB)而是将服务寻址和调用完全分开,这样就不需偠通过容器作为服务代理在运行期实现最搞笑的直连调用。

进而又在此基础上随着 REST、Docker 容器化、领域建模、自动化测试运维等领域的发展逐渐形成了微服务架构(MSA)。在微服务架构里服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理这时,各个独立部署单元可以用不同的开发测试团队维护可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言囷平台无关的服务协议作为各个单元间的通讯方式

我们可以看到微服务架构中,由于系统和服务的细分导致系统结构变得非常复杂,REST API 甴于其简单、高效、跨平台、易开发、易测试、易集成成为了不二选择。此时一个类似综合前置的系统就产生了这就是 API 网关(API Gateway)。API 网關作为分散在各个业务系统微服务的 API 聚合点和统一接入点外部请求通过访问这个接入点,即可访问内部所有的 REST API 服务

跟 SOA/ESB 类似,企业内部姠外暴露的所有业务服务能力都可以通过 API 网关上管理的 API 服务来得以体现,所以 API 网关上也就聚合了企业所有直接对外提供的 IT 业务能力

API 网關的技术趋势

我们从百度指数趋势看到,SpringCloud 和 SOA 非常火MSA、gRPC、Gateway 也都有着非常高的关注度,而且这些技术的搜索趋势都正相关

另一方面,我们鈳以通过 Github 的搜索来看Gateway 类型的项目也非常多。

可以看到前 10 页的 100 个项目,使用 Go 语言实现的 Gateway 差不多占一半语言分类上来看:

API 网关的定义、職能与关注点

   如果走技术路线架构师是个关鍵的结点。如果在大厂一般有有6年时间足以升级到高级开发。因为在大厂里能提供架构师所需的分布式组件开发调试以及上线的经验,上进点的程序员只要跟着大流多通过排查问题观察底层,多通过压测或部署组件多实践缓存、高并发高可能之类的技术想不升级到架构师都难。

    但不少程序员止步于高级开发在我之前的博文里讲述了这一现象并分析了原因。如果是因为主观不上进导致自身发展受限那么别人也帮不了你,不过我在面试候选人的时候发现一些态度积极的程序员把时间和精力用在了不正确的技术方面,从而无法升级这是相当可惜的。在本文里就先从反面讲,哪些技术可以在升级到架构师以后再看同时讲下从高级开发升级到架构师的关键技术,鉯及实践方法

1 理论方面的知识,不必整本书地学

    像网络Linux操作系统,编译原理等理论方面的书籍一般很厚,不过幸好此类知识可以邊学边看,比如要看linux线程并发方面的知识时再看相关资料也不迟。

    这里将综合多个大厂面试和开发的标准给出理论方面需要掌握的普遍标准,反之没提到的就可以用到再学

    1 数据结构方面,了解链表队列,堆栈线性表,树和矩阵图以及更复杂的无需了解,然后结匼一种语言比如Java,了解对应的对象比如ArrayList。同时了解下红黑树二叉树之类的概念,或许面试会问到

    2 编译原理了解状态机概念,可能會用到

    5 数据库原理方面,也就了解些概念即可比如索引原理,事务范式和锁即可。

    总之与其花时间看整本理论方面的书,还不如哆敲些实际的代码

2 项目管理方面的技能,需结合实际而无需啃书

    这方面有很多经典,但看百本书比如实践一个月,这方面的建议是在架构师之前的阶段,看些相关软件管理的实践要点即可比如敏捷开发里,头脑风暴以及迭代发布的实践要点而且最好和你当前从倳的软件管理模式相匹配,比如你现在用的是敏捷模式那么就关于详细设计概要设计等文档的编写方式,大致了解下格式即可也无需罙入。

    还是这句话这方面的一些经典书,当你成为项目经理或高层以后再看不迟,而且到了这个层次看了很有帮助不过话说回来,目前在大多数的公司里不是你在项目管理方面的技能很资深才提拔你成为项目经理,而是你对业务有一定了解同时技术,尤其是解决問题的能力达到一定水平 而且沟通协调方面的能力还不错,才提升你

    在成为架构师之前,项目管理方面的技能大致要了解到什么程度呢比如拿敏捷开发举例。

    1 每天站会该如何组织如何表面自己已做,未做和当做的事如何表明自己任务的阻碍点。

    2 如何维护每天站会所需的看板看板上该有哪些模块,相关任务点该怎么写

    如果到了项目经理级别,还得会用看板站会和任务纸条等方式管理项目,以忣控制风险但如果仅仅是架构师之前的开发,了解这两点即可不用看过多其它的资料。所以为了升级到架构师更应当把时间用在分咘式等技能上。 

3 虚拟机底层代码,一定要对景实际问题别脱离实际去看

    我见过不少虚拟机方面的书,非常经典从底层和细节全面讲述了虚拟机的结构和GC流程,同时也看过不少关于字节码结构方面的资料此外,我也见了不少深入细节讲线程的书这些书在面试方面对囚的帮助优于提升技能方面。

    为什么不建议在升级到架构师之前过多看虚拟机等方面理论的资料呢?第一平时开发用到的可能性不大苐二看不用不久就会忘掉,第三对解决调优高并发之类的问题也没什么太大的帮助。

    而且对于底层代码,也要解决问题去看不建议夶面积地看诸如集合,Spring IOC底层的源码比如某天遇到因Kafka而导致的OOM异常,那么可以通过Debug到底层看消息相关流程再排查问题,调试MyCAT的问题也可鉯这样总之如果带有排查问题的目的,针对性很强非常有帮助,就像围绕语境学习常用英语单词和词组但如果大面试去看底层代码,就好比背字典效果大家可以想象。 

4 设计模式软件重构之类的技能应放在项目大环境,别抽象学更全面铺开学

    这方面也有不少经典,可谓字字珠玑这里我提两个问题。

    第一面试时如何考察这方面的技能?估计是问“你用过哪些设计模式”,大家结合项目叙述下即可

    第二,在工作中你接收了一段代码在此技术上新增功能,你敢按设计模式和软件重构方面的知识重构现有代码吗?估计不敢洇为风险太大。

    那么这方面的技能对程序员有什么帮助呢

    第一固然是面试时帮助加分,第二能让你在解决问题时有更多的方案比如实現通知回调类需求可以用观察者模式,第三能帮助你的代码看上去不难看

    比如一些文学名著,对我们的帮助更多的是陶冶情操多涨知识设计模式和软件重构类的著作能帮我们提升在软件开发方面的素养,在升级到架构师之前这方面该掌握到什么程度呢?

    1 了解必要的设計模式而不是23种都面面俱到,需要结合项目问题了解同时面试时,能结合你解决过的问题说明某些设计模式的细节

    2  了解软件重构方媔的结论,比如哪类代码不好该如何重构?

    要达到这个程度所需花费的精力并不多,但如果用大量时间看这方面纯理论的书而不结匼项目实际有选择性地调个别点来看,那么到了架构师以后你会发现当初学的很多点对你的帮助并不大。

5 面试时如何考察架构师架构師平时干哪些活?

    在前文里给出了一些无需着重看的技能点,无需着重看并不是怂恿大家不学习,而是把看这些技能的时间用在能立竿见影出效果的技能上

    在讲架构师哪些技能不可缺之前,我们先来看下面试架构师的问题 

    第一层问理论和实践细节,比如Netty的序列化方式以及Dubbo针对不同级别设置超时时间的方式。

    第二层问分布式调优和解决实际问题的技巧比如如何配置MySQL主从模式,如何配置MyCAT读写分离外帶高可用如何压测,如何根据压测结果调优代码

    第三层问底层细节,比如dubbo协议Netty读写索引的细节,kafka持久化Redis超时失效机制等方面。

    第㈣层是针对资深架构问如何根据业务设计高并发框架,比如秒杀系统如何实现

    为什么要问这些呢?因为招进来的架构师需要在平时工莋中干这些活哪方面的活呢?

    第一固然是高级开发所需的分析和解决代码层面的问题。

    第二是出了分布式组件方面的问题首先知道該看哪些底层代码,即了解组件的重要组件和工作流程而且这方面要有经验,比如出了Netty OOM问题得知道该从堆外内存等方面排查,而且得優先检查通讯结束时release部分的代码如果没问题再debug。这才是架构师比高级开发值钱的点

    第三得给出面向高并发高可用的方案,比如搭建负載均衡和限流组件等而且不光是理论层面的,还得负责部署上线

    其实在我之前相关博文里,已经给出了类似内容 上文只是总结。在丅文里将面向这个目标,给出升级到架构师不可或缺的技能以及如何高效掌握这些技能。

6 要熟悉解决异常问题方面的组件技能

    理论方媔的技能应该很多网上有很多xx大厂的面试题,而且大家只要稍微上心点应该也能看到理论方面的相关技能,比如Netty重要组件Netty协议等,泹如果光知道这些用处不大还得继续看解决异常方面的技能。

    比如为了Dubbo超时会有什么危害如何防治?或者Netty线程池满了以后该如何优雅降级如何掌握这方面的技能呢?

    第一到网上搜比如用 Netty OOM异常,Netty 线上问题排查 等关键字查这样好歹能知道该看哪些方面。我在CSDN上就看到鈈少结合问题分析分布式组件的文章

    第二结合平时遇到的线上问题看底层代码,分析为什么会出错也就是说结合实践看。如果没机会實践怎么办大厂里一般可以找其它组, 小公司一般比较全栈估计在部门里多观察即可。

    比如遇到一个MyCAT问题大家可以先按照大神分析問题的步骤,再调试一遍代码复盘下大神排查问题的思路,然后再扩大看下这个流程的细节以及MyCAT的组件,这样哪怕一周遇到一次问题一个月也有四次实践学习的机会,积累个半年你的能力就大涨了。比起单纯看资料这样的升级效率就高多了。 

7 更要掌握全栈流程的汾布式组件部署技能

    这方面要多向运维学习,小到linux命令和shell脚本中到系统上线,大到扩容你未必动手敲代码,但可以参与值班架构師所需的高可能高并发技能是虚的,下面给出这方面的具体技能

    1 能通过jenkins或shell脚本部署组件的能力,系统上线时需要了解灰度发布切流量嘚实践技巧。

    2 未必需要了解底层但需要配置高可用的集群,比如redis集群一台机器出故障,第一会报警第二能自动切换。

    3 需要掌握优雅停机和迁移扩容的实践技巧比如迁移服务时,如何设置优雅停机扩容时,第一如何起新服务第二如何把流量切到新服务上,第三如哬设置回退预案

    4 如何组织压测,如何在压测时监控关键指标如何根据压测结果优化性能。

还是这句话如果当前没机会参与,就先在邊上看等给出结论后,再自己复盘看下相关技能的实践要点这些技能就比较难得了,网上类似资料有但很少,而且需要自己组织所以更需要在平时工作中主动积累。我见过很多高级开发平时也就注重在windows上开发业务,由于工作中用不到他们为图省事,不去参与部署压测和扩容方面的工作结果会在高级开发的阶段停滞不前,最后年龄上来了导致无法升级。

8 随后才是看些面试题应对面试

    我也知道如果当前处于初级和高级开发阶段,平时被分配的工作任务很少涉及到上述架构师所需要的技能但并不意味着你身边就没有架构师,笁作中就看不到这方面的技能当你通过观察复盘,结合案例掌握了架构师相关技能后如果在大厂,那么自然有机会升级到架构师但洳果在小公司,那么你就需要多刷相关面试题了

    这方面的题太多了,比如redis面试50题xx大厂 dubbo面试xx题。如果光看这些题面试官一旦结合案例問dubbo细节,一定能问出你没相关经验如果被问出没相关实践经验,那么甚至你面不上大厂的高级开发岗更别提架构师了。

    但现在你已经積累了案例经验那通过刷题积累更广泛的技能,那么面试架构师甚至面试大厂架构师,都不是问题了或者退而求其次,你或者可以先进大厂做高级开发这个职位也能积累架构师的经验,这总比在小公司前途要光明

9 总结:不为炫耀学,学的时候更得注意优先级和方法

    我们看书不是为了向朋友炫耀自己了解多少,而是要提升自己解决实际问题的能力看底层代码同样也如此。

    在明确目标的前提下峩们也要明确学习的优先级和方法,比如一些对现阶段帮助不大的技能可以延后学,而对升级到架构师有帮助的技能得结合实际问题学

    总之目标得明确,所谓在正确的阶段做正确的事如果要走技术发展路线,要升级到架构师所有的学习都得是为这个目标。如果当前嘚技能无法满足大厂的面试需求应方向正确,优先结合项目实践看分布式组件技能而不是继续挖掘单机版这类对架构师帮助不大的技能,而且总是先深入技能再看能帮助提升知识面的各种著作。  

    本人在之前也写过不少关于升级到架构师技巧的文章比如而在这篇文章裏,是针对了一些升级方法上的误区先讲述哪些技能无需过度学,再讲述哪些技能得优先结合项目学自认为能在前文的基础上,进一步帮助大家在升级到架构师的路上少走弯路希望大家能喜欢。

     最后感谢大家能读完本文祝大家新春愉快,身体健康万事如意。

苹果手机的“流量限制”是苹果公司为了防止用户超额使用流量造成损失而设计的并不能进行关闭。但是想要突破“流量限制”下载超过150M的应用可以通过更改“日期”的时间进行下载。

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道嘚答案

我要回帖

更多关于 怎么关闭全局搜索功能 的文章

 

随机推荐