35 如何在客户端实现服务的负载均衡?
你好,我是周志明。这节课我们来学习客户端负载均衡的实现原理。
在正式开始讨论之前,我们先来区分清楚几个容易混淆的概念,分别是前面两讲中我介绍过的服务发现、网关路由,以及这节课要探讨的负载均衡,还有在下一讲中将会介绍的调用容错。这几个技术名词都带有“从服务集群中寻找到一个合适的服务来调用”的含义,那么它们之间的差别都体现在哪呢?下面我就通过一个具体的案例场景来给你说明一下。
理解服务发现、网关路由、负载均衡、调用容错的具体区别
假设,你目前身处广东,要上Fenix's Bookstore购买一本书。在程序业务逻辑里,购书的其中一个关键步骤是调用商品出库服务来完成货物准备,在代码中该服务的调用请求为:
假设Fenix's Bookstore是个大书店,在北京、武汉、广州的机房均部署有服务集群,那么此时按顺序会发生以下事件:
- 首先是将warehouse这个服务名称转换为了恰当的服务地址。
注意,这里的“恰当”是个宽泛的描述,一种典型的“恰当”就是因为调用请求来自于广东,DNS层面的负载均衡就会优先分配给传输距离最短的广州机房来应答。
其实按常理来说,这次出库服务的调用应该是集群内的流量,而不是用户浏览器直接发出的请求。所以尽管结果都一样,但更接近实际的情况应该是用户访问首页时,已经被DNS服务器分配到了广州机房,请求出库服务时,应优先选择同机房的服务进行调用,此时该服务的调用请求就变为: