当前位置: 首页 > 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配置缺少端口。
在这里插入图片描述

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

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Roaringbitmap+Mysql构建标签--实际使用问题
  • CACTER直播预告:重保期间邮件网关与SMC2如何多维度防护
  • 常见的框架漏洞
  • 常见的CMS漏洞
  • Stable Diffusion绘画 | 图生图-上传重绘蒙版
  • Massa如何构建完全链上的去中心化网络?
  • 计算机学习
  • SQL Server数据库文件过大而无法直接导出解决方案
  • 开源威胁情报查询
  • 07.FreeRTOS列表与列表项
  • leetcode 234.回文链表
  • 【C++ 面试 - 基础题】每日 3 题(一)
  • postgreSQL16添加审计功能
  • centos上传工具
  • LeetCode Hard|【460. LFU 缓存】
  • “大数据应用场景”之隔壁老王(连载四)
  • Apache Spark Streaming 使用实例
  • ES6简单总结(搭配简单的讲解和小案例)
  • Making An Indicator With Pure CSS
  • SQLServer之创建显式事务
  • unity如何实现一个固定宽度的orthagraphic相机
  • 大主子表关联的性能优化方法
  • 多线程事务回滚
  • 高程读书笔记 第六章 面向对象程序设计
  • 深度学习中的信息论知识详解
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • (4.10~4.16)
  • (c语言)strcpy函数用法
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (笔试题)分解质因式
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (过滤器)Filter和(监听器)listener
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)Controller接口控制器详解(三)
  • (一)Linux+Windows下安装ffmpeg
  • (转)大道至简,职场上做人做事做管理
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 的缓存方案
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net反编译工具
  • .NET开源快速、强大、免费的电子表格组件
  • .NET企业级应用架构设计系列之应用服务器
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @antv/g6 业务场景:流程图
  • @PreAuthorize与@Secured注解的区别是什么?
  • [.net]官方水晶报表的使用以演示下载
  • [1204 寻找子串位置] 解题报告