1.基本概念

1.1.为什么要Ribbon

为了预防单节点故障就需要对应用做集群,做集群之后会出现同一个服务有不同的通信地址,调用该服务时就需要一个组件对帮我们做请求的分发--负载均衡器,ribbon就是其中一个。

1.2.什么是Ribbon

Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,Ribbon可以按照负载均衡算法(如简单轮询,随机连接等)向多个服务发起调用(正好可以解决上面的问题),我们也很容易使用Ribbon实现自定义的负载均衡算法。

1.3.Ribbon的工作机制

我们将user-server(用户服务)做集群处理,增加到2个节点(注意:两个user-server(用户服务)的服务名要一样,ip和端口不一样),在注册中心的服务通信地址清单中user-server(用户服务)这个服务下面会挂载两个通信地址 。 order-server(订单服务)会定时把服务通信地址清单拉取到本地进行缓存, 那么当order-server(订单服务)在向user-server(用户服务)发起调用时,需要指定服务名为 user-server(用户服务);那么这个时候,ribbon会根据user-server(用户服务)这个服务名找到两个order-server的通信地址 , 然后ribbon会按照负载均衡算法(默认轮询)选择其中的某一个通信地址,发起http请求实现服务的调用。

2. ribbon使用

1. 提供者User-server做集群

       1.1  拷贝项目 修改配置yml 中的 端口 和 id

2. 消费者Order-server集成Ribbon

        1.1 导入依赖

org.springframework.cloud

spring-cloud-starter-netflix-ribbon

        1.2 开启负载均衡

                修改RestTemplate的Bean的定义方法,加上Ribbon的负载均衡注解@LoadBalanced赋予RestTemplate有负债均衡的能力。

/**

* 订单的启动类

*/

@SpringBootApplication

@EnableEurekaClient

public class OrderServerApplication1030

{

//配置一个RestTemplate ,Spring封装的一个机遇Restful风格的http客户端 工具

//@LoadBalanced :让RestTemplate有负载均衡的功能

@Bean

@LoadBalanced

public RestTemplate restTemplate(){

return new RestTemplate();

}

//省略...

1.3.修改Controller调用方式

@RestController

public class OrderController {

@Autowired

private RestTemplate restTemplate;

@GetMapping("/order/{id}")

public User getUserById(@PathVariable("id") Long id){

// return restTemplate.getForObject("http://localhost:10020/user/"+id,User.class);

return restTemplate.getForObject("http://USER-SERVER/user/"+id,User.class);

}

}

3. 负载均衡算法

Ribbon内置算法

内置负载均衡规则类规则描述RoundRobinRule(默认)简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。AvailabilityFilteringRule    对以下两种服务器进行忽略:(1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。可以通过修改配置loadbalancer..connectionFailureCountThreshold来修改连接失败多少次之后被设置为短路状态。默认是3次。(2)并发数过高的服务器。并发连接数的上线,可以由客户端的..ActiveConnectionsLimit属性进行配置。WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。BestAvailableRule忽略哪些短路的服务器,并选择并发数较低的服务器。RandomRule随机选择一个可用的服务器。Retry重试机制的选择逻辑

4.配置负载均衡算法

Ribbon可以进行全局负载均衡算法配置,也可以针对于具体的服务做不同的算法配置。同时可以使用注解方式和yml配置方式来实现上面两种情况。

1.注解全局配置

@SpringBootApplication

public class OrderApplication {

public static void main(String[] args) {

SpringApplication.run(OrderApplication.class);

}

@Bean

@LoadBalanced // 配置负载均衡

public RestTemplate restTemplate() {

return new RestTemplate();

}

// 配置负载均衡算法

@Bean

public RandomRule randomRule(){

return new RandomRule();

}

}

2.yml方式配置负载均衡算法

配置全局Ribbon算法

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

配置某个服务的Ribbon算法

user-server:

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.Ribbon调优配置

1.超时配置

ribbon:

ReadTimeout: 3000 #读取超时时间

ConnectTimeout: 3000 #链接超时时间

MaxAutoRetries: 1 #重试机制:同一台实例最大重试次数

MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数

OkToRetryOnAllOperations: false #是否所有操作都重试,因为针对post请求如果没做幂等处理可能会造成数据多次添加/修改

2.饥饿加载

ribbon:

eager-load:

enabled: true #开启饥饿加载

clients: user-server #针对于哪些服务需要饥饿加载

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: