上一节实现通过Nignx将域名gulimall.com的请求直接转发给产品服务,这样的设计有比较大的缺陷:
更好的方式是nginx将请求转发给网关,由网关实现路由转发和负载均衡。转发给网关的优势如下:
nginx修改两处配置:
在nginx.conf中做如下配置。
upstream gulimall{
server 192.168.56.1:88;
}
location / {
proxy_pass http://gulimall;
}
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会根据配置的location /
块来处理这个请求。location /
块中,proxy_pass
指令告诉Nginx将请求转发到名为gulimall
的上游服务器组。upstream gulimall
块,找到后端服务器的列表。在这个例子中,只有一个服务器,即IP地址为192.168.56.1
的服务器。这种配置方式允许Nginx作为一个反向代理服务器,将请求分发到不同的后端服务。使用upstream
可以方便地进行负载均衡和故障转移等操作,而proxy_pass
则定义了具体的请求转发行为。
在网关服务的配置文件中,增加如下配置。
- id: gulimall-index-route
uri: lb://gulimall-product
predicates:
- Host=**.gulimall.com
这段配置的作用是:
**.gulimall.com
的模式(即任何子域名的gulimall.com
),则这个请求将被路由到名为gulimall-product
的服务。配置完成重启网关。
在网关中配置工具域名来进行路由转发,测试发现并未生效,原因是nginx转发请求会丢失域名信息,需要在nginx的server块配置文件gulimall.conf中配置中重设请求头域名信息,配置如下。
location / {
proxy_set_header Host $host;
proxy_pass http://gulimall;
}
如果将下列配置放在路由配置的最前面,将会出现一些问题。
路由规则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的实现),那么将所有请求都路由到这个服务将导致错误或不期望的响应。重启nginx和网关后,仍然不能正常访问页面,查看nginx日志,发现转发到80端口,而网关是在88端口,说明配置nginx.conf
中upstream
配置缺少端口。
如下图修改之后,即能正常访问。
因篇幅问题不能全部显示,请点此查看更多更全内容