13-springcloud gateway集成nacos实现负载均衡

news2024/12/23 5:25:48

网关作为访问系统的入口,负载均衡是必选项而不是可选项,本文介绍gateway与nacos集成,实现负载均衡的过程。关于springcloud gateway的基本用法,同学可以看看上篇文章: 12-使用gateway作为网关。

0、环境

  • jdk:1.8
  • springboot:2.4.2
  • nacos:2.0.3

1、项目结构

整体的项目目录结构如下:

在这里插入图片描述
部署的时候,service-1我会部署两份,用来模拟多实例微服务的调用。

2、gateway服务实现

请求过程:客户端发请求,请求到达gateway,gateway识别请求并处理,再按照负载均衡算法选择一个服务转发请求。

下面先实现gateway服务。

2.1、引入依赖



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

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

<!--负载均衡依赖不可少-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-loadbalancer</artifactId>
   <version>3.0.1</version>
</dependency>

2.2、application.yml

正如我们设想的一样,要使用nacos作为注册中心,肯定要配置服务发现,全量配置代码如下:

server:
  port: 9080

spring:
  application:
    name: gateway

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.99:8848
        namespace: dev
        group: group1
        cluster-name: Claster-A
        service: gateway
    gateway:
      discovery:
        locator:
          enabled: true

      routes:
        - id: 001
          uri: lb://service-1    #匹配后端提供服务的路由地址,注意lb开头,表示启用负责均衡
          predicates:
            - Path=/sample/service1/say/**         # 断言,路径相匹配的进行路由
          filters:
            - StripPrefix=2


关键的两个配置,一个是配置了nacos服务注册与发现的服务地址,另一个配置了网关转发的相关参数,注意,uri的配置是“lb”开头,代表了可以负载均衡,与普通的uri写法不同。

3、service-1的实现

3.1、引入依赖

只需要引入nacos服务发现的依赖,代码如下:

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

3.2、application.yml

service-1的实现与gateway基本相同,不同的是,service-1不需要配置网关转发的相关配置。application.yml配置文件如下:

server:
  port: 9081

spring:
  application:
    name: service-1

  cloud:
    nacos:
      discovery:
        server-addr: 192.168.3.99:8848
        namespace: dev
        group: group1
        cluster-name: Claster-A
		service: service-1

2.3、controller实现

这个就不多少说了,写个controller即可,代码如下:

@RestController
@RequestMapping("/say")
public class SomethingToSay {

    @GetMapping("/hello")
    public String sayHello() {
        return "Server " + port + ": hello";
    }

    @GetMapping("/hi")
    public String sayHi() {
        return "Server " + port + ": hi";
    }

    @GetMapping("/ohh")
    public String sayOhh() {
        return "Server " + port + ": ohh";
    }
	
	@Value("${server.port}")
    private Integer port;
}

3、测试

由于service-1需要启动两份,所以先利用idea的Run/Debug Configurations功能,复制一份调试配置,再覆盖端口配置参数即可,见下图:
在这里插入图片描述

此时,service-1就有两个实例了,分别启动三个服务,再看看nacos的服务注册列表,当然,前提是三个服务都正常启动。如下图:
在这里插入图片描述

3.1、发请求

现在万事俱备,就差发射了,咱们利用apifox发个请求试试,看负载均衡的效果:
在这里插入图片描述
当我连续点击发送请求时,端口号会发生变化,也就是说我们的请求分别落在了两个服务实例上。
OK,就到这里吧。

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

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

相关文章

【GIT】idea中实用的git操作,撤回commit,撤回push、暂存区使用

IDEA中最常见的UI操作&#xff1a;【GIT】Idea中的git命令使用-全网最新详细&#xff08;包括现象含义&#xff09; 文章目录 问题一&#xff1a; idea撤回仅commit错误的代码&#xff08;仅本地仓库&#xff0c;因为还没推送到远程&#xff09;问题二&#xff1a; idea撤回Com…

【提示学习论文】CoCoLe:Conceptual Codebook Learning for Vision-Language Models

Conceptual Codebook Learning for Vision-Language Models&#xff08;ECCV 2024&#xff09; CPL的改进暂无代码 CPL 详见CPL论文 CoCoLe a&#xff1a;手工概念缓存的建立过程b&#xff1a;制作提示的过程&#xff0c;将图像输入Ev&#xff0c;得到image features v 作…

【C++ Primer Plus习题】6.4

问题: 解答: #include <iostream> using namespace std;const int strsize 40; const int usersize 40;typedef struct _Bop {char fullname[strsize];char title[strsize];char bopname[strsize];int preference; }Bop;Bop bop_user[usersize] {{"Wimp Macho&q…

SpringBoot多环境日志配置

SpringBoot 默认使用 LogBack 日志系统 默认情况下&#xff0c;SpringBoot项目的日志只会在控制台输入。 如果想查询历史日志则无法找到&#xff0c;我们需要一个日志系统来统一管理日志。 一般正式项目会有单独日志系统&#xff0c;将日志操作存入数据库。 第一种方式是 在 ap…

如何理解select(1)、select(*)、select(column)背后的差异?

先说结论 select&#xff08;1&#xff09;、select&#xff08;*&#xff09;都是基于结果集进行的行数统计&#xff0c;统计到NULL行select&#xff08;column&#xff09;则受到索引设置的影响&#xff0c;默认会排除掉NULL行 在数据库查询中&#xff0c;SELECT语句用于从数…

第 7 章 B+树索引的使用

7.1 索引的代价 空间上的代价 每建立一个索引都要为它建立一棵B树&#xff0c;B树的每一个节点都是一个数据页&#xff0c;一个页默认占用16KB的空间。 时间上的代价 每次对表中的数据进行增、删、改操作时&#xff0c;都需要去修改各个B树索引。 一个表上的索引越多&#x…

从零上手CV竞赛Task2 # Datawhale AI夏令营

文章目录 平台参赛平台云平台 Task 1 从零上手CV竞赛下载baseline相关文件一键运行baseline&#xff01;&#xff08;大约需要25分钟&#xff09;赛题解析数据集提交结果违法标准注意事项 下载生成的文件结果如图最后要记得关机 不然一直消耗算力 Task 2 建模方案解读与进阶物体…

光性能 -- OMA(光调制幅度)

基本概念 OMA&#xff08;Optical Modulation Amplitude&#xff09;&#xff1a;光调制幅度&#xff0c;是光信号测试中的一项指标。是指光模块接收到的信号”1”的光功率和信号“0”的光功率的差值。即&#xff1a; Pavg&#xff08;average optical power&#xff09;&#…

WxPython可视化编辑器

作者&#xff1a;陈炳强 WxPython是python的一个用来写桌面程序的模块,目前只写了小部分功能跟组件, 用Python写中文&#xff0c;非常方便&#xff01; 下载地址&#xff1a;https://pan.quark.cn/s/ba19b2472246

LabVIEW如何适应航天系统的要求

随着航天任务的复杂性和精确性要求不断提高&#xff0c;软件系统在其中扮演的角色变得愈发关键。LabVIEW凭借其强大的实时数据处理能力、高可靠性、以及灵活的系统集成和仿真工具&#xff0c;已逐渐成为满足航天系统需求的重要开发平台。通过全面适应航天工程的严格标准&#x…

守护电动“心脏”!仿真APP在汽车电池包随机振动分析中的应用

汽车电动化、智能化、绿色化发展已成为全球各国应对气候变化、实现低碳发展的共同选择。在此背景下&#xff0c;新能源汽车持续高速发展。电池包作为新能源汽车的“心脏”&#xff0c;是其主要动力来源&#xff0c;直接影响车辆的续航里程与行驶安全。电池包结构的安全可靠性对…

Linux——性能调优工具一览

一、CPU 1.调优工具 根据指标找工具 性能指标工具说明 平均负载 uptime、top uptime最简单、top提供了更全的指标 系统整体CPU使用率 vmstat、mpstat、top、sar、/proc/stat top、vmstat、mpstat只可以动态查看&#xff0c;而sar还可以记录历史数据 /proc/stat是其他性…

界面控件Telerik UI for ASP.NET Core 2024 Q2亮点 - AI与UI的融合

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 本文将介绍界面组件Teler…

【MySQL 11】索引 (带思维导图)

文章目录 &#x1f308; 一、索引介绍⭐ 1. 索引的概念⭐ 2. 索引的分类⭐ 3. 索引的价值 &#x1f308; 二、认识磁盘⭐ 1. MySQL 与存储⭐ 2. 磁盘的物理结构⭐ 3. 磁盘的随机访问与连续访问 &#x1f308; 三、MySQL 与磁盘交互⭐ 1. MySQL 与磁盘交互的基本单位⭐ 2. MySQL…

一文深度了解堆

什么是堆&#xff1f; 堆&#xff08;Heap&#xff09;是一种基于数组的树形数据结构&#xff0c;其中每个节点都有一个值&#xff0c;且每个节点的值都大于等于&#xff08;或小于等于&#xff09;其子节点的值。堆分为大顶堆&#xff08;Max Heap&#xff09;和小顶堆&#…

回答网友一个C#对话框位置的问题

起因 ‭ 2024-08-28 19:40:20 colorDialog 打开出现的 位置控制不了 鸽子 2024-08-28 20:06:06 你是可以控制的 ‭ 0:00:47 试了下没用&#xff0c;可能是系统 问题吧 代码 位置的设置 SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, 1); 核心代码 protected override IntPt…

django学习入门系列之第十点《django的模板语法》

文章目录 获取请求与响应request获取请求方式在url中传递值在结构体中传递值返回一个值读取HTML中的内容 重定向&#xff08;跳转网页&#xff09;往期回顾 获取请求与响应 request request是一个对象&#xff0c;封装了用户通过浏览器发送过来的所有数据获取请求方式 获取请…

Ai产品经理的探索:技能、机遇与未来展望

Ai时代的产品经理 随着人工智能&#xff08;AI&#xff09;的飞速发展&#xff0c;AI已经从一个前沿技术概念逐步演变为驱动各行业创新的核心力量。从智能助手到自动驾驶&#xff0c;从个性化推荐系统到图像识别&#xff0c;AI正在以不可思议的速度改变着我们的生活方式和工作…

python解释器[源代码层面]

1 PyDictObject 在c中STL中的map是基于 RB-tree平衡二元树实现&#xff0c;搜索的时间复杂度为O(log2n) Python中PyDictObject是基于散列表(散列函数)实现&#xff0c;搜索时间最优为O(1) 1.1 散列列表 问题&#xff1a;散列冲突&#xff1a;多个元素计算得到相同的哈希值 …

华为IS-IS实验及配置

AR1配置 #进入ISIS进程 isis 1 #配置设备类型为Level-1is-level level-1 #定义区域和System-ID等信息network-entity 49.0001.0010.0000.0001.00 #ISIS邻居命名is-name AR1 #接口配置IP和启用ISIS interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.0 isis ena…