简介
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
ribbon 提供了负载均衡和重试功能, 它底层是使用 RestTemplate 进行 Rest api 调用
远程调用
之前有说过远程调用使用httpclient是万能的,但是其步骤很多代码繁琐冗余,所以Springboot提供了一个远程调用工具 RestTemplate
- getForObject(url, 类型.class, 提交的数据)
- postForObject(url,提交的数据,类型.class)
RestTemplate不仅封装简化了httpclient代码,还使其返回的json类型的数据可以转化为指定的对象类型
入门案例
- 创建
RestTemplate
实例
RestTemplate
是用来调用其他微服务的工具类,封装了远程调用代码,提供了一组用于远程调用的模板方法,例如:getForObject()
、postForObject()
等
@SpringBootApplication
public class Sp06RibbonApplication {
//创建 RestTemplate 实例,并存入 spring 容器
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
}
在controller中注入RestTemplate,再通过getForObject()
、postForObject()
进行远程调用即可.
ribbon负载均衡及重试功能
对 RestTemplate 添加 @LoadBalanced 注解,增强其功能,实现负载均衡
1.从注册中心获得地址表
2.调用地址使用服务id: http://service/{1}
3.根据服务id,获得这个服务集群服务器地址列表
4.在集群地址列表中轮询调用
负载均衡
实现负载均衡共有三步:
1.添加 ribbon 依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
2.@LoadBalanced 注解
RestTemplate 设置 @LoadBalanced
@LoadBalanced
负载均衡注解,会对 RestTemplate
实例进行封装,创建动态代理对象,并切入(AOP)负载均衡代码,把请求分发到集群中的服务器
@SpringBootApplication
public class Sp06RibbonApplication {
@LoadBalanced //负载均衡注解
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
}
3.调用地址使用服务id
将访问路径中的路径地址都换为服务id--提供者yml中配置的application-name,也就是注册表中注册的id
重试
ribbon提供的一种容错方式
当调用后台服务出错(出异常,请求超时),可以自动进行重试调用
实现重试共两步:
1.添加 spring-retry 依赖
pom.xml 添加 spring-retry 依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
2.配置重试参数
- MaxAutoRetries - 单台服务器的重试次数
- MaxAutoRetriesNextServer - 更换服务器的次数
- OkToRetryOnAllOperations - 默认false,只对GET请求重试
spring:
application:
name: ribbon
server:
port: 3001
eureka:
client:
service-url:
defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka
ribbon:
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
OkToRetryOnAllOperations: false
Java代码中设置超时参数
- ConnectTimeout - 建立连接超时
- ReadTimeout - 等待响应超时
@SpringBootApplication
public class Sp06RibbonApplication {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate() {
SimpleClientHttpRequestFactory f = new SimpleClientHttpRequestFactory();
f.setConnectTimeout(1000);
f.setReadTimeout(1000);
return new RestTemplate(f);
//RestTemplate 中默认的 Factory 实例中,两个超时属性默认是 -1,
//未启用超时,也不会触发重试
//return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Sp06RibbonApplication.class, args);
}
}
可以在service(服务的提供者)中的Controller添加延迟代码,以便测试 ribbon 的重试机制
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。