作者:美好心灵66 | 来源:互联网 | 2023-05-27 13:30
负载均衡及Ribbonribbon是什么?SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡的工具。ribbon能干吗
负载均衡及Ribbon
ribbon是什么?
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
ribbon能干吗?
- LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。
- 负载均衡简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
- 常见的负载均衡软件有Nginx,
Lvs
等等 - dubbo、SpringCloud中均给我们提供了负载均衡,SpringCloud的负载均衡算法可以自定义
第一步、80项目 加依赖
<dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-ribbonartifactId><version>1.4.6.RELEASEversion>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-eurekaartifactId><version>1.4.6.RELEASEversion>dependency>
第二步、80 application.xml加配置
#erueka配置
eureka:client:register-with-eureka: false #不再eureka注册自己service-url:defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
第三步、80 com.tian.springcloud.config;
&#64;Configuration
public class ConfigBean { &#64;LoadBalanced &#64;Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
第四步、controller
&#64;Autowiredprivate RestTemplate restTemplate;private static final String REST_URL_PREFIX&#61;"http://SPRINGCLOUD-PROVIDER-DEPT";
第五步、主启动类加注解 &#64;EnableEurekaClient
&#64;SpringBootApplication
&#64;EnableEurekaClient
public class DeptConsumer_80 {public static void main(String[] args) {SpringApplication.run(DeptConsumer_80.class,args);}
}
使用Ribbon实现负载均衡
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/069fc9131fcef3e6.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
第一步、创建db02 db03数据库 数据和db01一样&#xff0c;db_source不一样
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/3e00c95cbf62e51d.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)
第二步、new module 8002 8003
copypom依赖
resource下面的资源
application.xml 里面更改对应的数据库和端口号和 instance-id三个application&#xff1a;name 是一样的 copy DeptMapper.xml
copy java 代码 &#xff08;dao service controller&#xff09;
改一下主启动类 即可
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/9b875244a0408ae5.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
7001 8001 8002 8003 启动 80启动~
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/809b21710150e8e9.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
测试访问 轮询
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/7a0e5ad59d3f070c.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
自定义负载均衡算法
默认是轮询
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/8cbc60b829f7ce98.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/185f8f080401a2d4.png#pic_center)
所以不和主启动类放在一个包下
第一步、自定义一个算法类 TianRandomRule
package com.tian.myrule;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;public class TianRandomRule extends AbstractLoadBalancerRule {private int total&#61;0; private int currentIndex&#61;0; public Server choose(ILoadBalancer lb, Object key) {if (lb &#61;&#61; null) {return null;} else {Server server &#61; null;while(server &#61;&#61; null) {if (Thread.interrupted()) {return null;}List<Server> upList &#61; lb.getReachableServers();List<Server> allList &#61; lb.getAllServers();int serverCount &#61; allList.size();if (serverCount &#61;&#61; 0) {return null;}
if (total<5){server&#61;upList.get(currentIndex);total&#43;&#43;;}else {total&#61;0;currentIndex&#43;&#43;;if(currentIndex>upList.size()-1){currentIndex&#61;0;}}
if (server &#61;&#61; null) {Thread.yield();} else {if (server.isAlive()) {return server;}server &#61; null;Thread.yield();}}return server;}}protected int chooseRandomInt(int serverCount) {return ThreadLocalRandom.current().nextInt(serverCount);}public Server choose(Object key) {return this.choose(this.getLoadBalancer(), key);}public void initWithNiwsConfig(IClientConfig clientConfig) {}
}
第二步、配置到spring中~
return new TianRandomRule();
![在这里插入图片描述](https://img8.php1.cn/3cdc5/fefd/807/16fbbc3ee62a7b13.png?x-oss-process&#61;image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAamF2YeWFqOagiF9jb2Rlcg&#61;&#61;,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)