Ribbon实现客户端负载均衡
Ribbon与Eureka配合使用,Ribbon从Eureka Server获取服务提供者列表,基于某种负载均衡算法,请求其中一个服务提供者的实例。
复制micro-service-consumer工程,改名为micro-service-consumer-ribbon,由于eureka中已经包含了ribbon的依赖,因此不需要添加新的依赖。
需要注意的是,启动类配置RestTemplate需要加上@LoadBalanced注解。
@SpringBootApplication
@EnableEurekaClient
public class MicroServiceConsumerRibbonApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroServiceConsumerRibbonApplication.class, args);
}
}
修改Controller层代码:
logUserInstance方法,loadBalancerClient使用choose()方法获取当前选择的微服务节点,多次请求该方法,查看控制台打印的日志。
Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/log-instance")
public void logUserInstance() {
ServiceInstance serviceInstance = this.loadBalancerClient.choose("micro-service-provider");
System.out.println(serviceInstance.getServiceId()+","+serviceInstance.getHost()+","+serviceInstance.getPort());
}
Java代码自定义Ribbon配置
创建Ribbon的配置类: 修改Ribbon的负载均衡规则。
/**
* Description: Ribbon配置类
* 注意:该类不应该在主应用程序上下文的@ComponentScan中
* Author:
* Date:2019/1/23
*/
@Configuration
public class RibbonCustomConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则改为随机
return new RandomRule();
}
}
使用@RibbonClient为特定name的Ribbon Client自定义配置。
/**
* Description: 使用Java代码自定义Ribbon配置
* Author:
* Date:2019/1/24
*/
@Configuration
@RibbonClient(name="micro-service-provider", configuration=RibbonCustomConfiguration.class)
public class TestConfiguration {
}
以上的配置RibbonCustomConfiguration 不在主应用程序上下文的@ComponentScan中,若在的话则该配置会被所有的@RibbonClient共享,代码结构如下图所示。
RibbonCustomConfiguration在主应用程序上下文的@ComponentScan中的情况:
项目的结构如下图所示:
创建ExcludeFromComponentScan自定义注解:
/**
* Description: 自定义注解
* 若 RibbonCustomConfiguration在com.fanfan.cloud路径下则需要这个注解,
* 以及启动类的@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class)})
* Author:
* Date:2019/1/25
*/
public @interface ExcludeFromComponentScan {
}
RibbonCustomConfiguration配置类:
/**
* Description: Ribbon配置类
* 方式二:
* 注意:该类若在主应用程序上下文的@ComponentScan中,则需要@ExcludeFromComponentScan注解
* 使用Java代码自定义Ribbon配置
* Author:
* Date:2019/1/23
*/
@Configuration
@ExcludeFromComponentScan
public class RibbonCustomConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则改为随机
return new RandomRule();
}
}
启动类:
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name="micro-service-provider", configuration= RibbonCustomConfiguration.class)
// 指定ComponetScan Exclude的路径,只作用于一个RibbonClient
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class)})
public class MicroServiceConsumerRibbonCustomApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroServiceConsumerRibbonCustomApplication.class, args);
}
}
使用属性自定义Ribbon配置
在application.yml中添加如下的配置即可。
# 使用属性自定义Ribbon配置
microservice-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RamdomRule
以上是使用Java配置类和配置文件的方式实现负载均衡。
脱离Eureka使用Ribbon
创建micro-service-consumer-ribbon-without-eureka,pom文件如下:注意直接使用ribbon的依赖而不是eureka的依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>micro-service-consumer-ribbon-without-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 引入parent的依赖 -->
<parent>
<groupId>com.fanfan.cloud</groupId>
<artifactId>micro-service-spring-cloud-study</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<finalName>consumer-ribbon-without-eureka</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml文件如下:
server:
port: 7903
spring:
application:
name: cunsumer-ribbon-custom
micro-service-provider:
ribbon:
listOfServers: localhost:8010,localhost:8011
启动类上去掉@EnableEurekaClient注解:
@SpringBootApplication
public class MicroServiceConsumerRibbonWithoutEurekaApplication {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(MicroServiceConsumerRibbonWithoutEurekaApplication.class, args);
}
}
不过一般很少有这样使用的,了解即可。