目录
一、什么是Ribbon
Ribbon能干什么
二、集成Ribbon
添加依赖
配置文件
启动类加上注解
@LoadBalanced 实现负载均衡的注解编辑
控制器中
三、Ribbon实现负载均衡
四、自定义负载均衡算法
自定义
主启动类
五、Feign简介
Feign的作用
六、Feign配置
编辑
导入依赖
服务
启动类编辑
Feign和Ribbon如何选择?
负载均衡简单分类:
集中式LB
进程式 LB
在客户端中配置!
Ribbon和Eureka整合后,客户端可以直接调用,不用关心IP地址和端口号
1.新建两个服务提供者Moudle:springcloud-provider-dept-8003、springcloud-provider-dept-8002
2.参照springcloud-provider-dept-8001 依次为另外两个Moudle添加pom.xml依赖 、resourece下的mybatis和application.yml配置,Java代码
3.启动所有服务测试(根据自身电脑配置决定启动服务的个数),访问http://eureka7001.com:7002/ 查看结果
测试访问http://localhost/consumer/dept/list 这时候随机访问的是服务提供者8003
再次访问http://localhost/consumer/dept/list这时候随机的是服务提供者8001
Ribbon默认是轮询算法,按序1,2,3依次分配。
IRule接口中提供的负载均衡算法
该包不要和主启动类所在的包同级,要跟启动类所在包同级
自定义的规则(这里我们参考Ribbon中默认的规则代码自己稍微改动):MyRandomRule.java
public class MyRandomRule extends AbstractLoadBalancerRule {
/**
* 每个服务访问5次则换下一个服务(总共3个服务)
*
* total=0,默认=0,如果=5,指向下一个服务节点
* index=0,默认=0,如果total=5,index+1
*/
private int total = 0;//被调用的次数
private int currentIndex = 0;//当前是谁在提供服务
//@edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List upList = lb.getReachableServers();//获得当前活着的服务
List allList = lb.getAllServers();//获取所有的服务
int serverCount = allList.size();
if (serverCount == 0) {
/*
* No servers. End regardless of pass, because subsequent passes
* only get more restrictive.
*/
return null;
}
//int index = chooseRandomInt(serverCount);//生成区间随机数
//server = upList.get(index);//从或活着的服务中,随机获取一个
//=====================自定义代码=========================
if (total < 5) {
server = upList.get(currentIndex);
total++;
} else {
total = 0;
currentIndex++;
if (currentIndex > upList.size()) {
currentIndex = 0;
}
server = upList.get(currentIndex);//从活着的服务中,获取指定的服务来进行操作
}
//======================================================
if (server == null) {
/*
* The only time this should happen is if the server list were
* somehow trimmed. This is a transient condition. Retry after
* yielding.
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
}
return server;
}
protected int chooseRandomInt(int serverCount) {
return ThreadLocalRandom.current().nextInt(serverCount);
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub
}
}
Feign是声明式Web Service客户端,它让微服务之间的调用变得更简单,类似controller调用service。SpringCloud集成了Ribbon和Eureka,可以使用Feigin提供负载均衡的http客户端
只需要创建一个接口,然后添加注解即可~
Feign默认集成了Ribbon
利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
通过Ribbon实现负载均衡,通过Feign实现远程调用
通过Feign实现
通过接口和注解实现!
对比通过Ribbon实现
Feign和Ribbon二者对比,前者显现出面向接口编程特点,代码看起来更清爽,而且Feign调用方式更符合我们之前在做SSM或者SprngBoot项目时,Controller层调用Service层的编程习惯!
根据个人习惯而定,如果喜欢REST风格使用Ribbon;如果喜欢社区版的面向接口风格使用Feign.
Feign 本质上也是实现了 Ribbon,只不过后者是在调用方式上,为了满足一些开发者习惯的接口调用习惯!
下面我们关闭springcloud-consumer-dept-80 这个服务消费方,换用springcloud-consumer-dept-feign(端口还是80) 来代替:(依然可以正常访问,就是调用方式相比于Ribbon变化了)
springboot版本时2.5.3的,eureka依赖用的是spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-netflix-eureka-server都是3.0.3版本的。
1.首先狂神视频用的spring-cloud-starter-eureka和spring-cloud-starter-eureka-server已经被丢弃了,官方推荐使用spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-netflix-eureka-server,并且spring-cloud-starter-netflix-eureka-client3.0.x版本(2.2.9版本的不太清楚)是包含对ribbon的依赖的,所以你就不用ribbon原来的依赖了。除ServerPropertiesAutoConfiguration.class] cannot be opened和no instances available…报错可以尝试将原来的那些包替换成我的,原来的代码不用变
2.在ribbon的视频里,@RibbonClient注解在3.0.3版本里已经没有,可以用@LoadBalancerClient替换
然后我找了一下源代码,没有找到IRule类,且官方的负载均衡算法好像也只有轮询和随机了(我只找到这两个),两者实现ReactorServiceInstanceLoadBalancer接口可以用@Bean注解来保存我们自定义的负载均衡算法。
因为ribbon不更新了,所以springcloud官方使用loadbalancer取代了ribbon,你现在用的就是loadbalancer,自定义负载均衡算法实现ReactorServiceInstanceLoadBalancer接口(这个就相当于IRule)就行了,具体写法可以参考官方实现的那两个算法,之后再从配置类中注册