当前位置: 首页 > news >正文

Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案

在微服务体系中,Nacos 主要承担“服务注册与发现、配置中心”的职能,Gateway(如 Spring Cloud Gateway)通常负责“路由转发、过滤、安全鉴权、灰度流量控制”等功能,而 Nginx 则常被用作“边缘反向代理”或“统一流量入口”。在实际项目里,这三者经常组合使用,以实现高扩展、高可用、可观测且灵活的流量调度。

一、Nacos + Gateway + Nginx 的常见部署架构

一般来说,可以把 Nginx 放在最外层作为“边缘代理”或“静态资源服务器”,在内网或容器集群里部署 Gateway 实例作为微服务的入口网关,网关与 Nacos 对接获取后端微服务实例信息,然后将请求路由到对应的服务。

示意图:

             ┌───────────────────┐Internet   │    Nginx (Edge)   │  <-- 监听80/443端口,做SSL、静态资源、反向代理└────────┬──────────┘│▼┌───────────────────┐│  Spring Cloud     │  <-- 网关集群(多个节点)│     Gateway       │  <-- 进行路由、鉴权、灰度流量控制└────────┬──────────┘│┌──────────────────┴───────────────────┐│                                      ││        ┌───────────────────┐        ││        │ microservice-A    │        │  <-- 内部微服务集群│        └───────────────────┘        │  <-- (多实例) 注册到 Nacos│                                      ││        ┌───────────────────┐        ││        │ microservice-B    │        ││        └───────────────────┘        │└──────────────────────────────────────┘┌───────────────────┐│     Nacos         │  <-- 提供服务注册、发现、配置管理│ (Discovery + Conf)│└───────────────────┘
  • Nginx (Edge)

    • 处理公网的 HTTP/HTTPS 流量,以及静态资源、域名解析等。
    • 将请求反向代理到内网的 Gateway 集群地址。
  • Gateway (Spring Cloud Gateway / Zuul / etc.):

    • Nacos 整合,实现动态获取微服务实例列表。
    • 进行更细粒度的负载均衡、路由转发、权限控制、限流、灰度发布等工作。
  • Nacos

    • 微服务(如 microservice-A、microservice-B)启动时向 Nacos 注册,网关也从 Nacos 拉取这些实例信息进行动态路由。
    • 同时可做分布式配置管理。

这种架构好处

  1. Nginx 专注处理边缘流量、SSL 证书、静态资源缓存等;
  2. Gateway 在内部网络中,实现微服务网关应有的路由、负载、鉴权、灰度、可观测功能;
  3. Nacos 提供统一的服务发现和配置管理;
  4. 部署和职责清晰,各组件各司其职,易于扩展和维护。

二、网关层负载均衡方案

Spring Cloud Gateway(或基于 LoadBalancer、Ribbon、Feign 等)的微服务负载均衡通常有两种模式:

  1. 基于服务名
    在 Gateway 的路由配置中,写 lb://microservice-A,Gateway 会通过 Spring Cloud LoadBalancer / Ribbon 去 Nacos 查询 microservice-A 的实例列表,并根据轮询或自定义策略进行负载均衡。

  2. 基于元数据或标签

    • 如果需要灰度发布、按版本路由等,则可以在实例注册到 Nacos 时,设置 metadata.version=v2 等属性。
    • Gateway 中的路由过滤器会基于请求头或特定条件筛选元数据为 v2 的实例,达到版本级或标签级的智能负载。

示例:(简化写法)

spring:cloud:gateway:discovery:locator:enabled: true  # 开启基于 Nacos 的自动路由routes:- id: microservice-auri: lb://microservice-apredicates:- Path=/api/a/**filters:- StripPrefix=1# 更多路由定义...

然后 Gateway 会自动通过 Nacos 找到 microservice-a 下所有可用实例并进行负载均衡。


三、Nginx 侧负载均衡最佳实践

3.1 在网关集群之上负载

如果你有多个 Gateway 实例(水平扩展),可以让 Nginx 来做第一层负载均衡,将外部流量分发到各 Gateway 实例。例如:

