SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用

SpringCloud中Nacos服务注册中心 + LoadBalancer服务负载均衡使用

  • 前言
  • Nacos
    • 工作流程
    • nacos安装
      • docker安装
      • window安装
    • 运行nacos
    • 微服务集成nacos
    • 高级特性
      • 1.服务集群
        • 配置方法
        • 效果图
        • 模拟服务实例宕机
      • 2.权重配置
      • 3.环境隔离
  • 如何启动集群节点
    • 本地启动多个节点方法
  • LoadBalancer
    • 集成LoadBalancer
    • LoadBalancer流程
    • 源码跟踪
    • 自定义负载均衡算法
      • 使用自定义负载均衡算法
  • 结语

😀大家好!我是向阳🌞,一个想成为优秀全栈开发工程师的有志青年!	
📔今天来说一说SpringCloud中Nacos服务注册中心 + LoadBalancer服务负载均衡使用。

前言

本篇文章主要是使用Nacos来注册服务实例,使用Nacos来管理这些服务实例,然后使用LoadBalancer让服务消费方负载均衡调用服务提供方

这里有一些代码准备,Contorller的代码我就不贴了,贴一个order服务远程调用user服务,获取订单对应的用户信息。

这里使用的是RestTemplate来进行调用远程服务,后续会用OpenFeign来进行替换优化

@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;/*** 查询订单(携带用户信息)** @param orderId* @return*/@Overridepublic Order findOrderByOrderId(Long orderId) {Order order = orderMapper.findOrderByOrderId(orderId);User user = restTemplate.getForObject("http://ssgw-cloud-user/api/user/findUserByUserId/" + order.getUserId(),User.class);order.setUser(user);return order;}
}

Nacos

在这里插入图片描述

官方文档地址:Nacos文档地址

Nacos有多个特性,这里我们主要介绍的是他的服务发现和服务健康监测这个特性,他还有个我常用的特性,那就是动态配置服务,以后可能会说到。

我们把服务都注册到Nacos里面,Nacos会对服务进行实时的健康检查,阻止向不健康的主机或服务实例发送请求。

工作流程

通过注册中心可以对服务提供方和服务消费方进行解耦。具体的工作模式如下图所示:
在这里插入图片描述
工作流程说明:

  1. 服务提供方在启动的时候,会向注册中心注册自己服务的详情信息 (ip、端口号等) 。在注册中心中会维护一张服务清单,保存这些注册信息,注册中心需要以心跳的方式(30s,服务向注册中心发送心跳)去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
  2. 服务消费方向服务注册中心咨询服务,并获取所有服务的实例清单,然后,按照指定的负载均衡算法从服务清单中选择一个服务实例进行访问。
  3. 每当服务提供方有节点不可用后,服务消费方会重新缓存可用的提供方信息(ip、端口号等)。

nacos安装

docker安装

直接在linux虚拟机中用docker进行以下命令即可。

# 拉取镜像
docker pull nacos/nacos-server:v2.2.2# 创建容器
docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:v2.2.2# nacos2.x的版本新增了一个客户端与服务端的gRpc的通讯端口号9848

window安装

不同的版本有不同的注意事项,可以去官方文档查阅,或者具体的细节可以查看其他博客,这里不详细赘述。

二进制包下载地址

运行nacos

docker的运行在上面已经提到了,docker run xxx就已经运行了。

Window版本的docker配置文件默认是单机模式启动,所以我们运行nacos要加上 standalone 这个命令。

startup.cmd -m standalone

运行成功的页面,nacos的默认端口是8848,我们访问:http://localhost:8848/nacos 即可访问到图形化界面,默认账号密码都是 nacos
在这里插入图片描述

微服务集成nacos

在pom.xml中加入以下依赖:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在application.yml中加入以下配置:

spring:# 配置nacos注册中心的地址cloud:nacos:discovery:server-addr: localhost:8848 # 如果在虚拟机安装,则改成你对应的ip地址application: name: spzx-cloud-user   # 每一个服务注册到nacos注册中心都需要提供一个服务名称,order微服务注册的时候需要更改微服务名称

加入对应的配置文件后,在nacos图形化界面就可以看到以下信息,这里我已经启动了3个user服务,所以 ssgw-cloud-user 的实例数为3。

在这里插入图片描述

高级特性

1.服务集群

在实际生产环境中,为了保证每一个服务的高可用,那么,此时就需要去构建服务集群,但是,并不是说把所有的服务都部署在一个机房里。而是将多个服务分散的部署到不同的机房中,每一个机房的服务可以看做成是一个集群

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。例如:上海机房内的order微服务应该优先访问同机房的user微服务。

配置方法

配置yml文件:

spring:cloud:nacos:discovery:cluster-name: SH		# 配置服务所属集群

