springcloud ribbon是一个基于HTTP和TCP的客户端工具,是在Netflix Ribbon的基础上通过springcloud的封装,就可以让我们轻松的将面向服务的REST模板请求自动转化为客户端的负载均衡的服务调用,提供了连接超时、重试、等功能。ribbon虽然不向服务注册中心、配置中心、服务网关那些需要独立部署,但是针对springcloud搭建的微服务而言,服务之间的相互调用是都是通过ribbon来实现的,后续的Feign和Open Feign虽然功能是都是一样的,但是后面两者的功能都是在前者的基础上进行构建的,因此掌握ribbon还是十分有必要的。
负载均衡
负载均衡从软硬件的角度可以分为硬负载与软负载,然后从负载执行角度又分为客户端负载均衡与服务端负载均衡。硬负载就是直接在服务器和外部网络间安装负载均衡硬件设备,这种设备我们通常称之为负载均衡器。由专门的设备完成,独立于操作系统,整体性能得到大量提高,加上更多的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。 一般来说,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵,很常见的有 F5负载均衡器;软负载就是使用软件来做负载均衡,在服务器的操作系统上,安装软件,来实现负载均衡,如Nginx负载均衡。它的优点是基于特定环境、配置简单、使用灵活、成本低廉,可以满足大部分的负载均衡需求,我们常用的软负载有nginx,lvs,haproxy等等。
1、服务端负载均衡
服务端负载均衡,其实就像f5,nginx这样,当用户发起请求到服务端的时候,我们使用这些负载均衡器根据一定的负载均衡算法,然后将请求路由到目标服务器处理。
2、客户端负载均衡
所谓的客户端负载均衡,就像Ribbon一样,其实还有很多的rpc框架里面的负载均衡都是客户端负载均衡。这个客户端负载均衡一般用在微服务中或者是SOA中,主要是服务调用服务的时候,服务调用者会根据服务提供者列表中选择出合适的一个,然后服务调用者拿着选出来的服务提供者信息去调用。
负载均衡策略
1、RoundRobinRule(轮循策略)默认是超过一定的次数(10次)不可用就返回空,就是你这次请求,它帮你选出来一个实例,然后不可用,它会再帮你选一个,还不可用的话,就帮你再选一个,就这样选10次
2、RoundomRule(随机策略)取不到实例的情况下,会一直帮你选择直到选出可用的实例
3、RetryRule(重试策略)一定时限内循环重试。默认继承RoundRobinRule,也支持自定义 注入,RetryRule会在每次选取之后,对选举的server进行判断, 是否为null,是否alive,并且在500ms内会不停的选取判断。而 RoundRobinRule失效的策略是超过10次,RandomRule是没有失 效时间的概念,只要serverList没都挂。
4、BestAvailableRule(最小连接数策略)其实就是从服务列表中获取连接数最少的那个实例,算 法里面有一个LoadBalancerStats的成员变量,会存储所有server 的运行状况和连接数,如果选取的实例是null的话,就会使用RoundRobinRule算法帮你选取.
5、AvailabilityFilteringRule(可用过滤策略)先通过轮询出来一个实例,然后再去判断是否超时可用,连接数是否超出限制,然后都符合的会返回。
6、ZoneAvoidanceRule(区域权衡策略) 这是个默认策略,扩展了轮询策略,继承了2个过滤器:ZoneAvoidancePredicate和 AvailabilityPredicate,除了过滤超时和链接数过多的server,还会 过滤掉不符合要求的zone区域里面的所有节点,AWS --ZONE 在一个区域/机房内的服务实例中轮询。
实战案例
1、maven 配置
<properties><java.version>1.8</java.version><spring-cloud.version>2020.0.3</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
2、在springcloud_eureka_client01工程中创建一个api
@RestController
public class Test {@GetMapping("/getUser")public User getUser() {User user = new User();user.setName("zhangsan");user.setAge("12");return user;}
}
3、在springcloud_eureka_client02工程中访问服务
3.1、主启动类中添加@EnableDiscoveryClient注解
3.2、主启动类或者配置类中负载均衡对象
@Bean@LoadBalancedpublic RestTemplate getTestTemplate() {return new RestTemplate();}
3.3、服务调用
@RestController
public class controller {/**eureka-client01为微服务的名称**/private static final String REST_URL_PREFIX = "http://eureka-client01";@Autowiredprivate RestTemplate restTemplate;/**调用其他微服务的接口**/@RequestMapping("/hello")public Object hello() {return restTemplate.getForObject(REST_URL_PREFIX+ "/getUser", Object.class);}
}
3.4、访问
localhost:9002/hello