【Spring Cloud】Nacos服务分级存储模型与负载均衡原理与实战

news2024/9/23 8:26:32

本期目录

  • 1. 服务分级模型介绍
  • 2. 服务分级模型的必要性
  • 3. 配置集群属性
  • 4. NacosRule负载均衡
    • 4.1 背景描述
    • 4.2 配置Nacos负载均衡策略
    • 4.3 根据权重负载均衡



1. 服务分级模型介绍

image-20221123164407092

  • 为了提升整个系统的容灾性,Nacos 引入了地域 (Zone) 的概念,如上图中的北京、上海和杭州。把同一个服务的多个实例部署到不同地域的机房中 (鸡蛋分开不同的篮子放) ;又把在同一个地域的机房的多个服务实例称为集群 (Cluster) 。比如,杭州机房的 2 个用户服务 user-service 称为杭州 user-service 集群。
  • 因此,在 Nacos 的服务分级模型中,
    • 第一级是微服务 (如订单服务) ;
    • 第二级是集群 (如北京订单服务集群、上海订单服务集群等) ;
    • 第三集是实例 (如杭州服务集群的 8081 端口实例、8082 端口实例等) 。

2. 服务分级模型的必要性

  • 微服务之间的远程调用要优先调用同一个地域的集群中的实例,因为访问同一个集群中的服务距离较短、速度比较快、延迟比较低 (例如北京集群的订单服务调用北京集群的用户服务) 。而跨地域集群地域距离远、速度慢、延迟高 (例如北京集群的订单服务调用上海集群的用户服务) 。

  • 那为什么 Nacos 还要增加一层【集群】的概念呢?

  • 首先就是为了避免跨地域集群的远程调用发生,让微服务之间的远程调用尽可能地发生在同一个地域集群中,保证访问的高速低延迟。其次就是为了当同地域的集群服务不可用时,可以跨地域集群访问,保证服务的高可用,提升系统的容灾能力。

    image-20221218171235828


3. 配置集群属性

  • 首先介绍一下项目微服务结构。微服务层有 2 个,分别是订单微服务 order-service 和用户微服务 user-service ,订单微服务需要远程调用用户微服务;集群层目前没有,是本节我们要构建的;实例层,订单微服务有 1 个实例,而用户微服务有 3 个实例。

    image-20221218172539831

  • 我们把 UserApplication 实例和 UserApplication2 实例设置为青岛 (QD) 机房;把 UserApplication3 设置为北京 (BJ) 机房。来模拟跨集群部署的方式。

  • 修改用户微服务 user-serviceapplication.yml 配置文件,添加以下内容。

    spring: 
      # Nacos配置
      cloud:
        nacos:
          server-addr: 192.168.168.101:8848 # Nacos服务地址
          discovery:
            cluster-name: QD # 地域集群层名称,可自定义,QD代指青岛
    

    设置好青岛集群后,注意,只选择 UserApplication 实例和 UserApplication2 实例启动。

    image-20221218173241797

  • UserApplication 实例和 UserApplication2 实例启动完成后,再回去用户微服务 user-serviceapplication.yml 配置文件,把地域集群名称由 QD 改为 BJ

    spring: 
      # Nacos配置
      cloud:
        nacos:
          server-addr: 192.168.168.101:8848 # Nacos服务地址
          discovery:
            cluster-name: BJ # 地域集群层名称,可自定义,BJ代指北京
    

    设置好北京集群后,注意,只选择 UserApplication3 实例启动。

    image-20221218173608268

  • 此时,打开 Nacos 控制台主页,可以看到用户服务 userservice 【集群数目】已经变为 2 了。

    image-20221218173836825

  • 点进【详情】查看。可以看到分为了 QDBJ 两个集群,QD 集群下有 2 个用户微服务实例;而 BJ 集群下有 1 个用户微服务实例。说明 Nacos 服务分级模型配置成功。

    image-20221218174010850


4. NacosRule负载均衡