upstream gateway_cluster {least_conn;server 10.0.1.101:8080;server 10.0.1.102:8080;# 如果有更多 gateway 实例都可加上
}server {listen 80;server_name example.com;location / {proxy_pass http://gateway_cluster;proxy_http_version 1.1;proxy_set_header Connection "";}
}
  • 网关集群 内部再通过 Nacos 寻址到微服务。
  • 一般只在 Nginx 配置文件中维护 Gateway 实例即可,实例数量不会频繁变化,减少动态更新的复杂度。

3.2 直接负载微服务(不推荐)

如果你希望 Nginx 直接 负载到后端微服务实例,那么就需要自定义脚本OpenResty + Lua 来让 Nginx 跟 Nacos 同步实例列表(详见 上一条回答 或网上类似方案)。

  • 这种做法在大多数场景下不推荐,因为失去了网关层的可观测、流量管理、灰度控制等优势,维护起来也更复杂。
  • 最佳实践 还是将负载均衡下沉到 Gateway,Nginx 只需知道 Gateway 的地址做统一外部入口。

四、常见问题与建议

  1. 为什么还要 Nginx,如果 Gateway 也能做反向代理和 SSL?

    • 某些公司已有成熟的 Nginx 部署体系,用作七层安全防护、WAF、边缘缓存、流量统计等;或是依赖 Nginx 强大的高并发性能和成熟运维工具。
    • 也可以让 Gateway 直接对外暴露端口进行 HTTPS / 证书管理,但运维成本及安全需求决定了许多公司仍然倾向在最外层保留 Nginx。
  2. 如何实现灰度 / 蓝绿发布?

    • 最常见在 Gateway 层按用户标签或请求头区分流量;
    • 如果想在 Nacos 上给不同实例打上 metadata.version,再在 Gateway 的负载均衡策略里筛选可用实例,就能实现更精细的路由。
  3. Nacos 配置管理如何与 Gateway 结合?

    • Gateway 的路由规则或限流规则也可以存放在 Nacos Config 中,实现动态刷新;
    • 或者使用 Apollo / Spring Cloud Config 的方式管理网关配置。关键是要有统一的配置中心,避免重复修改、维护困难。
  4. 性能和高可用

    • Nacos:建议做集群部署(3 节点以上 odd 数目),并优化数据库写入/读取;
    • Gateway:可横向扩容,多实例配合 Nginx 或负载均衡器;
    • Nginx:也要做多节点或 keepalived / LVS 等方案防止单点;
    • 在高流量场景,应重点关注网关与微服务的压测和监控(QPS、RT、内存、CPU)。
  5. 可观测与日志

    • 建议在 Gateway 层做统一的链路追踪、埋点监控、日志收集(如 Zipkin / SkyWalking / SLS),更容易排查服务调用问题;
    • Nginx Access Log 只提供最外层访问日志,有助于了解外部访问频次、来源 IP 等。

五、总结

  • Nacos:服务发现 + 配置中心
  • Gateway:微服务网关层(路由、鉴权、限流、灰度)
  • Nginx:对外入口或边缘代理(SSL、静态资源、缓存、与 Gateway 集群负载均衡)

推荐架构

  1. Nginx 在外部扮演“CDN/反向代理”角色,可将请求分发到内部 Gateway 集群;
  2. GatewayNacos 深度整合,通过服务名或元数据查找后端实例并进行更多流量治理;
  3. 微服务(如订单、库存、支付等)都在 Nacos 注册并实现动态上下线管理;
  4. 若需要更精细的灰度、蓝绿发布,可在 Gateway 层结合 Nacos metadata 做路由筛选;
  5. 如果有 K8s 等容器平台,也可结合 Ingress / Service Mesh 进行更先进的流量管理和服务发现。

通过此种分层,既能让 Nginx 继续发挥在边缘侧(安全、缓存、静态资源)的优势,又能让 Gateway + Nacos 充分利用 Spring Cloud Alibaba 生态的微服务治理功能,形成一个高可用、高扩展、易运维的分布式架构体系。

相关文章:

Alibaba Spring Cloud 十三 Nacos,Gateway,Nginx 部署架构与负载均衡方案

在微服务体系中&#xff0c;Nacos 主要承担“服务注册与发现、配置中心”的职能&#xff0c;Gateway&#xff08;如 Spring Cloud Gateway&#xff09;通常负责“路由转发、过滤、安全鉴权、灰度流量控制”等功能&#xff0c;而 Nginx 则常被用作“边缘反向代理”或“统一流量入…...

+-*/运算符优先级计算模板

acwing3302 知识点一&#xff1a;有关unordered_map的优先级 头文件<unordered_map>,然后进行符号优先级定义 定义方式unordered_map<char,int>pr{ {,1},{-,1},{*,2},{/,2}};其余没定义的默认为0 知识点二&#xff1a;头文件<cctype>中的isdigit()是判断…...

GPT 结束语设计 以nanogpt为例

GPT 结束语设计 以nanogpt为例 目录 GPT 结束语设计 以nanogpt为例 1、简述 2、分词设计 3、结束语断点 1、简述 在手搓gpt的时候&#xff0c;可能会遇到一些性能问题&#xff0c;即关于是否需要全部输出或者怎么节约资源。 在输出语句被max_new_tokens 限制&#xff0c…...

FastDFS的安装及使用

分布式存储发展历程 前段时间 618 活动火热进行&#xff0c;正是购物的好时机。当我们访问这些电 商网站的时候&#xff0c;每一个商品都会有各式各样的图片展示介绍&#xff0c;这些图 片一张两张可以随便丢在服务器的某个文件夹中&#xff0c;可是电商网站如此 大体量的…...

C++ lambda表达式

目录 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; 1.2Lambda表达式的语法 1.3捕捉列表 1.4函数对象与lambda表达式 1.lambda表达式 1.1什么是Lambda表达式&#xff1f; Lambda表达式是C11标准引入的一种匿名函数&#xff0c;它允许你在需要函数的地方直接编写代码…...

react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求

为了实现一个React页面使用定时器调用一组多个接口&#xff0c;并在任意一个接口请求返回令牌失效时清除定时器且不再触发这一组请求&#xff0c;可以遵循以下步骤&#xff1a; 1. 定义API调用函数&#xff1a;创建一个函数来处理一组API调用。每个API调用都应该检查响应状态以…...

Python的泛型(Generic)与协变(Covariant)

今天咱们聊聊Python类型标注中的泛型(Generic),与协变(Covariant)。 不了解类型标注的小伙伴,可以先看一看我的上一篇文章 “Python类型检查” Python 类型检查-CSDN博客 例子 这次我开个宠物商店。看下面代码。 class Animal:passclass Dog(Animal):passclass Cat(A…...

Python Typing: 实战应用指南

文章目录 1. 什么是 Python Typing&#xff1f;2. 实战案例&#xff1a;构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具&#xff1a;MyPy4. 常见的 typing 用法5. 总结 在 Python 中&#xff0c;静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…...

OpenEuler学习笔记(六):OpenEuler与其他Linux服务器的区别是什么?

OpenEuler是一款基于Linux内核的开源服务器操作系统&#xff0c;与其他Linux服务器操作系统&#xff08;如CentOS、Ubuntu Server等&#xff09;存在多方面的区别&#xff0c;主要体现在以下几个方面&#xff1a; 一、社区与支持 OpenEuler&#xff1a;由华为发起并开源&…...

如何使用CRM数据分析和洞察来支持业务决策和市场营销?

如何使用CRM数据分析和洞察来支持业务决策和市场营销&#xff1f; 大家好&#xff01;今天咱们聊聊一个特别重要的话题——如何利用客户关系管理&#xff08;CRM&#xff09;系统中的数据进行分析与洞察能够帮助我们做出更好的业务决策以及提升市场营销效果。其实啊&#xff0…...

MyBatis和JPA区别详解

文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis&#xff1a;半自动化的ORM框架1.1、代码示例 2、JPA&#xff1a;全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis&#xff1a;灵活的SQL控制1.1、适用场景 2、JPA&#xff1a;开发效率…...

SVN客户端使用手册

目录 一、简介 二、SVN的安装与卸载 1. 安装&#xff08;公司内部一般会提供安装包和汉化包&#xff0c;直接到公司内部网盘下载即可&#xff0c;如果找不到可以看下面的教程&#xff09; 2. 查看SVN版本 ​编辑 3. SVN卸载 三、SVN的基本操作 1. 检出 2. 清除认证数据 3. 提交…...

VsCode安装文档

一、下载 进入VS Code官网&#xff1a;Visual Studio Code - Code Editing. Redefined&#xff0c;点击 DownLoad for Windows下载windows版本 当然也可以点击旁边的箭头&#xff0c;下载Windows版本 或 Mac OS 版本 备注&#xff1a; Stable&#xff1a;稳定版Insiders&#…...

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…...

【动态规划】--- 斐波那契数模型

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey &#x1f3e0; 第N个泰波那契数模型 &#x1f4cc; 题目解析 第N个泰波那契数 题目要求的是泰波那契数&#xff0c;并非斐波那契数。 &…...

生信软件管家——conda vs pip

pip vs conda&#xff1a; 安装过python包的人自然两种管理软件都用过&#xff0c; Pip install和Conda install在Python环境中用于安装第三方库和软件包&#xff0c;但它们在多个方面存在显著的区别 总的来说&#xff1a; pip是包管理软件&#xff0c;conda既是包管理软件&…...

代码随想录——串

文章目录 反转字符串反转字符串Ⅱ路径加密反转字符串中的单词动态口令字符串匹配重复的子字符串 反转字符串 344. 反转字符串 //前后对应交换 //0<->sSize-1 //1<->sSize-2 //... //i<->sSize-1-i,i0,1,...,(sSize-1)/2 void reverseString(char* s, int s…...

詳細講一下RN(React Native)中的列表組件FlatList和SectionList

1. FlatList 基礎使用 import React from react; import { View, Text, FlatList, StyleSheet } from react-native;export const SimpleListDemo: React.FC () > {// 1. 準備數據const data [{ id: 1, title: 項目 1 },{ id: 2, title: 項目 2 },{ id: 3, title: 項目 3…...

TDengine 与上海电气工业互联网平台完成兼容性认证

在工业数字化转型和智能化升级的浪潮中&#xff0c;企业对高效、可靠的数据管理解决方案的需求日益增长。特别是在风电智能运维、火电远程运维、机床售后服务等复杂多样的工业场景下&#xff0c;如何实现海量设备和时序数据的高效管理&#xff0c;已经成为推动行业升级的关键。…...

随机矩阵投影长度保持引理及其证明

原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 &#x1f449;前提&#xff1a; X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...