2.springcloudAlibaba-openFeign
3.springcloudAlibaba-负载均衡器Ribbon
4.springcloudAlibaba-nacos配置中心
5.springcloudAlibaba-Seata 分布式事务
7.springcloudAlibaba-网关gateway
目录
1.什么是Ribbon
目前主流的负载方案分为以下两种:
集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的(比如 F5),也有软件的(比如 Nginx)。
客户端根据自己的请求情况做负载均衡,Ribbon 就属于客户端自己做负载均衡。
Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
负载均衡策略
IRule
这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例。
AbstractLoadBalancerRule
AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,这里定义它的目的主要是辅助负责均衡策略选取合适的服务端实例
规则分类
默认情况下Ribbon的负载均衡策略是轮询,Ribbon常用的负载均衡规则:
1、简单轮询策略(RoundRobinRule)
以轮询的方式依次将请求调度不同的服务器
2、随机策略 (RandomRule)
随机选择状态为UP的Server
3、加权响应时间策略 (WeightedResponseTimeRule)
根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
4、区域权重策略(ZoneAwareRule)
综合判断server所在区域的性能和server的可用性选择server
5、最低并发策略(BestAvailableRule)
逐个查看server,选择一个并发连接最低的server
6、重试策略(RetryRule)
对选定的负载均衡策略机上重试机制
7、可用过滤策略(AvailabilityFilteringRule)
过滤掉一直失败并被标记为circuit tripped的server
8、ResponseTimeWeightedRule
已废弃,作用同WeightedResponseTimeRule
ribbon使用
yml配置的方式
nacos中已有ribbon
重新复制order module 改名为 orderCopy 端口号改为9996
在customer 配置文件yml 中加入单个负载均衡配置
order-service: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
然后重启项目调用原 http://localhost:9998/getUserInfo
可以看到轮训配置成功,其他的策略 可以自行操作
config类注入放式
还有一种配置方式是通过 配置类来注入
注意这个中配置方式 该类不能放到SpringbootApplication 能扫到的地方
在config中指定策略
@Configuration public class RibbonConfig { /** * 全局配置 * 指定负载均衡策略 * * @return */ @Bean public IRule iRule() { return new RoundRobinRule(); } }
然后再在application中指定服务的策略
自定义策略
通过继承 AbstractLoadBalancerRule 来自定义策略
public class NacosRandomWithWeightRule extends AbstractLoadBalancerRule { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; @Override public Server choose(Object key) { DynamicServerListLoadBalancer loadBalancer = (DynamicServerListLoadBalancer) getLoadBalancer(); String serviceName = loadBalancer.getName(); NamingService namingService = nacosDiscoveryProperties.namingServiceInstance(); try { //nacos基于权重的算法 Instance instance = namingService.selectOneHealthyInstance(serviceName); return new NacosServer(instance); } catch (NacosException e) { e.printStackTrace(); } return null; } @Override public void initWithNiwsConfig(IClientConfig clientConfig) { } }
在配置文件中修改类
order-service: ribbon: NFLoadBalancerRuleClassName: com.config.NacosRandomWithWeightRule
饥饿加载
Ribbon默认懒加载 只有在第一次调用的时候才会去初始化策略配置,在第一次调用时容易超时
在yml中开启鸡儿加载使项目加载时初始化ribbon策略
ribbon: eager‐load: enabled: true clients: order-service #多个使用逗号分隔