ribbon

微信扫一扫,分享到朋友圈

ribbon

简介

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 的重试机制

中国恒大:网上流传有关我公司重组情况的谣言

上一篇

安卓11新机谷歌Pixel 4a 5G曝光:骁龙765G+塑料机身 要卖3400

下一篇

你也可能喜欢

ribbon

长按储存图像,分享给朋友