4.1 背景描述

  • 上节我们给用户微服务 user-service 配置了青岛和北京 2 个集群。我们说过,Nacos 增加【集群】这一层是为了确保微服务间远程调用尽可能地在同一地域的集群中发生,避免跨集群的远程调用。这一节我们来做个实验,让用户微服务 user-service 作为服务提供者,而订单微服务 order-service 作为服务消费者,修改订单微服务 order-serviceapplication.yml 配置文件,分别配置青岛和北京 2 个集群名称,验证是否能按照【就近原则】优先调用同一个集群的微服务。

  • 打开订单微服务 order-serviceapplication.yml 配置文件,加入以下内容,先配置为青岛集群。

    spring: 
      # Nacos配置
      cloud:
        nacos:
          server-addr: 192.168.168.101:8848 # Nacos服务地址
          discovery:
            cluster-name: QD # 地域集群层名称,可自定义,QD代指青岛
    
  • 然后,启动订单微服务 OrderApplication

    image-20221218181201337

  • 启动完成后,进入 Nacos 控制台主页,看到订单微服务 orderservice 已经成功注册到 Nacos 中了。

    image-20221218175727251

    点击【详情】查看订单微服务 orderservice 所属的集群为青岛集群。

    image-20221218175839653

  • 接下来,我们让订单微服务 OrderApplication 向用户微服务发起远程调用,看看会不会优先调用同在青岛集群的用户微服务实例。

    image-20221218180120547

  • 回到 IDEA 查看用户微服务的 3 个实例的控制台输出,发现 3 个实例都被访问了。这是怎么回事呢?不是说好优先访问同在青岛集群的 8081 和 8082 实例吗?

    image-20221218180422487

  • 这是因为,依然采用了轮询的负载均衡策略。我们需要配置成 Nacos 的负载均衡策略。


4.2 配置Nacos负载均衡策略

  • 打开订单微服务 order-serviceapplication.yml 配置文件,加入以下内容,配置负载均衡策略为 NacosRule ,这个策略会优先访问与自己在同一个集群下的微服务,然后在同一个集群内的实例再采用随机策略来做负载均衡。

    userservice:
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡策略
    
  • 然后重启订单微服务 OrderApplication 生效。

    image-20221218181201337

  • 用 Postman 测试。

    image-20221218180120547

  • 回到 IDEA 查看用户微服务的 3 个实例的控制台输出,发现北京集群的用户服务 8083 没有被访问到,而同在青岛集群的 8081 和 8082 则被访问到了。说明 NacosRule 负载均衡策略的确优先选择同一个地域的集群来访问,实现【就近原则】。此外,在同一集群的多个实例内是采取随机策略的,8082 只被访问到 1 次,而 8081 则被访问到 5 次,可见在同一集群的多个实例并不是采用轮询策略。

    image-20221218181534815

    image-20221218181730414

    image-20221218181750610

  • 此时把青岛集群的 2 个用户微服务实例 8081 和 8082 停掉,那么订单微服务就不得不跨地域集群去访问北京集群的用户服务实例 8083 了。

    image-20221218182308625

    image-20221218180120547

    image-20221218182431280

  • 而在订单微服务的控制台中,就会发出警告:发生了一起跨集群调用。方便运维工程师排查和修复。

    image-20221218182744653


