前面的两篇博客已经讲解了Feign作为服务间的调用,但是Feign是集成、封装了Ribbonn这个组件而来的,让服务间的调用更方便,因此大多使用Feign,本篇让大家了解Ribbon的概念与调用
Ribbon是Netflix开发的一个负载均衡组件,它在服务体系中起着重要作用,Pivotal将其整合成为Spring Cloud Ribbon,与其他SpringCloud组件结合可以发挥出强大作用,它的负载策略有多种,默认轮询,可配置超时重试
说到负载均衡,Ribbon与Lvs、Nginx不一样,nginx是服务端负载均衡,Ribbon是客户端负载均衡,具体表现为客户端从注册中心拿到服务的所有实例,然后以负载均衡方式去调用服务,默认以轮询的方式去调用服务实例
实战思路:1.启用注册中心,2.创建服务提供者,服务提供者至少启动两个节点,3.创建服务消费者,以restTemplate的方式调用服务提供者,查看ribbon组件是否以负载均衡的方式调用服务提供者
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
server.port=9600
spring.application.name=provider-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的账户信息
eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/
@RestController
public class IndexController {
@GetMapping("/hello")
public String hello(String name , HttpServletRequest request){
//返回端口信息
return " From Port : " + request.getServerPort() + " , hello " + name;
}
}
服务提供者打包,定位到jar包目录,使用如下命令,启用两个节点,访问一下看看是否正常
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9600
java -jar provider-service-0.0.1-SNAPSHOT.jar --server.port=9601
两个服务提供者节点都正常
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
/**
* 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
server.port=9500
spring.application.name=ribbon-service
eureka.instance.prefer-ip-address=true
#配置eureka-server security的账户信息
eureka.client.serviceUrl.defaultZone=http://zy:zy123@localhost:10025/eureka/
@RestController
public class IndexController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/sayHello")
public String sayHello(String name){
String url = "http://provider-service/hello?name=" + name;
String result = restTemplate.getForObject(url , String.class);
return result;
}
}
OK,Ribbon默认使用轮询方式调用服务
下面说说怎么使用其他方式,也就是其他负载均衡策略调用服务和配置超时重试
ribbon有7种策略,随机、轮询、最小并发、响应时间加权等策略,其它自行百度
在项目中使用也很简单,定义一个config类,添加一个bean,指明使用什么策略,代码如下:
/**
* ribbon负载均衡配置
*/
@Configuration
public class RibbonLBConfig {
//使用随机策略
@Bean
public IRule ribbonRule(){
return new RandomRule();
}
}
超时与重试,只需在配置文件中配置
#请求处理的超时时间
ribbon:
# 同一实例最大重试次数,不包括首次调用
MaxAutoRetries: 1
# 重试其他实例的最大重试次数,不包括首次所选的server
MaxAutoRetriesNextServer: 2
# 是否所有操作都重试
OkToRetryOnAllOperations: false
# 是否所有操作都进行重试
ReadTimeout: 10000
ConnectTimeout: 10000
代码已上传至码云,源码,项目使用的版本信息如下: