Spring Cloud Ribbon
Spring Cloud Ribbon
1.负载均衡示例
新建三个项目,一个注册中心(A),一个提供服务的client(B),一个消费服务的client(C)。配置好并启动,B在不同端口启动多份。这样就有了一个注册中心A,服务提供client B集群,和一个消费服务client c。在c中获取B服务:
@RestController
public class UserController {
@Autowired
private LoadBalancerClient client;
@GetMapping("/log")
public String log() {
return "当前打印的节点:" +client.choose("provider").getInstanceId();
}
}
client.choose(“provider”)这个方法回去获取provider服务,启动项目访问/log请求,会打印当前请求的具体是哪个服务。测试发现发现 负载均衡 的实现方式是轮询的方式去请求服务。
2.修改负载均衡策略
方式一:代码配置
配置负载均衡规则为 随机, RibbonConfiguration不能被@ComponentScan扫描,否则全部都会应用这个规则:
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 配置负载均衡规则为 随机
return new RandomRule();
}
}
@RibbonClient设置为某一个服务启动指定的负载均衡策略:
@Configuration
// 指定provider服务使用RibbonConfiguration配置的策略(provider是服务名client.choose("provider"))
@RibbonClient(name = "provider", configuration=RibbonConfiguration.class)
public class TestConfiguration {
}
重启项目,访问/log,会发现此时访问的服务是随机的。
@SpringBooApplication配置了扫描这个类路径及其以下的所有组件。RibbonConfiguration 这个不应该被扫描(如果全部应用这个规则,就不需要@RibbonClient这个来指定哪个服务调用用哪个规则)。
方式二:配置方式
#provider是服务名
provider:
ribbon:
# 自定义规则
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
内置算法
RoundRobinRule: 轮询
RandomRule: 随机
AvailabilityFilteringRule: 过滤故障熔断跳闸状态的服务,并发连接的数量超过阈值的服务,剩下的轮询
WeightedResponseTimeRule: 根据平均响应时间计算权重,响应时间越快服务权重越大被选中的概率越高,权重信息不足(如刚启动时),采用轮询策略
RetryRule: 先采用轮询策略,如果获取服务失败则在指定时间内会进行重试,获取可用服务
BestAvailableRule: 过滤多次访问故障服务,访问并发量小的服务
ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器
3.在没有Eureka的情况下使用Ribbon
新建工程,提供服务,pom文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--打包执行,要加这个-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.yml中配置:
spring:
application:
name: common-service
就一个spring boot的web工程就可以了,创建好启动类,就打包,然后执行打包好 的jar包,使其分别运行在9000和9001端口。
新建工程,使用ribbon调用服务:
pom文件:
<dependencies>
<!--提供web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--导入ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
启动类:
@SpringBootApplication
public class ServiceConsumerApp {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApp.class, args);
}
}
调用服务:
@RestController
public class UserController {
@Autowired
private LoadBalancerClient client;
@GetMapping("/info")
public String getInfo() {
return client.choose("common-service").getInstanceId();
}
}
application.yml配置:
# 通过这种方式指定服务
common-service:
ribbon:
listOfServers: http://localhost:9000,localhost:9001
server:
port: 9000
启动项目 ,访问localhost:9000/info,就能发现服务是轮询调用的,也就是ribbon的负载均衡生效了。