4.3 根据权重负载均衡

  • 针对公司服务器性能水平参差不齐的情况,我们希望性能强的服务器承担更多的微服务远程调用,而性能稍弱的微服务承担较少的访问,从而最大限度地发挥服务器的最佳性能和利用率。但目前 NacosRule 的策略是集群优先,然后随机,这无法满足上述需求。

  • 因此,Nacos 提供了权重 (值域 0~1) 配置来控制访问频率,权重越大的服务器则访问频率越高。当权重调为 0 时就不会被访问,可以做无感知的停机升级和灰度测试。

  • 进入 Nacos 控制台主页,进入用户服务 userservice 【详情】,默认权重都为 1 。现在假设 8081 是性能强的服务器,8082 是性能弱的服务器,因此把 8081 的权重设置得大一些,而 8082 的权重设置得小一些。

    image-20221218184128145

  • 点击右侧的【编辑】,把 8082 的权重设为 0.1 。

    image-20221218184350355

  • 这样,8081 被访问到的概率就应该是 8082 的 10 倍。

    image-20221218184609258

  • 我们用 Postman 测试一下。结果是我试了 20 几次,只有 1 次访问到 8082 ,其余都访问到 8081 了。说明权重生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Reactor 和 Proactor 区别

Reactor 和 Proactor 区别 同步异步、阻塞非阻塞组合 同步 以read()函数为例,int n read(fd, buf. sz) 当采用同步的方式和阻塞io的方式时,buf就是从内核拷贝的数据,函数返回则可以马上知道 buf 中的数据。当采用同步的方式和非阻塞io的方式…

关于rabbitmq消息推送的小demo

目录 一.前言 1.1场景 1.2消息交换机三种形式 二.建设demo工程 2.1 依赖 2.2yml文件指定rabbitmq连接信息 2.3直连型消息链接 一.前言 1.1场景 在我们实际开发中到一个特定的时候是比如工作流到某个状态时, 我们会向某某单位发送消息, 这时就会用到我们的消息推送---ra…

javaee之Mybatis2

一、保存操作 在做这个方法之前,我们先把之前做的那个MybatisTest里面的每一个方法做成一个Test方法,也就是标注Test这个注解 这样便于我们测试接下来的每一个方法。仔细分析一下上面的代码,会发现,可重复性的地方太多。比如我们…

两台linux服务器rsync自动备份文件

检查rsycn是否安装 检查方法:rpm -qa rsync 出现rsync 包名就是安装了 安装rsycn rsync的安装可以使用yum直接安装:yum install rsync rsycn的服务端/文件接收端配置 1、先创建备份目录 mkdir /data/xsbak2、服务端需要开启rsyncd服务,添加…

接口测试(九)—— Git代码托管、jenkins 的持续集成

目录 一、持续集成 二、git 1、简介和安装 2、Gitee 2.1 git 和 gitee 管理代码工作原理 2.2 PyCharm 配置 Gitee 插件 3、PyCharm 与 Gitee 相关操作 3.1 将 Gitee的项目 Checkout到 Pycharm中 3.2 推送 PyCharm 新项目到 Gitee远程仓库 3.3 将 Pycharm代码 push到 …

React基础知识(组件实例三大核心属性state、props、refs)(二)

系列文章目录 第一章:React基础知识(React基本使用、JSX语法、React模块化与组件化)(一) 文章目录系列文章目录一、State1.1. state基本使用1.2 state的简写形式二、Props2.1 props的基本使用2.2 props属性值限制2.3 …

精品基于SSM的小学生课程资源网络云平台

《基于SSM的小学生课程资源网络云平台》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 开发语言:Java 框架:ssm 技术:JSP JDK版本:JDK1.8 服务器:tomcat7 数据…

redux

文章目录redux是什么redux使用情况redux工作原理redux安装redux的3个核心概念Action——形成动作Reducers——操作状态store——存储状态APIredux的响应式redux实现加减案例不使用ActionCreators实现使用ActionCreators实现异步Actionreact-redux使用容器组件创建修改App.jsx在…

干电池升压IC3.3V的电源芯片fs2111/FS2112

干电池升压3.3V的电源芯片FS2111/FS2112 FS2111/FS2112适用于一节干电池升压到3.3V,两节干电池升压3.3V的升压电路,FS2111/FS2112干电池升压IC。 FS2111/FS2112 干电池1.5V和两节干电池3V升压到3.3V的测试数据 两节干电池输出500MA测试: F…

CubeMax添加Rtthread操作系统 组件STM32F103

CubeMax添加Rtthread操作系统 组件STM32F103 本篇主要介绍,怎么使用STM32CubeMx工具,添加RT-Thread操作系统组件,码代码的IDE是keil。快速移植RT-Thread实时操作系统,所用的IDE可自行官网下载最新版。 CubeMax官网下载链接 RTthre…

Ajax(六)

1. XMLHttpRequest的基本使用——URL编码与解码 1.1 什么是URL编码 1.2 如何对URL进行编码与解码 <body><script>var str 黑马程序员//对str编码var str2 encodeURI(str)console.log(str2)//一个汉字对应三个百分号&#xff0c;反解码从console里头复制console.…

js解决单线程之路 - worker的使用分析

写在前面 今天写一个关于实现多线程的东西&#xff0c;都知道js是一个单线程的语言&#xff0c;所谓的单线程就是一次只能做一件事&#xff0c;多线程就是一次可以做很多件事&#xff0c;当然目前我们的电脑等设备很少会有单线程了&#xff0c;比如我们的电脑一般都是标的6核12…

stm32f103zet6的GPIO基础知识

IO数量 16*7112个&#xff0c;GPIOA~GPIOG7组,共144个引脚 IO模式 很多IO口既可以做为输入&#xff0c;也可以做为输出 输入模式 VSS指的是地&#xff0c;VDD是高电平&#xff0c; MOS英文全称为Metal-Oxide-Semiconductor。 意思为金属-氧化物-半导体&#xff0c;而拥有这…

Python画一棵茂盛的分形树

文章目录前情回顾添加分岔茂盛的分形树前情回顾 上次画了一棵分形树&#xff1a;用Python画一棵分形树&#xff0c;得到的图如下 发现看的人还是挺多的&#xff0c;但没什么人点赞&#xff0c;这说明我能给大家画分形树&#xff0c;大家很高兴&#xff0c;但这棵树太秃了&…

[附源码]Python计算机毕业设计调查问卷及调查数据统计系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

在Ubuntu上搭建Nexus服务

介绍 Nexus&#xff1a;Nexus 是一个强大的 Maven 仓库管理器&#xff0c;它极大地简化了自己内部仓库的维护和外部仓库的访问。如Android远程仓库依赖&#xff0c;Java服务端应用程序依赖等&#xff0c;都很方便。 Docker方式 准备 ubuntu上已经安装docker&#xff0c;docker安…

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题

20221218解决在Ubuntu18.04下编译Firefly的Core-3588J出现lz4的问题 2022/12/18 15:37 解决方法&#xff1a;编译最新的lz4的dev分支&#xff01; https://wiki.t-firefly.com/zh_CN/Core-3588J/android_compile_android12.0_firmware.html Core-3588J产品规格书 3. 编译 Andro…

Bootstrap5 小工具

Bootstrap 5 提供了很多有用的类来帮组我们快速实现效果&#xff0c;不需要重复写一些 CSS 代码。 背景颜色 设置不同元素的背景颜色时&#xff0c;需要通过 .text-* 类来设置匹配的文本颜色&#xff1a; 实例 <div class"p-3 mb-2 bg-primary text-white">.…

跟老韩学JAVA——IDEA基本使用和快捷键

1. IDEA介绍 2.IDEA下载和安装 这个博主的下载安装介绍的很详细了&#xff0c;我就不过多介绍了 3.IDEA的基本使用 1&#xff09;修改字体大小 File -> Settings -> Editor -> Font -> Size 2)修改字体变粗 3)修改背景颜色 4) 修改菜单栏字体大小 5&#xff…

滑动窗口思想练习题

文章目录1. 找到字符串中所有字母异位词做法一&#xff1a;采用两个数组分别记录字符出现频次做法二&#xff1a;采用diff记录s和p字符串中字符的频次差2. 串联所有单词的子串个人理解&#xff0c;如有异议&#xff0c;欢迎指正&#xff01;1. 找到字符串中所有字母异位词 题目…