周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

34 | 路由凭什么作为微服务网关的基础职能?

你好,我是周志明。这节课我们要探讨的话题是微服务中的入口:网关。
网关(Gateway)这个词我们应该都很熟悉了,它在计算机科学中,尤其是计算机网络中十分常见,主要是用来表示位于内部区域边缘,与外界进行交互的某个物理或逻辑设备,比如你家里的路由器就属于家庭内网与互联网之间的网关。
在单体架构下,我们一般不太强调“网关”这个概念,因为给各个单体系统的副本分发流量的负载均衡器,实质上就承担着内部服务与外部调用之间的网关角色。
不过在微服务环境中,网关的存在感就极大地增强了,甚至成为微服务集群中必不可少的设施之一。
其中原因并不难理解。你可以想想看,在微服务架构下,每个服务节点都由不同的团队负责,它们有自己独立的、各不相同的能力,所以如果服务集群没有一个统一对外交互的代理人角色,那外部的服务消费者就必须知道所有微服务在集群中的精确坐标(上一讲我介绍过“坐标”的概念)。
这样,消费者不仅会受到服务集群的网络限制(不能确保集群中每个节点都有外网连接)、安全限制(不仅是服务节点的安全,外部自身也会受到如浏览器同源策略的约束)、依赖限制(服务坐标这类信息不属于对外接口承诺的内容,随时可能变动,不应该依赖它),就算是我们自己也不可能愿意记住每一个服务的坐标位置来编写代码。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了微服务架构中网关的重要性和基础职能,强调了网关作为服务集群对外的入口,承担统一对外交互的代理人角色。文章介绍了微服务网关的基础职能,包括路由器、流量过滤器、安全、认证、授权、限流、监控和缓存等,并围绕网络I/O模型的知识进行了详细讲解。此外,文章还探讨了网关的性能考量,以Zuul网关为例,阐述了不同网络I/O模型对网关性能的影响。总的来说,本文为读者提供了微服务网关的基础知识和重要考虑因素,帮助读者快速了解微服务架构中网关的作用和性能优化的相关知识。 文章还提到了网关的可用性考量,强调了网关的轻量化、选型成熟性和高可用性的重要性。此外,还介绍了“BFF”概念,即网关针对不同前端提供不同服务的能力。最后,文章提出了对网关路由职能在BFF方面的应用,引发读者思考网关在微服务架构中的其他应用和功能实现方式。 总的来说,本文内容丰富,涵盖了微服务网关的基础知识、性能优化、可用性考量和BFF概念,为读者提供了全面的了解和思考空间。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • Free
    在学习IO模型的时候,接触到另一种解释,和本节的解释不太一样,一直疑惑今天讲的IO模型和下面的IO模型本质上是同一种解释,还是说下面的解释不对,求大佬解惑。 另外,本节中说select、epoll、kqueue属于多路复用 I/O,多路复用 I/O 本质上是阻塞 I/O 的一种。而在下面的说法中,select、epoll、kqueue属于同步非阻塞IO,到底select、epoll、kqueue是阻塞还是非阻塞,哪种说法对呢? 以下是另一种解释: IO操作分两个阶段,一般来说step1花费的时间远远大于step2: step1、等待数据准备好(读到内核缓存) step2、将数据从内核读到用户空间(进程空间) 同步阻塞IO(BIO): step1上阻塞step2上也阻塞。 同步非阻塞IO(NIO):step1上非阻塞step2阻塞,Reactor就是这种模型(select、epoll、kqueue) 。 异步非阻塞IO(AIO):step1上非阻塞step2上非阻塞,Proactor模型就是这种模型。

    作者回复: 上面的说法不能说有错,现在经常能听到有人这么提及的。但有确实一些误导成分,其关键是混淆了面向用户一侧的阻塞,与面向系统一侧的阻塞的概念。 以Java的NIO为例,它本身就是基于多路复用I/O实现的,对于用户来说,只要不必为每一个I/O通讯去开一条线程,一个循环等着selector返回有效的通知即可处理所有I/O通讯,那对用户来说它就是非阻塞的,并不关心没有数据到来之前,为何不会空转消耗CPU资源。 但是对操作系统来说,这种只能称之为异步,本身select函数必须是阻塞的,否则就会导致循环中大部分时间CPU都在空转。 其实“以多路复用IO去实现非阻塞IO”这种提法,不加以详细解释,本身就有混淆概念的嫌疑。Java本身是将其NIO解释为New IO的,我个人猜测也是为了避免这种混淆。

    2021-05-04
    2
    26
  • Snway
    如何理解网关具有唯一性,服务网关同样可以部署集群吧,应该不会有单点问题

    作者回复: 可以部署集群,但集群外部还是需要有一个“代表”,它可以是另一个gateway或者load balancer。

    2021-02-04
    5
    10
  • zhanyd
    同步,异步,是指两个线程之间的关系,如果线程A对线程B发起请求,A要一直到等B的结果返回了才能继续往下运行,A和B就是同步关系。 如果线程A对线程B发起请求之后,不在原地等结果,直接干别的事情去了,等B有结果了再通知A,A和B的关系就是异步关系。 阻塞,非阻塞,是指单个线程的状态,如果线程A对线程B发起请求,A线程要等B线程的结果,A在等的过程中不干别的,线程挂起,休眠,就是阻塞状态;如果A线程不用等B的结果,直接干别的去了,那么就是非阻塞状态。
    2021-02-04
    1
    35
  • walle斌
    关于BFF。。我想说一下。。我公司就有前端的BFF团队。。咋说来。。做的好还行。。不行的那真是浪费时间。。各种浪费时间。。多了一层以后,人员沟通,技术问题再次解释一遍。。这都啥啊
    2021-09-29
    6
  • 范飞扬
    "那么到了 Zuul 的 2.0 版本,最大的改进就是基于 Netty Server 实现了异步 I/O 模型来处理请求,大幅度减少了线程数,获得了更高的性能和更低的延迟。" 请问老师和同学,不是说Linux没有异步IO吗?这里为什么说实现了异步IO?
    2022-11-05归属地:上海
    2
  • Helios
    转发的设备不是一层代理么?为何把转发和代理还分开
    2021-02-13
    2
  • Jxin
    感觉信号驱动io应该放在多路复用前面。可以算是非阻塞io的升级版。而多路复用是更好的方案。
    2021-02-11
    2
  • tt
    原始时代的声音:在微服务和独立的网关出现之前,也就是我们的现在,在用的有综合前置机、apache做反向代理、硬负载均衡器,后面是很多单体服务,这些服务上有着很多冒烟的烟囱
    2021-02-03
    2
  • neohope
    在API网关之前,会把移动APP的后端服务单独独立出来,APP访问APP后端服务,APP后端服务访问Web后端服务,相当于做了一个完全定制化的API网关。 当时也尝试过直接用Nginx来完成,但当时也不知道OpenResty这类扩展,复杂些的功能没能实现,没能实际应用。 后面从Zuul开始就不造轮子了。
    2021-04-06
    1
  • 海风极客
    微服务中网关可以被视为服务的唯一出入口,要尽可能的保持简单和抽象,在其前面也最好部署负载均衡,其本身也应该具有负载均衡的功能,网关提供的路由功能就好比路由器对TCP报文的三层转发功能,使其进行正确的请求和响应。
    2023-11-22归属地:北京
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部