Ribbon客户端负载均衡

Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具

Ribbon初步配置
1、在服务消费者(客户端)pom文件中引入Ribbon依赖,这里的客户端要与Eureka Client却别开,Eureka Client实际上是服务的提供者,相对于消费者而言是服务端。Ribbon与Eureka相关,所以需要将Eureka Client的依赖添加

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>

2、在消费者端配置访问Eureka Server的配置

eureka:
  client: 
    register-with-eureka: false
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

3、在消费者端配置客户端负载均衡,之前采用的是RestTemplate直接访问服务提供者,现在消费者通过Eureka Server访问服务提供者。首先注入RestTemplate时加入@LoadBalanced注解

	@Bean("restTemplate")
	@LoadBalanced
	public RestTemplate getRestTemplate() {
		
		return new RestTemplate();
	}

访问地址通过微服务名来访问

	//private static final String REST_URL_PREFIX = "http://localhost:8001";
	private static final String REST_URL_PREFIX = "http://microservicecloud-dept";

4、在消费者主启动类中添加@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_app {

	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer80_app.class, args);
	}
}

Ribbon和Eureka整合之后Consumer可以直接掉用服务而不用再关心地址和端口号。

在这里插入图片描述

创建多个服务提供者,工程目录如下:
在这里插入图片描述

设置各自的配置信息,列举8002的配置信息。其中端口,数据库,以及Eureka Server界面展示名设置不同,但是服务名必须一致(spring.application. name= microservicecloud-dept)

server:
  port: 8002
 
mybatis:
  #mybatis配置文件
  config-location: classpath:mybatis/mybatis-cfg.xml
  type-aliases-package: com.yangguiyong.springcloud.entities
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml
  
spring:
  application:
    name: microservicecloud-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloudDB02
    username: root
    password: root
    dbcp2:
      min-idle: 5
      initial-size: 5
      max-total: 5
      max-wait-millis: 200
      
eureka:
  client: 
    service-url: 
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: microservicecloud-dept8002
    prefer-ip-address: true
    
info: 
  app.name: microserviceclod
  app.company: cmzy
  build.artifactId: $project.artifactId$
  build.version: $project.version$

在这里插入图片描述

Ribbon其实就是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和eureka结合只是其中的一个实例。
在这里插入图片描述

Ribbon在工作时分为两步:
第一步选择EurekaServer,它优先现则在同一个区域内负载较少的server
第二步根据用户指定的策略,再从Server取到的服务注册列表中选择一个地址
其中Ribbon提供了多种策略,如轮询、随机和根据相应时间加权,默认是轮询。

Ribbon源码地址https://github.com/Netflix/ribbon
Ribbon核心组件IRule,是客户端策略的接口,其具体实现就是相应的策略。
在这里插入图片描述
Ribbon默认提供以下几种负载策略:

  • RoundRobinRule:轮询,默认。
  • RandomRule:随机
  • AvailabilityFilteringRule:会先过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阈值的服务,然后对剩余的服务列表按照轮询进行访问
  • WeightedResponseTimeRule:根据平均相应时间计算所有服务的权重,相应时间越快服务权重越大,被选中的概率越高。刚启动时如果统计不足,则使用轮询策略,等统计信息足够,会切换到WeightedResponseTimeRule。
  • RetryRule:先按照轮询策略获取服务,如果获取服务失败则在指定时间内进行重试,指定时间过后还是还是获取服务失败则会直接获取可用的服务,不在获取失败的服务。
  • BestAvailableRule:会县过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择服务器

改变默认策略,只需要在消费者端,也就是客户端中注入新的IRule实现类到Spring容器中。

	@Bean
	public IRule getRule() {
		return new RandomRule();
	}

所以实现IRule类可以自定义负载策略。注意,如果使用自定义的策略,在消费者主启动类中引入注解

@RibbonClient(name = "microservicecloud-dept",configuration = MyRuleConfiguration.class),表示对microservicecloud-dept这个服务采用自定义的负载策略
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "microservicecloud-dept",configuration = MyRuleConfiguration.class)
public class DeptConsumer80_app {

	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer80_app.class, args);
	}
}

在这里插入图片描述
自定义策略不能和@ComponentScan注解扫描的包在同一包或其子包下,否则不能加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值