集成nacos的负载均衡算法,也是在yml文件中配置,配置了之后,就会按照服务集群来进行访问对应的服务实例,访问默认是随机访问。

spring:cloud:loadbalancer:nacos:enabled: true

一个服务不同实例配置不同的集群方法和下面如何启动集群节点方法一样,这里贴个图。

在这里插入图片描述
我们这里用户服务,两个配置BJ,两个配置SH,订单服务配置了SH,根据上面的讲述,如果我们访问订单服务的接口,我们应该优先访问的是两个SH的用户服务

配置了服务集群后,nacos的服务实例有所变化,如下面两张图。

在这里插入图片描述

在这里插入图片描述

效果图

我们访问订单的接口,查看用户服务的控制台,我们可以看到只有配置了SH的两个用户服务控制台信息有打印SQL语句,说明被只有这两个服务被调用了。

其余三个我就不贴图了…

模拟服务实例宕机

我们可以在nacos的图形化界面中下线按钮来下线对应的服务实例,这样就模拟了服务宕机场景,此时我们下线两个SH的用户服务实例,我们访问订单接口,此时访问就会访问两个BJ的服务实例,如下图所示。
在这里插入图片描述
此时只会调用在配置在BJ的两个服务实例中。

在这里插入图片描述
其余三个我就不贴图了…

2.权重配置

我们可以对不同的服务进行权重配置,比如性能好的服务器权重就可以大一点性能差的服务器泉州就可以小一点

这个我们可以直接在nacos图形化界面进行配置,点击编辑后,即可在弹出的弹窗进行权重配置。

在这里插入图片描述
我们还可以在yml文件中进行配置:

spring:cloud:nacos:discovery:weight: 0.1

3.环境隔离

在实际的开发过程中,可能会存在很多个软件环境:开发环境、测试环境、生产环境。

nacos也是支持多环境隔离配置的,在nacos中是通过namespace来实现多环境的隔离。

完整的服务注册数据存储结构如下所示:

在这里插入图片描述
namespace + group 才可以确定具体的微服务实例。默认情况下,所有service、group都在同一个namespace,名为public。

在nacos的图形化界面就可以进行namespace的添加。

在这里插入图片描述

给微服务添加名称空间的配置,来指定该微服务所属环境,这里修改order的application.yml文件,改为dev:

spring:# 配置nacos注册中心的地址cloud:nacos:discovery:namespace: dev # 配置服务实例所属名称空间

这个时候order和其他的user实例已经不在同一个namespace命名空间下了,这个时候我们再次访问接口就会报错,因为访问不到了。

在这里插入图片描述
控制台报错找不到对应的实例:

在这里插入图片描述

我们也可以分配组,在yml配置文件中进行配置:

spring:# 配置nacos注册中心的地址cloud:nacos:discovery:namespace: dev # 配置服务实例所属名称空间group: ORDER_GROUP

如何启动集群节点

我们启动多个user节点,让order服务负载调用user节点。

本地启动多个节点方法

我们对原本的user服务右键点击,选择Copy Configuration来拷贝配置,进而修改新的配置,我们这里修改端口,防止端口冲突启动不起来。
在这里插入图片描述
服务名称可改可不改使用默认的也可以,但是一定要覆盖配置文件中的端口号。
在这里插入图片描述
选择Override configuration properties后,添加以下配置来覆盖原有的配置,约定大于配置,走的就是我们这里配置的端口。
在这里插入图片描述
配置完毕后,启动就是下图所示的结果。
在这里插入图片描述

LoadBalancer

集成LoadBalancer

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

Spring Cloud LoadBalancer 是Spring Cloud中负责客户端负载均衡的模块,其主要原理是通过选择合适的服务实例来实现负载均衡

客户端负载均衡:就是负载均衡算法由客户端提供,默认是轮询负载均衡,就是每个服务被依次调用。

我们多此访问我们项目的接口,可以从控制台中发现,三个用户服务的控制台中各有一条SQL查询信息,说明每个都被调用了一次。

http://localhost:10200/api/order/findOrderByOrderId/101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

LoadBalancer流程

Spring Cloud LoadBalancer的底层采用了一个拦截器【LoadBalancerInterceptor】,拦截了RestTemplate发出的请求,对地址做了修改。
在这里插入图片描述
执行流程说明:

  1. 通过 LoadBalancerInterceptor 请求拦截器拦截我们的 RestTemplate请求:http://ssgw-cloud-user/api/user/findUserByUserId/1

  2. 获取请求的url,然后,从请求的url中获取服务提供方的主机名称(ssgw-cloud-user)

  3. 然后,调用LoadBalancerClient中的execute方法,将服务提供方的名称传递过去

  4. 在LoadBalancerClient的choose方法中通过ReactiveLoadBalancer.Factory从Nacos注册中心中获取服务列表以及负载均衡算法实例对象

  5. 通过ReactiveLoadBalancer从服务列表中选择一个服务实例地址,然后,发起远程调用

