文章目录
前言
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、什么是Ribbon?
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法。Ribbon客户端组件提供一系列完善的配置项,如,连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,Ribbon可以按照负载均衡算法(如简单轮询,随机连接等)向多个服务发起调用(正好可以解决上面的问题),我们也很容易使用Ribbon实现自定义的负载均衡算法。
二、为什么要Ribbon
我们知道,为了防止应用出现单节点故障问题,同时为了提高应用的作业能力,我们需要对应用做集群 ,如果我们对user-server(用户服务)做了集群 ,那么这个时候回衍生出一些问题:现在有两个user-server(用户服务)就意味着有两个user-server(用户服务)的通信地址,我的order-server(订单服务)在向user-server(用户服务)发起调用的时候该访问哪个?如何访问?这个时候就需要有一个组件帮我们做请求的分发,即:负载均衡器,而Ribbon就是一个 - 客户端负载均衡器。
三、Ribbon的工作机制
我们将user-server(用户服务)做集群处理,增加到2个节点(注意:两个user-server(用户服务)的服务名要一样,ip和端口不一样),在注册中心的服务通信地址清单中user-server(用户服务)这个服务下面会挂载两个通信地址 。 order-server(订单服务)会定时把服务通信地址清单拉取到本地进行缓存, 那么当order-server(订单服务)在向user-server(用户服务)发起调用时,需要指定服务名为 user-server(用户服务);那么这个时候,ribbon会根据user-server(用户服务)这个服务名找到两个order-server的通信地址 , 然后ribbon会按照负载均衡算法(默认轮询)选择其中的某一个通信地址,发起http请求实现服务的调用,如下图:
代码如下(示例):
![在这里插入图片描述](https://img-blog.csdnimg.cn/eee8954d1bd84fb793aa47f8bc3e2b50.png
四、代码实操
1.提供者user-server(用户服务)集群
1.1 服务集群方案
使用SpringBoot多环境配置方式集群,一个配置文件配置多个order-server环境 ,需要注意的是集群中的多个服务名(spring.application.name)应该一样,我们把相同的东西提取到最上面,不同的东西配置在各自的环境中
1.2 用户服务集群配置
- 设置idea中的,版本不一样位置不一样,请百度
- 修改application.yml配置中的端口和实例ID,分别启动两个或多个user客户端
2.Controller接口
代码如下(示例):
@RestController
public class UserConroller {
@Value("${server.port}") // 获取yml中配置的端口号,区分同一个业务的不同服务
private Long port;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id){
return new User(id,"张飞","端口号:"+port);
}
}
3.消费者Order-server集成Ribbon
Ribbon集成官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.SR5/multi/multi_spring-cloud-ribbon.html#netflix-ribbon-starter
3.1 在Order-server模块中,导入Ribbon依赖
代码如下(示例):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
3.2 开启负载均衡
修改RestTemplate的Bean的定义方法,加上Ribbon的负载均衡注解@LoadBalanced赋予RestTemplate有负债均衡的能力。
@SpringBootApplication
public class OrderServiceApp{
public static void main( String[] args )
{
SpringApplication.run(OrderServiceApp.class, args);
}
// 声明一个RestTemplate交给spring去管理
// @LoadBalanced 赋予RestTemplate有负债均衡的能力
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
3.3 Controller调用方式
把 “地址:端口号” 修改为 用户服务的服务名 。底层会通过服务发现的方式使用Ribbin进行负载均衡调用。
@RestController
public class OrderController {
@Autowired
private RestTemplate template; // 注入RestTemplate
@GetMapping("/order/{id}")
public User getUser(@PathVariable("id") Long id) {
// http://USERSERVICE/user/1 USERSERVICE为调用的服务名
User user = template.getForObject("http://USERSERVICE/user/" + id, User.class);
return user;
}
}
4 负载均衡算法
4.1 Ribbon内置算法
1,轮询 com.netflix.loadbalancer.RoundRobinRule
2,随机 com.netflix.loadbalancer.RandomRule
3,重试 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务 com.netflix.loadbalancer.RetryRule
4,对RoundRobinRule的扩展,响应速度越快的实例选择权重越多大,越容易被选择 WeightedResponseTimeRule
5,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务 BestAvailableRule
6,先过滤掉故障实例,再选择并发较小的实例 AvailabilityFilteringRule
7,默认规则,复合判断server所在区域的性能和server的可用性选择服务器ZoneAvoidanceRule
4.2 配置负载均衡算法
Ribbon可以进行全局负载均衡算法配置,也可以针对于具体的服务做不同的算法配置。同时可以使用注解方式和yml配置方式来实现上面两种情况。
4.2.1 注解全局配置
在启动类中,需要将RandomRule配置成Bean即可
//负载均衡算法
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
4.2.2 .yml方式配置负载均衡算法
配置全局Ribbon算法
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
配置某个服务的Ribbon算法
user-server:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
注意:项目中根据实际需求进行配置
总结
对Ribbon客户端负载均衡的学习,总结基本概念和使用