Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像Eureka服务注册中心、spring cloud config配置中心、API网关(zuul)那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都是通过Ribbon来实现的,包括Feign(声明式rest调用),它也是基于Ribbon实现的工具。
Feign中实现ribbon的使用:
通过Spring Cloud Ribbon的封装,我们在微服务架构中使用客户端负载均衡调用非常简单,只需要如下两步:
▪️服务提供者只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。
▪️服务消费者直接通过调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用。
这样,我们就可以将服务提供者的高可用以及服务消费者的负载均衡调用一起实现了。
因为默认的springcloud中eureka server 是集成了ribbon的,在使用feign的时候是默认使用了eureka+ribbon的负载均衡。
ribbon可以是通过获取eureka中的注册服务获取listforservers,通过eureka实现的注册名称和端口地址的关联,实现不同服务器之间的负载均衡的。
联合eureka、feign实现ribbon的负载均衡
由于ribbon已经被spring-cloud-starter-netflix-eureka-server进行了集成:
由于这个是在client端进行的配置所以,如果client端配置了 spring-cloud-netflix-eureka-client 则还是需要单独进行ribbon的依赖导入。
导入依赖之后,就已经默认的实现了负载均衡了。前提条件是:有两个以上的feign端注册在了eureka上。
如果要修改默认的轮询 负载配置,需要在配置文件下修改:
spring:
application:
name: user
server:
port: 5100
eureka:
client:
service-url:
defaultZone: http://localhost:5001/eureka
feign:
hystrix:
enabled: true
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 这个意味着启动随机的负载模式
ribbon提供的负载模式:
WeightedResponseTimeRule :根据响应时间分配一个 weight,响应时间越长,
weight 越小,被选中的可能性越低。
➢ RoundRobinRule : roundRobin 方式轮询选择 server(默认)
➢ RandomRule :随机选择一个 server
➢ ZoneAvoidanceRule:复合判断 server 所在区域的性能和 server 的可用性选择
server
➢ RetryRule:对选定的负载均衡策略机上重试机制
➢ BestAvailableRule:选择一个最小的并发请求的 server
➢ AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为 circuit
tripped 的后端 server,并过滤掉那些高并发的的后端 server(active
connections 超过配置的阈值)
这样就实现了简单了ribbon的使用。
脱离eureka的ribbon实现
首先建立两个springboot项目最为provider端口,配置 简单的端口号就可以了。
重新创建一个springboot项目,作为client实现ribbon的负载均衡功能。配置简单的端口号之后需要做的是在配置文件中增加:
server.port=8083 端口号可以随便定
provide-without-eureka.ribbon.listOfServers=localhost:8081,localhost:8082 这个位置,由于没有了eureka提供的注册服务,需要自己手动配置代理的客户端口地址。
启动服务之后,就可以实现ribbon的负载均衡了。