源码跟踪

首先我们进入到 LoadBalancerInterceptorintercept 方法,可以看到我们调用远程服务的uri和服务名称serviceName。

在这里插入图片描述
紧接着进入到 LoadBalancerClientexecute 方法,这个方法主要来处理服务id和用户请求,我们主要看他的 choose 方法。

在这里插入图片描述

我们从choose方法可以看出来,我们的负载均衡器是我们在配置文件中配置的 NacosLoadBalancer 负载均衡器。

在这里插入图片描述

紧接着调用负载均衡器的 choose 方法,从服务列表中选择一个服务实例对象

在这里插入图片描述

如果我们注释掉配置文件中的集成nacos的负载均衡算法,我们可以得到负载均衡器变成了默认的RR负载均衡器也就是轮询调度负载均衡器(RoundRobinLoadBalancer)。
在这里插入图片描述

自定义负载均衡算法

详细注释在代码中都有,这里不多赘述。

public class CustomLoadBalancerConfiguration {/*** @param environment: 用于获取环境属性配置,其中LoadBalancerClientFactory.PROPERTY_NAME表示该负载均衡器要应用的服务名称。* @param loadBalancerClientFactory: 是Spring Cloud中用于创建负载均衡器的工厂类,通过getLazyProvider方法获取ServiceInstanceListSupplier对象,以提供可用的服务列表。* ServiceInstanceListSupplier:用于提供ServiceInstance列表的接口,可以从DiscoveryClient或者其他注册中心中获取可用的服务实例列表。* @return*/@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

使用自定义负载均衡算法

这里使用的是 RestTemplate 来远程调用其他的服务接口(后期会换成 OpenFeign),所以我们在 RestTemplateConfiguration 类上面加上 @LoadBalancerClients 注解来指定我们要调用哪个服务实例,指定使用我们自定义的负载均衡算法来进行调用。

@Configuration
@LoadBalancerClients(value = {@LoadBalancerClient(name = "ssgw-cloud-user", configuration = CustomLoadBalancerConfiguration.class)
})
public class RestTemplateConfiguration {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
}

结语

至此我们就完成了我们的主题《SpringCloud服务拆分:Nacos服务注册中心 + LoadBalancer服务负载均衡使用》,更多的细节和使用方法还等着我们去探索,加油吧👍!

请添加图片描述

——👦[作者]:向阳256
——⏳[更新]:2025.5.8
——🥰本人技术有限,如果有不对指正需要更改或者有更好的方法,欢迎到评论区留言。

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

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

相关文章

网络安全系列--《文章1:网络安全基础与核心概念》

课程1&#xff1a;网络安全基础与核心概念 学习内容 1. 网络安全定义 网络安全是通过技术、管理及法律手段保护网络系统的硬件、软件及数据&#xff0c;使其免受破坏、篡改或泄露&#xff0c;确保系统稳定运行并提供可靠服务。其核心目标包括保密性、完整性、可用性、可控性及…

C++:扫雷游戏

一.扫雷游戏项目设计 1.文件结构设计 首先我们要先定义三个文件 ①test.c //文件中写游戏的测试逻辑 ②game.c //文件中写游戏中函数的实现等 ③game.h //文件中写游戏需要的数据类型和函数声明等 2.扫雷游戏的主体结构 使⽤控制台实现经典的扫雷游戏 •游戏可以通过菜单…

[人机交互]识别需要和建立需求

*一.需要选择的产品特征&#xff08;或属性&#xff09;可概括为两类 1.1外部特征&#xff08;属性&#xff09; 对用户而言&#xff0c;可见及可度量的属性 1.2内部特征&#xff08;属性&#xff09; 对用户而言是不可见或不可度量的 二.什么是需求 需求是有关目标的陈述…

Lua学习笔记

文章目录 前言1. Lua的数据类型2. Lua的控制结构2.1 循环2.1.1 for2.1.1.1 数值循环2.1.1.2 迭代循环2.1.2 while2.1.3 repeat-until 2.2 条件语句2.3 函数 3. Lua中的变量作用域 前言 Lua是一种轻量级的、高效的、可扩展的脚本语言&#xff0c;由巴西里约热内卢天主教大学&am…

学习c语言的链表的概念、操作(另一篇链表的笔记在其他的栏目先看这个)

在学习Linux之间我们先插入一下链表的知识 学习链表&#xff08;一种数据结构思想&#xff09; 链表和数组的区别和实现&#xff1a; 链表&#xff08;链表是个好东西&#xff09; 链表概念&#xff08;什么是链表&#xff09;&#xff1f; 链表就是数据结构->数据的存储…

NVM完全指南:安装、配置与最佳实践

发布于 2025年5月7日 • 阅读时间&#xff1a;10分钟 &#x1f4a1; TL;DR: 本文详细介绍了如何完整卸载旧版Node.js&#xff0c;安装NVM&#xff0c;配置阿里云镜像源&#xff0c;以及设置node_global与node_cache目录&#xff0c;打造高效Node.js开发环境。 &#x1f4cb; 目…

转换算子和行动算子的区别

转换算子和行动算子主要是在分布式计算框架&#xff08;如 Apache Spark&#xff09;里常用的概念&#xff0c;它们在功能、执行机制、返回结果等方面存在明显区别&#xff0c;以下为你详细介绍&#xff1a; 定义与功能 返回结果 如何在使用转换算子和行动算子时避免出现内存溢…

Windows命令行软件管理器:Chocolatey

文章目录 Windows命令行软件管理器&#xff1a;Chocolatey1.Chocolatey使用1.1 安装1.2 常用命令1.3 使用流程 2.常用shell命令汇总 Windows命令行软件管理器&#xff1a;Chocolatey Chocolatey 是一款强大的 Windows 命令行软件管理器&#xff0c;目前在 GitHub 上已斩获 10.…

MySQL 8.0 OCP(1Z0-908)英文题库(11-20)

目录 第11题题目分析正确答案 第12题题目分析正确答案 第13题题目分析正确答案 第14题题目分析正确答案 第15题题目分析正确答案 第16题题目分析正确答案 第17题题目分析正确答案&#xff1a; 第18题题目分析正确答案 第19题题目分析正确答案 第20题题目分析正确答案 第11题 W…

mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程

Milvus 特点&#xff1a;开源的云原生向量数据库&#xff0c;支持多种索引类型和GPU加速&#xff0c;能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景&#xff1a;适合处理超大规模数据和高性能需求的应用&#xff0c;如图像搜索、推荐…

一款独立于游戏外的键盘源按键辅助工具他来了

一款独立于游戏外的键盘源按键辅助工具 一&#xff01;不需要安装&#xff0c;下载即用 二&#xff01;只要熟悉hekili体系 三&#xff01;略懂wa定制 四&#xff01;知道如何循环并且会自行模拟 五&#xff01;会simc最好 直接就上手了&#xff01; 我们的不是一键宏&…

python学生作业提交管理系统-在线作业提交系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

Spring Boot + Vue 实现在线视频教育平台

一、项目技术选型 前端技术&#xff1a; HTML CSS JavaScript Vue.js 前端框架 后端技术&#xff1a; Spring Boot 轻量级后端框架 MyBatis 持久层框架 数据库&#xff1a; MySQL 5.x / 8.0 开发环境&#xff1a; IDE&#xff1a;Eclipse / IntelliJ IDEA JDK&…

引文索引数据库在科研中的应用

如何利用引文索引数据库高效检索、分析研究论文&#xff0c;发现高水平论文&#xff0c;锁定特定领域的经典文献&#xff1f;如何跟踪最新研究进展&#xff1f; 回放链接 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.pn…

《供应链网络攻击的风险与防范》

中国古语有云&#xff1a;“千里之堤&#xff0c;溃于蚁穴。”供应链攻击正是利用这种系统性弱点发起攻势。近年来&#xff0c;随着国内数字化转型加速&#xff0c;供应链安全问题频发。从某盟删库事件到某头部物流企业数据泄露&#xff0c;从某国产工业软件遭恶意代码植入到某…

ETL介绍及kettle等工具学习

ETL介绍及kettle等工具学习 1. 什么是ETL&#xff1f; ETL&#xff08;Extract, Transform, Load&#xff09;是数据集成领域的核心流程&#xff0c;用于将数据从多个分散的源系统中抽取、清洗、转换后加载到目标数据仓库或数据湖中&#xff0c;以支持分析、报表和决策。其核…

图形渲染+事件处理最终版

基于之前做的项目图形移动处理-CSDN博客添加了相机&#xff0c;透视投影&#xff0c;鼠标控制图形旋转。虽然个人感觉这个项目用的是一个二维的三角形&#xff0c;给他加透视投影和相机意义不大&#xff0c;因为透视投影是近大远小&#xff0c;我这个程序设置了放大缩小的限制&…

G口大带宽服务器线路怎么选

G口大带宽服务器线路选择指南 ​​一、线路类型与特点​​ ​​单线&#xff08;电信/联通/移动&#xff09;​​ ​​优势​​&#xff1a;带宽独享、价格低、延迟稳定&#xff0c;适合单一运营商用户集中场景。​​劣势​​&#xff1a;跨运营商访问延迟高&#xff08;如电信…

HTML10:iframe内联框架

iframe内部框架 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>内联框架学习</title> </head> <body> <!--iframe内联框架 src:地址 width-height:高度宽度 --> <iframe…

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十一&#xff09; 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件&#xff0c;触发单击事件时&#xff0c;最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…