在spring cloud中使用负载均衡非常简单
1.服务提供者只需要启动多个服务实力并注册到一个注册中心或是多个相关联的服务注册中心
2.服务消费者直接通过调用被@LoadBalanced注解秀试过的RestTemplate来实现面向服务的接口调用
RestTemplate详解
GET请求
1.getForEntity函数,该方法返回的是ResponseEntity
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity("http://SERVICE-HI/user?name={1}",String.class,"didi");
String body = response.getBody();
*didi会替换掉占位符{1},返回的body是一个String类型
2.
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<User> response = restTemplate.getForEntity("http://SERVICE-HI/user?name={1}",User.class,"didi");
User body = response.getBody();
*直接指定一个实体类
但实际上,getForEntity提供了三种重载方法,这里不做详细介绍,有兴趣的可以看一下源码
POST请求
1.post请求其实和get请求类似
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.postForEntity("http://SERVICE-HI/user?name={1}",String.class,"didi");
String body = response.getBody();
post也是提供了三种重载方法
负载均衡策略
AbstractLoadBalancerRule
负载均衡策略的抽象类,在该类中定义了负载均衡器ILoadBalancer对象,该对象能够在具体实现选择服务策略时,获取到一些负载均衡器中维护的信息来作为分配依据
RandomRule
该策略实现了从服务实例清单中随机选择一个服务实例的功能。
RoundRobinRule
该策略实现了按照现行轮询的方式一次选择每个服务实例的功能
RetryRule
该策略实现了一个具备重试机制的实例选择功能
WeightedResponseTimeRule
该实例是对RoundRobinRule的扩展,增加了根据实例运行情况来计算权重,并根据权重来挑选实例,以达到更优的分配效果。
ClientConfigEnabledRoundRobinRule
该策略较为特殊,我们一般不直接使用它,因为它本身并没有实现什么特殊的处理逻辑,在他的内部定义了一个RoundRobinRule策略,而choose函数的实现也正是使用了RoundRobinRule的线性轮询机制,虽然我们不会直接使用该函数,但是通过集成该策略,默认的choose就实现了线性轮询机制,在自雷中做一些高级策略时通常有可能会存在一些无法实施的情况,那么就可以用父类的实现作为备选,所以一般是用来作为高级策略的父类。
BestAvailableRule
该策略继承自ClientConfigEnabledRoundRobinRule,在实现中它注入了负载均衡的统计对象LoadBalancerStats,同事在具体的choose算法中利用LoadBalancerStats保存的实例统计信息来选择满足要求的实例。
PredicateBasedRule
该实例会先通过自雷中实现的Predicate逻辑来过滤一部分服务实例,然后在以现行轮询的方式从过滤厚的实例清单中选出一个
AvailabilityFilteringRule
该策略继承PredicateBasedRule,会使用AvailabilityPredicate来进行过滤
ZoneAvoidanceRule
该策略同样集成了PredicateBasedRule,但是是一个组合过滤以ZoneAvoidancePredicate过滤为主,AvailabilityPredicate为辅
自动化配置
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现
IRUlead:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最截取与的实例
Iping:Ribbon的实例检查策略,默认采用NoOpPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的
ServerList<Server> 服务实例清单过滤机制,默认采用ZonePreFernceServerListFilter实现,该策略能够优先过滤出与请求调用方处于同区域的服务实例
ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域感知的能力
示例:
如下面的配置内容,由于创建了PingUrl实例,所以默认的NoOpPing就不会被创建
@Configuration
public class MyRibbonConfiguration{
@Bean
public Iping ribbonPing(IClientConfig config){
return new PingUrl();
}
}
但其实Ribbon还有很多知识可以学习,比如是如何获取服务列表,如何选择哪个服务,选择的规则等等,这里就懒得写啦