irpas技术客

【微服务~原始真解】Spring Cloud —— 实现负载均衡_桃花键神

网络投稿 6416

🔎这里是【秒懂·云原生】,关注我学习云原生不迷路 👍如果对你有帮助,给博主一个免费的点赞以示鼓励 欢迎各位🔎点赞👍评论收藏??

👀专栏介绍

【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。

👀本期介绍

主要介绍Spring Cloud —— Ribbon 实现负载均衡

文章目录 👀专栏介绍👀本期介绍Ribbon 实现负载均衡一、 在 MySQL 数据库中执行以下 SQL 语句,准备测试数据。二、参考 micro-service-cloud-provider-dept-8001,再创建两个微服务 Moudle :micro-service-cloud-provider-dept-8002 和 micro-service-cloud-provider-dept-8003。三、在 micro-service-cloud-provider-dept-8002 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。四、在 micro-service-cloud-provider-dept-8003 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。五、依次启动 micro-service-cloud-eureka-7001/7002/7003(服务注册中心集群)、micro-service-cloud-provider-dept-8001/8002/8003(服务提供者集群)以及 micro-service-cloud-consumer-dept-80(服务消费者)。六、使用浏览器连续访问“http://eureka7001.com/consumer/dept/get/1”,结果如下图。

Ribbon 实现负载均衡

Ribbon 是一个客户端的负载均衡器,它可以与 Eureka 配合使用轻松地实现客户端的负载均衡。Ribbon 会先从 Eureka Server(服务注册中心)去获取服务端列表,然后通过负载均衡策略将请求分摊给多个服务端,从而达到负载均衡的目的。

Spring Cloud Ribbon 提供了一个 IRule 接口,该接口主要用来定义负载均衡策略,它有 7 个默认实现类,每一个实现类都是一种负载均衡策略。

序号 实现类 负载均衡策略 1 RoundRobinRule 按照线性轮询策略,即按照一定的顺序依次选取服务实例 2 RandomRule 随机选取一个服务实例 3 RetryRule 按照?RoundRobinRule(轮询)的策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试(重试时获取服务的策略还是 RoundRobinRule 中定义的策略),如果超过指定时间依然没获取到服务实例则返回?null 。 4 WeightedResponseTimeRule WeightedResponseTimeRule 是 RoundRobinRule 的一个子类,它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间,来计算所有服务实例的权重,响应时间越短的服务实例权重越高,被选中的概率越大。刚启动时,如果统计信息不足,则使用线性轮询策略,等信息足够时,再切换到 WeightedResponseTimeRule。 5 BestAvailableRule 继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例,然后再选择并发量最小的服务实例。 6 AvailabilityFilteringRule 先过滤掉故障或失效的服务实例,然后再选择并发量较小的服务实例。 7 ZoneAvoidanceRule 默认的负载均衡策略,综合判断服务所在区域(zone)的性能和服务(server)的可用性,来选择服务实例。在没有区域的环境下,该策略与轮询(RandomRule)策略类似。
下面我们就来通过一个实例来验证下,Ribbon 默认是使用什么策略选取服务实例的。 一、 在 MySQL 数据库中执行以下 SQL 语句,准备测试数据。 DROP DATABASE IF EXISTS spring_cloud_db2; CREATE DATABASE spring_cloud_db2 CHARACTER SET UTF8; USE spring_cloud_db2; DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `dept_no` int NOT NULL AUTO_INCREMENT, `dept_name` varchar(255) DEFAULT NULL, `db_source` varchar(255) DEFAULT NULL, PRIMARY KEY (`dept_no`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `dept` VALUES ('1', '开发部', DATABASE()); INSERT INTO `dept` VALUES ('2', '人事部', DATABASE()); INSERT INTO `dept` VALUES ('3', '财务部', DATABASE()); INSERT INTO `dept` VALUES ('4', '市场部', DATABASE()); INSERT INTO `dept` VALUES ('5', '运维部', DATABASE()); ############################################################################################# DROP DATABASE IF EXISTS spring_cloud_db3; CREATE DATABASE spring_cloud_db3 CHARACTER SET UTF8; USE spring_cloud_db3; DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `dept_no` int NOT NULL AUTO_INCREMENT, `dept_name` varchar(255) DEFAULT NULL, `db_source` varchar(255) DEFAULT NULL, PRIMARY KEY (`dept_no`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `dept` VALUES ('1', '开发部', DATABASE()); INSERT INTO `dept` VALUES ('2', '人事部', DATABASE()); INSERT INTO `dept` VALUES ('3', '财务部', DATABASE()); INSERT INTO `dept` VALUES ('4', '市场部', DATABASE()); INSERT INTO `dept` VALUES ('5', '运维部', DATABASE()); 二、参考 micro-service-cloud-provider-dept-8001,再创建两个微服务 Moudle :micro-service-cloud-provider-dept-8002 和 micro-service-cloud-provider-dept-8003。 三、在 micro-service-cloud-provider-dept-8002 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。 server: port: 8002 #端口号修改为 8002 spring: application: name: microServiceCloudProviderDept #微服务名称,不做修改,与 micro-service-cloud-provider-dept-8001 的配置保持一致 datasource: username: root #数据库登陆用户名 password: root #数据库登陆密码 url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db2 #数据库url driver-class-name: com.mysql.jdbc.Driver #数据库驱动 四、在 micro-service-cloud-provider-dept-8003 中 application.yml 中,修改端口号以及数据库连接信息,修改的配置如下。 server: port: 8003 #端口号修改为 8003 spring: application: name: microServiceCloudProviderDept #微服务名称,不做修改,与 micro-service-cloud-provider-dept-8001 的配置保持一致 datasource: username: root #数据库登陆用户名 password: root #数据库登陆密码 url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db3 #数据库url driver-class-name: com.mysql.jdbc.Driver #数据库驱动 五、依次启动 micro-service-cloud-eureka-7001/7002/7003(服务注册中心集群)、micro-service-cloud-provider-dept-8001/8002/8003(服务提供者集群)以及 micro-service-cloud-consumer-dept-80(服务消费者)。 六、使用浏览器连续访问“http://eureka7001.com/consumer/dept/get/1”,结果如下图。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #微服务原始真解Spring #Cloud #实现负载均衡 #Spring