第一节:ribbon在微服务架构中扮演什么角色?
1,什么是ribbon?
(1)Ribbon是一个基于Http和tcp的客户端负载均衡工具,它是基于Netflix Ribbon实现的。
(2)他不像spring cloud服务注册中心,配置中心,API网关那样独立部署,但是它几乎存在于每个spring cloud微服务中。包括feign提供的声明式服务调用也是基于该ribbon实现的。
(3)ribbon默认提供很多负载均衡算法,例如轮询,随机等待。甚至包含自定义的负载均衡算法。
2,ribbon解决了什么问题?
解决并提供了微服务的负载均衡的问题。
3,负载均衡解决方案的分类
目前业界主流的负载均衡方案可分成两类?
第一类:集中式负载均衡,即在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;
第二类:进程内负载均衡,将负载均衡逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
4,ribbon架构原理图解
从上图可以知道,ribbon是集成在consumer中的。各个provider首先在eureka中注册,consumer也在eureka中注册,当consumer要调用provider的时候,先在eureka中获取可用的provider注册信息,获取到之后,根据ribbon提供的负载均衡算法选择出合适的一个provider,然后再发起请求。
第二节:ribbon的简单入门例子讲解
要写一个ribbon的例子,实现负载均衡的功能,我们至少需要两个应用名相同的provider。
(1)新建一个provider。
借用基础篇中的那个provider,我们再新建一个provider,命名为eureka-provider-duo-server。拷贝原provider的所有文件,然后将配置文件中的端口改为8085。
(2)启动eureka的注册中心。
(3)启动这两个provider。
(4)启动consumer。
(5)由于spring cloud的eureka依赖已经包含了ribbon的依赖,所以我们不需要再引入ribbon的依赖了。
浏览器访问http://localhost:8084/list,连续不断地多刷新几次,可以在后台日志看到如下打印:
源码见这里
第三节:七种常用负载均衡策略的对比与区别
1,方法一:修该代码,达到选择负载均衡的目的。
(1)在eureka模块下,新建maven项目,命名为eureka-consumer-Lb,将eureka-consumer的controller,domain,service,启动类,配置文件全都拷贝一份到新建项目中。
(2)修改pom文件,添加web依赖和打包插件,具体参考eureka-consumer。
(3)修改配置文件,将应用名设置为eureka-consumer-Lb,端口设置为8086。
(4)修改启动类,添加配置负载均衡的代码,如下:
package com.twf.eureka.consumer.Lb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
@EnableEurekaClient
@SpringBootApplication
public class ConsumerLbApplication {
@Bean
public IRule ribbonRule() { // 配置负载均衡策略
return new RandomRule(); // 这里配置的是随机策略
}
public static void main(String[] args) {
SpringApplication.run(ConsumerLbApplication.class, args);
}
}
(5)启动eureka注册中心,启动两个provider,启动eureka-consumer-Lb。
(6)访问http://localhost:8086/list,快速连续点击刷新图标,在后台控制台打印日志如下:
2,方法二:修改配置文件,达到选择负载均衡的目的。
(1)注释掉启动类中的配置策略的代码。
(2)在配置文件中加上如下配置:
3,重启eureka-consumer-Lb,访问http://localhost:8086/list,效果如上。
4,源码点这里。
第四节:采用点对点直连的方式,让ribbon的开发调试更方便快捷
1,在ribbon开发调式的时候,为什么需要采用点对点的直连方式?
首先明确,直连就是指消费方consumer直接调用服务provider。
一般在项目的开发过程中,会有多个开发人员同时启动项目,比如有张三,李四,王五,同时提供了这个服务,那么根据ribbon的负载均衡算法,比如轮询,本来消费方是要和张三联调,结果请求第二次发给了李四,第三次发给了王五,这样就会影响李四王五的工作,而且也不利于消费方和张三的联调。所以这时就需要点对点直连,让消费方只和张三联调,不影响其他人。
2,实现点对点直连
(1)在eureka模块下,新建maven项目,命名为eureka-consumer-remove-eureka。
(2)拷贝eureka-consumer的controller,domain,service,启动类,配置文件到这个项目中。
(3)修改pom文件,一是加入web依赖和ribbon依赖,二是加入maven打包插件配置,三是将该项目的继承关系由继承eureka改为继承spring-cloud-in-action(即继承总模块)。
配置文件如下:
(4)修改配置文件。
删除eureka的配置,修改应用名和端口,然后加上ribbon的配置,如下:
spring.application.name=eureka-consumer-remove-eureka
server.port=8087
#禁用eureka
ribbon.eureka.enabled=false
#指定具体的服务实例清单
eureka-provider.ribbon.listOfServers=localhost:8083
(5)启动注册中心,两个provider,和这个项目。
(6)浏览器访问http://localhost:8087/list,多次点击刷新图标,后台打印如下:
(7)如果想和多个人联调,那么在配置文件的服务列表中加入即可,配置如下:
spring.application.name=eureka-consumer-remove-eureka
server.port=8087
#禁用eureka
ribbon.eureka.enabled=false
#指定具体的服务实例清单
eureka-provider.ribbon.listOfServers=localhost:8083,localhost:8085
再启动,再访问,后台打印如下:
源码见这里。