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

谷粒商城实战笔记-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将这个请求转发给网关,原理如下:

  1. 本地DNS解析(hosts文件)

    • 在Windows系统的hosts文件中配置域名与虚拟机IP的映射关系。例如,gulimall.comsearch.gulimall.comitem.gulimall.commember.gulimall.com都被指向同一个虚拟机IP地址。这样,当在浏览器中输入这些域名时,系统会将它们解析到指定的虚拟机IP。
  2. Nginx作为网关

    • Nginx被配置为一个网关,用于接收来自上述域名的所有请求。
  3. server块配置

    • 在Nginx配置中,定义了一个server块来监听域名gulimall.com的80端口。这意味着所有HTTP请求都会首先到达这个server块。
  4. 反向代理配置(location块)

    • 在server块中,定义了一个location块,用于匹配根路径/的请求。使用proxy_pass指令将请求转发到内部网络的特定服务上,这里是转发到http://192.168.56.1:10000,即商品服务所在的地址。
  5. 请求处理

    • 当用户访问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 配置原理

  1. location / { … }

    • 这个location块定义了对于根路径/的请求的处理方式。location块可以包含在server块内,用于匹配特定的URI或路径。
    • location /表示匹配所有以根路径开始的请求。
  2. proxy_pass http://gulimall;

    • proxy_pass指令用于设置请求的代理转发目标。这里它指定了请求应该被转发到名为gulimall的上游服务器组(upstream)。注意,这里的http://是可选的,因为proxy_pass默认就是HTTP代理。
  3. 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放在最前面,可能出现的问题包括:

  1. 匹配优先级问题

    • 路由规则是从上到下匹配的,一旦匹配成功,就不会再考虑下面的规则。如果gulimall-index-route放在最前面,所有.gulimall.com的请求都会被这个规则捕获,即使这些请求的路径可能更适合下面的某个Path谓词规则。
  2. 路径路由失效

    • 由于gulimall-index-route会捕获所有.gulimall.com的请求,其他基于特定API路径(如/api/search/**/api/coupon/**等)的路由规则将不会生效,因为请求在到达这些规则之前已经被gulimall-index-route匹配并路由了。
  3. 服务发现问题

    • 如果gulimall-product服务不能处理所有可能的API请求(例如,它不包含搜索、优惠券、库存等API的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。

3,nginx.conf upstream配置缺少端口

重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.confupstream配置缺少端口。
在这里插入图片描述

如下图修改之后,即能正常访问。

在这里插入图片描述

http://www.lryc.cn/news/418318.html

相关文章:

  • 【Android Studio】 创建第一个Android应用HelloWorld
  • C++中的错误处理机制:异常
  • 概率论原理精解【9】
  • Pytorch添加自定义算子之(11)-C++应用程序将onnx模型编译并转成tensorrt可执行模型
  • C++笔记1•C++入门基础•
  • Linux查看系统线程数
  • 【Python基础】Python六种标准数据类型中哪些是可变数据,哪些是不可变数据
  • android13去掉安全模式 删除安全模式
  • LeetCode239 滑动窗口最大值
  • 文件解析漏洞—IIS解析漏洞—IIS7.X
  • vue中子传父之间通信(this.$emit触发父组件方法和.sync修饰符与$emit(update:xxx))
  • SocketIO 的 html 代码示例
  • Vercel Error: (Azure) OpenAI API key not found
  • SPSS、Python员工满意度问卷调查激励保健理论研究:决策树、随机森林和AdaBoost|附代码数据
  • 常见深度学习优化器总结
  • python并发编程之多线程和多进程
  • gorm入门——根据条件查询列表
  • 笔面试编程题总结
  • [other][知识]八大行星的英文各是什么?
  • 如何使用 AWS CLI 创建和运行 EMR 集群
  • HDFS写入数据的流程图
  • 【Material-UI】使用指南:快速入门与核心功能解析
  • 【Java 第十三篇章】MyBatis 持久化框架的介绍
  • AI新应用:概要设计与详细设计自动生成解决方案
  • 【物联网设备端开发】使用QEMU模拟ESP硬件运行ESP-IDF
  • #子传父父传子props和emits #封装的table #vue3
  • 尚硅谷谷粒商城项目笔记——四、使用docker安装redis【电脑CPU:AMD】
  • Java在无人驾驶方向的就业方向
  • 机器学习中的关键距离度量及其应用
  • Redis中缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题