Spring Cloud Ribbon是Spring Cloud生态系统中的一部分,是一套基于 Netflix Ribbon 实现的客户端负载均衡工具,由于Spring Cloud对其进行二次封装,可以将面向服务的Rest模板(RestTemplate)请求转换成客户端负载均衡的服务调用。且无需单独部署,只需要在项目中引入相关依赖,并在项目配置文件中进行相关配置后,便可以在客户端进行请求的负载均衡调用了。
Ribbon和Nginx都是常用的负载均衡解决方案,但它们各自有不同的特点和适用场景:
在使用Ribbon时,通常不需要手动配置太多的选项,因为Spring Cloud会提供一些默认的配置。如果需要对特定服务进行特殊配置,可以在该服务对应的bootstrap.yml或application.yml文件中覆盖默认配置。在YAML格式的配置文件中,配置项如下所示:
ribbon:
eureka:
enabled: true
listOfServers: myservice:8080
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
MaxTotalHttpConnectionsPerHost: 500
MaxHttpConnectionsPerServer: 200
ConnectTimeout: 5000
ReadTimeout: 10000
Spring Cloud Ribbon 提供了多种内置的负载均衡策略,以及支持自定义策略。以下是一些常用的内置负载均衡策略及其描述:
这些策略可以通过设置ribbon.NFLoadBalancerRuleClassName属性来指定,例如在application.yml文件中配置如下:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
Ribbon也允许开发者通过实现IRule接口来自定义负载均衡规则。自定义的策略可以通过实现自己的规则类,并在配置文件中指定该类的全路径来使用。下面是一个简单的自定义负载均衡规则的例子,这个规则会总是选择列表中第一个可用的服务实例:
public class MyCustomRule implements IRule {
@Override
public Server choose(Object key) {
// 获取可用的服务实例列表
Server server = null;
List<Server> servers = getServerList();
if (!servers.isEmpty()) {
// 选择列表中的第一个实例
server = servers.get(0);
}
return server;
}
private List<Server> getServerList() {
// 这里可以添加获取服务列表的逻辑,例如从Eureka获取
// 为了示例简单,这里直接返回空列表
return null;
}
}
接下来,你需要在Spring Boot的配置文件中指定这个自定义规则类。在application.yml中添加以下配置:
ribbon:
NFLoadBalancerRuleClassName: com.yourpackage.MyCustomRule
Ribbon的Ping机制是用来检测后端服务实例是否健康的一种机制。Ribbon通过定期发送Ping请求到服务实例上,来判断服务实例是否存活并且能够处理请求。如果Ping请求成功,则认为该服务实例是健康的;如果失败,则认为该实例是不健康的,并且在负载均衡时不会被选中。默认情况下,Ribbon 使用简单的 HTTP 请求(通常是 GET 请求到 / 路径)来检测服务实例。但是,这种方法可能不适用于所有的服务。在一些场景下,你可能需要执行更复杂的检查,这时开发者可以自定义Ping操作,通过继承DummyPing或实现IPing接口,并重写isAlive方法来实现,以确定服务实例是否能够接受请求。以下是一个自定义Ping操作的简单示例:
public class CustomPing implements IPing {
@Override
public boolean isAlive(Server server) {
String url = "http://" + server.getId() + "/healthCheck";
boolean isAlive;
HttpClient httpClient = new DefaultHttpClient();
HttpUriRequest request = new HttpGet(url);
try {
HttpResponse response = httpClient.execute(request);
isAlive = response.getStatusLine().getStatusCode() == 200;
} catch (Exception e) {
isAlive = false;
} finally {
request.abort();
}
return isAlive;
}
}
然后,需要在Spring Boot的配置文件中指定这个自定义的Ping实现类。在application.yml中添加以下配置:
ribbon:
NFLoadBalancerPingClassName: com.yourpackage.CustomPing
1.添加依赖
<!--Spring Cloud Ribbon 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!--Spring Cloud Eureka 客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.注入RestTemplate,通过@LoadBalanced注解开启负载均衡
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced //在客户端使用 RestTemplate 请求服务端时,开启负载均衡(Ribbon)
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.设置配置文件application.properties
server:
port: 80
# eureka配置
eureka:
client:
register-with-eureka: false # 本微服务为服务消费者,不需要将自己注册到服务注册中心
fetch-registry: true # 本微服务为服务消费者,需要到服务注册中心搜索服务
service-url:
defaultZone: http://eureka.com:8001/eureka/,http://eureka.com:8002/eureka/ #服务注册中心集群
4.接口调用
@GetMapping
public String getMessage(){
String url="http://test-service/message";
String message=restTemplate.getForObject(url,String.class);
return message;
}