springcloud ----ribbon

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

ribbon配置:

 因为ribbon是客户端的负载均衡工具,所以是在服务消费者这一方配置

1 pom文件依赖

<!-- Ribbon相关 -->
		<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>

ribbon需要与eureka整合,不与eureka整合,怎么知道那个eureka实例负载均衡小呢。

2 配置文件配置 追加eureka服务注册地址,将微服务作为注册到eureka中,也别忘了在启动类上架@EnableEurekaClient,标志eureka客户端

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请求服务端暴露的地址,想要在客户端实现负载均衡,需要在restTemplate的bean创建上加@LoadBalanced注解,表示开启负载均衡

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

最后就可以测试了,之前在客户端的controller中,访问服务端的地址是写死为http://localhost:8001的,就是直接访问客户端的,现在改为http://MICROSERVICECLOUD-DEPT,直接通过服务名来访问。现在的访问路径变成了,客户端发起请求,请求到达eureka服务中心,服务中心通过请求路径中的服务名,转发给对应服务的某个实例,因为这里启动了三个eureka中心。至此,ribbon简单配置成功

然后 有创建了2个微服务提供者,把eureka集群启动(三个eureka实例),把三个微服务提供者启动,每个都注册到这个三个eureka实例中,最后把微服务消费者启动,就可以测试真正的负载均衡了。前面因为只有一个微服务提供者,无论怎么负载均衡都是在同一个提供者上面。现在启动了三个微服务提供者,就可以看到真正的负载均衡的效果了。

ribbon的负载均衡算法

   ribbon默认的负载均衡算法是轮训算法,即所有的微服务提供者轮流来处理请求。

   springcloud中的ribbon默认提供7中负载均衡算法,如下

 

 那么如何切换这些算法呢,很简单,在客户端的配置类里面,定义想要使用的算法的bean即可,这个定义的bean会覆盖默认的轮训算法

如下 创建这样一个bean之后,ribbon就会使用随机算法

客制化负载均衡算法,为某个微服务单独定义不同的算法

首先,在客户端主启动类上添加@Ribbon注解

@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MyRule.class)

需要注意的是这个自定义的负载均衡算法类不能放在@ComponentScan所扫描的包及子包下,否则的话就会被所有Ribbon客户端共享,就不是name属性中配置的这一个微服务使用这一中算法了,所有的微服务都会使用该算法

MyRule类如下

@Configuration
public class MyRule {
	@Bean()
	public IRule myRule() {
		return new RandomRule();
	}

}

另外,ribbon还可以自定义负载均衡算法,只需将使用的负载均衡的bean换成自己定义的就行,自己定义的rule类只需实现AbstractLoadBalancerRule类,就可自定义负载均衡算法

猜你喜欢

转载自blog.csdn.net/zgq_hw/article/details/84445466