在springcloud中Ribbon的作用是实现各个微服务之间的负载均衡。
在分布式系统下为保证系统的性能每个服务往往都是以集群的方式出现的,当同样的的服务存在多个实例时我们不方便去指定使用该服务的哪一个具体应该(我们只知道使用该服务的功能,但是不确定使用该服务的哪一个实例),此时ribbon来帮助我们指定一个服务的实例去完成调用。
软件的负载均衡大致分为两种:
- 服务端负载均衡——Nginx:获取所有服务列表
- 客户端负载均衡——Ribbon:获取所有服务列表
项目中负载均衡使用的粗略示意图:
客户在浏览器中使用功能,该功能向服务端发起请求,此时前端只知道一个固定地址没办法去指定我们使用哪一个服务,我们一般搭建一个中间层选择使用Nginx做负载,由Nginx来帮我们指定使用哪一个服务实例。
【如图中我们有2个网关服务,但是客户只是请求服务,客户端并不知道应该使用哪一个服务实例,所以让客户的请求发送给Nginx,由他来指定使用哪一个具体的服务。】
当网关服务进一步调用我们的具体服务的时候我们发现每个服务模块都不止一个,网关也不知道应该使用哪一个,此时如果在搭建一层Nginx的话那就太麻烦也太耗资源了,因为用户、支付、商品、订单都是集群部署的,他们之间也存在互相调用的问题,所以我们可以让每个服务实例都获得所有的服务实例信息列表,在服务A调用的服务B时候服务A就可以根据自己的服务实例列表知道使用服务B的那个实例了。这样我们就可以少一次nginx的中转,从而提升相关性能减少对应的资源损耗。
服务A如何找到服务B的某个具体实例就是通过ribbon来实现的。
总结:
单独搭建一个中间层,在中间层配置所有服务实例信息,再由中间层根据配置的信息去指定某一个具体的服务实例去调用就是服务端负载均衡。
每个服务实例中都配置所有服务实例信息,由服务实例直接指定访问另一个具体的服务实例(如:商品A直接调用订单C)就是客户端负载均衡。