谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
文章目录
- 一,通过域名访问商城架构设计
- 1,为什么nginx要将请求转发给网关
- 2,架构设计
- 二,配置
- 1,nginx配置
- 1.1 nginx.conf
- 1.2 gulimall.conf
- 1.3 配置原理
- 2,网关配置
- 三,记录2个问题
- 1,网关路由匹配实现
- 2,网关路由配置前后顺序导致的问题
- 3,nginx.conf upstream配置缺少端口
一,通过域名访问商城架构设计
1,为什么nginx要将请求转发给网关
上一节实现通过Nignx将域名gulimall.com的请求直接转发给产品服务,这样的设计有比较大的缺陷:
- 管理复杂性:如果需要更改服务的路由规则或负载均衡策略,可能需要在多个地方更新配置。
- 安全性风险:直接暴露服务的IP地址可能会增加安全风险。
更好的方式是nginx将请求转发给网关,由网关实现路由转发和负载均衡。转发给网关的优势如下:
- 统一入口:Nginx作为反向代理服务器,提供了一个统一的入口点,所有外部请求首先到达Nginx。
- 安全性:隐藏了后端服务的真实IP地址,增加了系统的安全性。
- 灵活性:可以在Nginx层面进行请求的路由、负载均衡、SSL终端等操作。
- 可扩展性:易于添加新的服务或修改现有服务的路由规则,而不需要更改客户端的访问方式。
2,架构设计
根据图片,当我们在浏览器输入gulimall.com
,nginx将这个请求转发给网关,原理如下:
-
本地DNS解析(hosts文件):
- 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,
gulimall.com
、search.gulimall.com
、item.gulimall.com
和member.gulimall.com
都被指向同一个虚拟机IP地址。这样,当在浏览器中输入这些域名时,系统会将它们解析到指定的虚拟机IP。
- 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,
-
Nginx作为网关:
- Nginx被配置为一个网关,用于接收来自上述域名的所有请求。
-
server块配置:
- 在Nginx配置中,定义了一个server块来监听域名
gulimall.com
的80端口。这意味着所有HTTP请求都会首先到达这个server块。
- 在Nginx配置中,定义了一个server块来监听域名
-
反向代理配置(location块):
- 在server块中,定义了一个location块,用于匹配根路径
/
的请求。使用proxy_pass
指令将请求转发到内部网络的特定服务上,这里是转发到http://192.168.56.1:10000
,即商品服务所在的地址。
- 在server块中,定义了一个location块,用于匹配根路径
-
请求处理:
- 当用户访问
gulimall.com
时,请求首先被发送到配置在hosts文件中的虚拟机IP。 - 虚拟机上的Nginx监听80端口,接收到请求后,根据配置的location块,将请求转发到内部的商品服务。
- 当用户访问
二,配置
1,nginx配置
nginx修改两处配置:
- 在nginx全局配置文件nginx.conf中配置服务器地址
- 在server块配置文件gulimall.conf中配置负载均衡配置
1.1 nginx.conf
在nginx.conf中做如下配置。
upstream gulimall{server 192.168.56.1:88;}
1.2 gulimall.conf
在conf.d目录下的gulimall.conf做如下配置。
location / {proxy_pass http://gulimall;}
注意,配置完成要重启docker容器。
1.3 配置原理
-
location / { … }:
- 这个
location
块定义了对于根路径/
的请求的处理方式。location
块可以包含在server
块内,用于匹配特定的URI或路径。 location /
表示匹配所有以根路径开始的请求。
- 这个
-
proxy_pass http://gulimall;:
proxy_pass
指令用于设置请求的代理转发目标。这里它指定了请求应该被转发到名为gulimall
的上游服务器组(upstream)。注意,这里的http://
是可选的,因为proxy_pass
默认就是HTTP代理。
-
upstream gulimall { … }:
upstream
块定义了一个服务器组的名称和一组后端服务器的地址。在这个例子中,gulimall
是服务器组的名称。- 在
upstream gulimall
块内,使用server
指令来指定后端服务器的地址和端口。这里的server 192.168.56.1;
表示将请求代理到IP地址为192.168.56.1
的服务器。默认情况下,如果没有指定端口,则使用80端口。
这两段配置是如何起作用的:
- 当一个请求到达Nginx,并且请求的URI是根路径
/
时,Nginx会根据配置的location /
块来处理这个请求。 - 在
location /
块中,proxy_pass
指令告诉Nginx将请求转发到名为gulimall
的上游服务器组。 - Nginx查找
upstream gulimall
块,找到后端服务器的列表。在这个例子中,只有一个服务器,即IP地址为192.168.56.1
的服务器。 - Nginx将请求转发到这个后端服务器,由它来处理请求并返回响应。
这种配置方式允许Nginx作为一个反向代理服务器,将请求分发到不同的后端服务。使用upstream
可以方便地进行负载均衡和故障转移等操作,而proxy_pass
则定义了具体的请求转发行为。
2,网关配置
在网关服务的配置文件中,增加如下配置。
- id: gulimall-index-routeuri: lb://gulimall-productpredicates:- Host=**.gulimall.com
这段配置的作用是:
- 当API网关接收到一个HTTP请求时,它会检查请求的Host头部。
- 如果Host头部匹配
**.gulimall.com
的模式(即任何子域名的gulimall.com
),则这个请求将被路由到名为gulimall-product
的服务。 - 请求将通过负载均衡器发送到后端服务实例,以实现请求分发和故障转移。
配置完成重启网关。
三,记录2个问题
1,网关路由匹配实现
在网关中配置工具域名来进行路由转发,测试发现并未生效,原因是nginx转发请求会丢失域名信息,需要在nginx的server块配置文件gulimall.conf中配置中重设请求头域名信息,配置如下。
location / {proxy_set_header Host $host;proxy_pass http://gulimall;}
2,网关路由配置前后顺序导致的问题
如果将下列配置放在路由配置的最前面,将会出现一些问题。
路由规则gulimall-index-route
使用Host
谓词匹配所有以.gulimall.com
结尾的请求。
如果这个规则gulimall-index-route
放在最前面,可能出现的问题包括:
-
匹配优先级问题:
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
gulimall-index-route
放在最前面,所有.gulimall.com
的请求都会被这个规则捕获,即使这些请求的路径可能更适合下面的某个Path
谓词规则。
- 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果
-
路径路由失效:
- 由于
gulimall-index-route
会捕获所有.gulimall.com
的请求,其他基于特定API路径(如/api/search/**
、/api/coupon/**
等)的路由规则将不会生效,因为请求在到达这些规则之前已经被gulimall-index-route
匹配并路由了。
- 由于
-
服务发现问题:
- 如果
gulimall-product
服务不能处理所有可能的API请求(例如,它不包含搜索、优惠券、库存等API的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。
- 如果
3,nginx.conf upstream配置缺少端口
重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.conf
中upstream
配置缺少端口。
如下图修改之后,即能正常访问。
相关文章:

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)
文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…...

【Android Studio】 创建第一个Android应用HelloWorld
文章目录 创建项目查看AndroidManifest.xml(清单)查看MainActivity.java(Activity)查看activity_main.xml(布局) 创建项目 查看AndroidManifest.xml(清单) 查看MainActivity.java(Activity&…...
C++中的错误处理机制:异常
C中的错误处理机制:异常 在软件开发中,错误处理是确保程序稳定性和健壮性的关键环节。C作为一种高级编程语言,提供了比C语言更为灵活和强大的错误处理机制——异常处理。异常处理机制允许程序在运行时检测到错误或异常情况时,能够…...

概率论原理精解【9】
文章目录 集类拓扑空间基 参考文献 集类 C是一个集类(以G的某些子集为元素的集合称为G的集类)。 A i ∈ C , ∩ i 1 n A i ∈ C , 此为有限交封闭 C 所得集类 C ∩ f A_i \in C,\cap_{i1}^nA_i \in C,此为有限交封闭C所得集类C_{\cap f} Ai∈C,∩i1n…...
Pytorch添加自定义算子之(11)-C++应用程序将onnx模型编译并转成tensorrt可执行模型
一、环境 参考 opencv tensorrt cuda visual studio 2019 cmake 二、CMakeLists.txt配置文件 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(segment)set(CMAKE_CXX_FLAGS "-std=c++14 -O1")link_directories(/usr/local/cuda/lib64) # set(OpenCV_DIR "/opt/…...

C++笔记1•C++入门基础•
1.C关键字 C总计63个关键字,C语言32个关键字: 2.命名空间: 在 C/C 中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目…...

Linux查看系统线程数
Linux查看系统线程数 查看线程数查看进程内的线程统计线程数 查看线程数 想要查看Linux操作系统允许的最大线程数,可以通过命令 ulimit -a返回配置项的详细说明: # core文件的最大值为100blocks core file size (blocks, -c) 0# 进程的数…...

【Python基础】Python六种标准数据类型中哪些是可变数据,哪些是不可变数据
文章目录 1.基本介绍可变数据类型不可变数据类型2.可变和不可变到底指的是什么?可变(Mutable)不可变(Immutable)总结1.基本介绍 Python 中的六种标准数据类型分为可变数据类型和不可变数据类型。以下是这些数据类型的分类: 可变数据类型 列表(List) 列表是一种有序集…...

android13去掉安全模式 删除安全模式
总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题排查 3.修改方法 3.1方法1 3.2方法2 4.测试 5.彩蛋 1.前言 Android设备上的安全模式是一种诊断模式,当设备无法正常启动时,它会启动到这个模式。在这个模式下,只有系统自带的程序和服务会被运行,所有的第三方…...
LeetCode239 滑动窗口最大值
前言 题目: 239. 滑动窗口最大值 文档: 代码随想录——滑动窗口最大值 编程语言: C 解题状态: 没有思路,困难题,恐怖如斯 思路 本题的关键在于对单调队列的应用,时间复杂度 O ( n ) O(n) O(n)限…...

文件解析漏洞—IIS解析漏洞—IIS7.X
在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文件路径/xx.jpg后面加上/xx.php会将 “/xx.jpg/xx.php” 解析为 php 文件 利用条件 php.ini里的cgi.fix_pathinfo1 开启IIS7在Fast-CGI运行模式下 在 phpstudy2018 根目录创建…...
vue中子传父之间通信(this.$emit触发父组件方法和.sync修饰符与$emit(update:xxx))
文章目录 前言一、通过this.$emit触发父组件方法实现二、.sync修饰符与$emit(update:xxx) 前言 看了几篇帖子,都没有将$emit两种用法汇聚总结在一起。需要额外的浪费时间去查看其他帖子,索性自己总结一下,方便以后查看。 一、通过this.$emit…...
SocketIO 的 html 代码示例
话不多说,以下为前端 SocketIO 代码示例 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"/><title>TestConnect</title><base><script src&quo…...

Vercel Error: (Azure) OpenAI API key not found
题意:Vercel 错误:(Azure) OpenAI API 密钥未找到 问题背景: I implemented openAI API in my Next.js app with the help of langchain library and it works superb on localhost, but in Vercel (ProVersion) it throws an error: 我使用…...

SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据
全文链接:https://tecdat.cn/?p37293 原文出处:拓端数据部落公众号 在深入了解公司当前的实际情况和员工内心真实想法的基础上,我们旨在从专业视角出发,为企业在组织管理方面的不足进行诊断,并进行全面审视。 为了…...
常见深度学习优化器总结
Adam 是一种非常流行的优化器,因为它结合了动量和自适应学习率的优点,通常在大多数情况下表现良好。不过,如果你在使用 Adam 时遇到性能问题或希望进一步调优,以下是几种可以考虑的替代优化器: 1. AdamW (Adam with W…...
python并发编程之多线程和多进程
了解过python 编程语言的人,可能很多人都听过,python的多线程是假的。 之所以这么说的原因是因为,大家应该都知道python 是一门解释型语言,在cpython解释器中有一个GIL(Global Interpreter Lock),全局解释锁ÿ…...
gorm入门——根据条件查询列表
在 GORM 中,你可以通过 Where 方法结合多个条件来查询符合条件的记录列表。Where 方法支持 AND 和 OR 条件,并且可以链式调用以构建复杂的查询。 示例代码: 假设你有一个 User 结构体,并希望根据多个条件查询符合条件的记录列表…...

笔面试编程题总结
8/6诺瓦星云 修改程序 void point(int *p){*p p[2];}; int main() {int c[] {1,2,3,4,5},*p c;point(p1);for(;p <c5;){printf("%d",*p);}return 0; }1、分隔字符串 strtok //c语言 #include <stdio.h> #include <string.h>// 函数声明 char* fin…...
[other][知识]八大行星的英文各是什么?
1、水星英文名 Mercury,水星最接近太阳,是太阳系中体积和质量最小的行星; 2、金星英文名 Venus,太阳系中第六大行星,太阳系中温度最高的行星,中国古代称之为太白或太白金星; 3、地球英文 E…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...