Ribbon 和Fegin 都是客户端的负载均衡工具,经过简单的配置就能达到负载均衡。
目标:
1.创建服务消费者模块,加入Ribbon的相关支持,尝试调用服务消费者。
2.尝试Ribbon的负责均衡策略
3.创建服务消费者模块,加入Feign的相关支持,尝试调用服务消费者。
步骤:
1.1 创建Springboot消费者模块SpringbootConsumerRibbon,在pom 加入Ribbon 的支持。
<?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>
<groupId>org.example</groupId>
<artifactId>SpringbootConsumerRibbon</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 加入Rebbion的支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--hystrix 支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 配置获取远程服务对象RestTemplate 对象,并在对象上面配置负责均衡注解。
@Configuration
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
1.3 编写测试Controller ,在controller 中加入RestTemplate 对象,用对象尝试调用服务提供者。
@RestController
public class HelloController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/testRebbion")
public String sayHello(){
// String message = restTemplate.getForEntity("http://localhost:8001/providerHello",String.class).getBody();
String message = restTemplate.getForEntity("http://provider/providerHello",String.class).getBody();
return "From Consumer , "+message;
}
}
1.4 启动测试,在测试前本例已经启动了两个provider 和Eureka .
URL : http://localhost:7002/testRebbion
刷新 :
发现两个服务提供者会轮询访问.
1.5 配置随机负载均衡策略, 默认的是轮询负载均衡策略。
@Configuration
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean
public IRule myRule() {
// 随机策略
return new RandomRule();
}
}
1.6 重启模块测试,发现 访问provider1 和provider2 是随机的。
1.7 其他负责均衡策略说明:
RoundRibbonRule:轮询策略
RandomRule:随机策略
AvailabilityFilteringRule:可用的服务使用轮询策略,会抛弃不可用的服务。
WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应越快的服务权重越高,越容易被选中。一开始启动时,统计信息不足的情况下,使用轮询。
RetryRule:如果服务获取失败,就尝试重新尝试获取
BestAvailableRule:最优服务选择策略,会抛弃不可用服务
ZoneAvoidanceRule:区域和可用策略
2.1 创建Feign的springboot 模块 SpringbootConsumerFeign ,并在pom 中加入Feign 的支持。
<?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>
<groupId>org.example</groupId>
<artifactId>SpringbootConsumerFeign</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 加入Feign的支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--hystrix 支持 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 启动类中加入Feign 支持的注解.
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class ApplicationConsumerFeign {
public static void main(String[] args) {
SpringApplication.run(ApplicationConsumerFeign.class,args);
}
}
2.3 创建服务调用service 接口,并在service 上加上Feign 客户端注解,在接口方法中添加调用远程服务的注解。
@FeignClient( value = "provider")
public interface SayService {
@GetMapping("/providerHello")
public String providerHello();
}
2.4 写一个测试controller ,并在controller 注入service 接口。
@RestController
public class TestController {
@Autowired
SayService sayService;
@RequestMapping("/testFeign")
public String sayHello(){
// String message = restTemplate.getForEntity("http://provider/providerHello",String.class).getBody();
String response = sayService.providerHello();
return "From Consumer , " +response;
}
}
2.5 启动测试,刷新浏览器默认是轮询访问provider1 和provider2.
URL: http://localhost:7003/testFeign
2.6 配置Feign 的路由策略,在本例用把路由策略配置成随机访问。修改Application.properties 文件,加入配置。
server.port=7003
spring.application.name=consumer_feign
eureka.client.serviceUrl.defaultZone=http://eureka1:9001/eureka
#指定Feign的路由策略
provider.ribbon.NFLoadBalancerRuleClassName:com.netflix.loadbalancer.RandomRule
2.7 重新启动测试,刷新浏览器发现provider1和provider2 提供服务时随机的。
URL : http://localhost:7003/testFeign