Spring Cloud 微服务架构学习记录与示例

一、认识Ribbon

首先咱们需要认识下负载均衡,一般分为服务器端负载和客户端负载均衡。

  服务器端负载均衡:比如Nginx、F5,请求达到服务器后由负载均衡根据算法将请求转发到目标服务器进行处理。

  客户端负载均衡:比如Ribbon,服务消费者会获取一个服务器地址列表,调用前根据负载均衡的算法进行选择某个服务器,然后进行调用。

Ribbon是Netfix发布的负载均衡,Eureka一般配合Ribbon进行使用,Ribbon利用从Eureka注册中心中获取服务列表,根据一定的算法进行负载调用,还有Feign组件已使用Ribbon。

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略:

  • 简单轮询负载均衡
  • 加权响应时间负载均衡
  • 区域感知轮询负载均衡
  • 随机负载均衡

二、Ribbon应用

  1、要将Ribbon包含在您的项目中,请使用起始者,其组ID为org.springframework.cloud,工件ID为​​spring-cloud-starter-netflix-ribbon。需要注意的是在引入Eureka客户端之后就存在Ribbon依赖,不需要单独进行添加。检测依赖如下所示。

  2、Ribbon的使用需要在RestTemplate上添加对应注解@LoadBalanced即可

 /**
* 注⼊RestTemplate
* LoadBalanced开启ribbon
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}

  3、调用的时候即指定服务名称就行,不需要指定ip+端口,如下所示:

  4、修改负载均衡策略

#针对的被调⽤⽅微服务名称,不加就是全局⽣效
city-service-resume:
ribbon:
#负载策略调整
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

全局生效配置如下

ribbon:
#负载策略调整
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

三、Ribbon底层原理。

Ribbon主要实现逻辑是基于RestTemplates上添加了一个拦截器,进行拦截处理。

Spring Cloud 实现负载均衡通过在RestTemplates增加@LoadBalanced注解,将Rest请求交给Ribben去管理。

Ribben的配置类LoadBalanceAutoConfiguration主要实现的功能:

1、创建了一个LoadBalanceInterceptor的Bean,用于实现对客户端发起的请求就行拦,是实现客户端的负载均衡。

2、创建了一个LoadBalanceCustomizer的Bean  用于给RestTemplate增加LoadBalanceInterceptor拦截器。

3、维护了一个被@LoadBalance注释的RestTemplate的对象列表,并在这里进行初始化,通过调用LoadBalanceCustomizer的实例来给需要客户端负载均衡的TestTemplate增加LoadBalanceInterceptor拦截器。

4、LoadBalanceInterceptor拦截去会根据传入的ServiceID去获取具体的实例,拦截去实现的各个方法,

    addServices :向负载均衡器维护的列表中添加服务实例,添加服务的时候会将新加入的实例和之前的所有实例加入List中

     chooseServices:通过Rule(线性轮训、按权重负载、按流量负载)和 Ping来选择具体的服务实例启动的ping的定时任务默10秒

  markServiecsDowe:标示异常的服务实例

  getReachableService:获取当前正常的服务实例

    getAllServices:获取所有维护的服务实例

   5.Ribben 的服务实例由Eureka的服务发现来获取,Ribben会将Eureka中注册章的服务转换成自己的服务实例信息。(请求了Eureka的获取服务列表)

  6.Ribben 的服务更新器主要通过DynamicServiceListLoadBalancer 来实现

   7.Ribben实服务实例和真实地址之间转换的原理,从Netfix的service中获取host和port 如果service中的host和port中的地址和真实地中中的一直则直接返回真实地址,如果不一致则使用service中的host和port结合真实地址中的相关参数,拼接成新的地址。

*负载均衡的策略实现

资源整合部分来源:简书

SpringCloud之Ribbon负载均衡策略的更多相关文章

  1. springcloud(十四)、ribbon负载均衡策略应用案例

    一.eureka-server服务中心项目不再创建 二.eureka-common-empdept公共组件项目不再掩饰 三.创建eureka-client-provider-empdept-one提供 ...

  2. 浅谈SpringCloud (三) Ribbon负载均衡

    什么是负载均衡 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃.为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力. 我们 ...

  3. Ribbon负载均衡策略与自定义配置new

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  4. Ribbon负载均衡策略与自定义配置

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  5. spring-cloud配置ribbon负载均衡

    spring-cloud配置ribbon负载均衡 ribbon提供的负载均衡就是开箱即用的,简单的不能再简单了 为了顺利演示此demo,你需要如下 需要提前配置eureka服务端,具体看 https: ...

  6. SpringCloud之Ribbon负载均衡配置

    一.负载均衡解决方案分类及特征 业界主流的负载均衡解决方案有: 1.1 集中式负载均衡 即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责 ...

  7. Spring-cloud之Ribbon负载均衡的使用及负载均衡策略配置(与Eurka配合使用)

    什么是Ribbon,ribbon有什么用,个人先总结一下(不正确请提出讨论):Ribbon是基于客户端的负载均衡器,为我们提供了多样的负载均衡的方案,比如轮询,最小的并发请求的server,随机ser ...

  8. SpringCloud系列——Ribbon 负载均衡

    前言 Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制.我们在上篇(猛戳:SpringCloud系列——Feign 服务调用)已经实现了多个服务之间的Feign调用 ...

  9. Spring-Cloud之Ribbon负载均衡-3

    一.负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式.一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix .另一种是将负载均衡逻辑以代码的形式封装到服 ...

随机推荐

  1. 《C++ Primer》笔记 第13章 拷贝控制

    拷贝和移动构造函数定义了当用同类型的另一个对象初始化本对象时做什么.拷贝和移动赋值运算符定义了将一个对象赋予同类型的另一个对象时做什么.析构函数定义了当此类型对象销毁时做什么.我们称这些操作为拷贝控制 ...

  2. Hi3559AV100的VI细节处理说明

    因为项目后期涉及到MPP平台下的VI接口,现把有关视频输入VI模块的实现细节总结,也方便大家进一步了解. 1.整体概述 视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVD ...

  3. Apache配置 1. 默认虚拟主机

    编辑httpd.conf搜索httpd-vhosts,去掉#号 # vi /usr/local/apache2.4/conf/httpd.conf Include conf/extra/httpd-v ...

  4. Git常用命名

    文字整理: git config - - 可以配置git的参数,可以使用 git config --list查看已经配置的git参数. 其中有三个级别的保存位置, –system(本系统) –glob ...

  5. python之commands和subprocess入门介绍(可执行shell命令的模块)

    一.commands模块 1.介绍 当我们使用Python进行编码的时候,但是又想运行一些shell命令,去创建文件夹.移动文件等等操作时,我们可以使用一些Python库去执行shell命令. com ...

  6. LevelDB 源码解析之 Arena

    GitHub: https://github.com/storagezhang Emai: debugzhang@163.com 华为云社区: https://bbs.huaweicloud.com/ ...

  7. .net core 和 WPF 开发升讯威在线客服系统【私有化部署免费版】发布

    希望 .net 和 WPF 技术时至今日,还能有一些存在感. 这个项目源于2015年前后,当时开发的初版,我使用了 ASP.NET MVC 做为后端,数据库使用原生 ADO.NET 进行操作.WPF ...

  8. java例题_15 有小到大排序

    1 /*15 [程序 15 排序] 2 题目:输入三个整数 x,y,z,请把这三个数由小到大输出. 3 程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x>y 则将 ...

  9. Java学习之数组的简单用法

    •概念 其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作. 数组本身属于引用数据类型,那么既然是引用数据类型,这里面实际又会牵扯到内存分配: 而数组的定义语法有两种 ...

  10. macbook/macOS下打开多个相同应用(应用多开)

    1.部分应用可使用common+n快捷键.如qq:打开qq主界面后使用common+n即可新起一个qq程序. 2.在终端使用命令 open -n +程序路径.如启动多个qq :  open -n /A ...