RestTemplate与负载均衡器

本文深入探讨了SpringCloud中RestTemplate与Ribbon负载均衡器的使用,包括客户端和服务端发现的概念,RestTemplate的三种使用方式,以及Ribbon的源码分析,揭示了负载均衡的工作原理。通过实例解释了如何利用负载均衡实现微服务间的高效调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要是介绍SpringCloud构建微服务系统的Ribbon负载均衡器和网络请求框架RestTemplate,另外将会分析负载均衡器的源码,通过实例证明如何通过Ribbon和RestTemplate相结合实现负载均衡。现在假设有一个分布式系统,该系统由在不同计算机上运行的许多服务组成。当用户数量很大时,通常会为服务创建多个副本。每个副本都在另一台计算机上运行,此时有助于在服务器之间平均分配传入流量。

客户端发现与服务端发现

在一个系统中,服务通常需要调用其他服务。单体应用中,服务通过语言级别的方法或者过程调用另外的服务。在传统的分布式部署中,服务运行在固定,已知的地址主机和端口,因此可以请求的通过HTTP/REST或其他RPC机制调用。 然而,一个现代的微服务应用通常运行在虚拟或者容器环境,服务实例数和它们的地址都在动态改变。因此需要实现一种机制,允许服务的客户端向动态变更的一组短暂的服务实例发起请求,这就是服务注册与发现,服务注册与发现是微服务架构中最重要的基础组件

我们接下来需要搞清楚的是什么是客户端发现,什么是服务端发现?

这里的注册中心其实就相当于青楼的老鸨,A是嫖客,B是小姐。这样一比喻相信各位老司机都知道三者之间的交互逻辑了。客户端发现就是当A需要调用B服务时,请求注册中心(B服务在启动时会将信息注册到注册中心),注册中心将一份完整的可用服务列表返回给 A 服务,A 服务自行决定使用哪个 B 服务。客户端发现的特点:

  • 简单直接,不需要代理的介入
  • 客户端(A)知道所有实际可用的服务地址
  • 客户端(A)需要自己实现负载均衡逻辑

使用客户端发现的例子:Eureka

服务端发现相对于客户端发现,多了一个代理,代理帮A从众多的B中挑选一个B。服务端发现的特点:

  • 由于代理的介入,服务(B)与注册中心,对 A 是不可见的

使用服务端发现的例子:Nginx、ZooKeeper、Kubernetes

客户端与服务端负载均衡

通过理解客户端发现与服务端发现的区别,我们明白其实调用哪个服务取决于客户端还是服务端是由什么决定的呢?那就是取决于服务注册与发现使用的是客户端发现还是服务端发现。

服务端负载均衡

服务器端负载均衡器,我们比较常见的例如Nginx、F5是放置在服务器端的组件。当请求来自客户端时,它们将转到负载均衡器,负载均衡器将为请求指定服务器。负载均衡器使用的最简单的算法是随机指定。在这种情况下,大多数负载平衡器是用于控制负载平衡的硬件集成软件。

mark

服务端负载均衡的特点:
  • 对客户端不透明,客户端不知道服务器端的服务列表,甚至不知道自己发送请求的目标地址存在负载均衡器。
  • 服务器端维护负载均衡服务器,控制负载均衡策略和算法。

客户端负载均衡

当负载均衡器位于客户端时,客户端得到可用的服务器列表然后按照特定的负载均衡策略,分发请求到不同的服务器 。

mark

客户端负载均衡的特点:

  • 对客户端透明,客户端需要知道服务器端的服务列表,需要自行决定请求要发送的目标地址。
  • 客户端维护负载均衡服务器,控制负载均衡策略和算法。
  • 目前单独提供的客户端实现比较少(本文只分析Ribbon),大部分都是在框架内部自行实现。

RestTemplate三种使用方式

RestTemplate是Spring框架提供的一种用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 之前我们使用的较多的是Apache的OKHttp这个包库,或者是根据HttpUrlConnection封装的库,现在有了更好的选择,那就是RestTemplate:

1、直接填写服务地址

Order应用想要直接访问Shop应用的接口,填写服务地址直访问即可。

mark

2、使用LoadBalancerClient

使用LoadBalancerClient的choose()获得ServiceInstance,也就是这两个应用必须先向Eureka Server注册,然后通过Client的名称来选择对应的服务实例:

mark

3、注入RestTemplate Bean

注入RestTemplate bean,使用服务名称访问即可:

mark

Ribbon负载均衡源码分析

在上面的例子中我们使用了RestTemplate并且开启了客户端负载均衡功能,开启负载均衡很简单,只需要在RestTemplate的bean上再添加一个@LoadBalanced注解即可,我们可以从这个注解开始分析:

/**
* Annotation to mark a RestTemplate or WebClient bean to be configured to use a
* LoadBalancerClient.
* @author Spencer Gibb
*/
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值