今天,做项目的时候做项目的时候配路由出现bug,特此理顺一下从nginx到微服务网关再到微服务这一过程。
nginx配置
upstream admin-gateway{
server localhost:21217;
}
server {
listen 8803;
location / {
root F:/develop/admin-web/;
index index.html;
}
location ~/service_6001/admin(.*) {
proxy_pass http://admin-gateway/$1;
proxy_set_header HOST $host; # 不改变源请求头的值
proxy_pass_request_body on; #开启获取请求体
proxy_pass_request_headers on; #开启获取请求头
proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息
}
}
admin-gateway网关配置
server:
port: 21217
spring:
application:
name: admin-gateway
cloud:
nacos:
discovery:
server-addr: x.xx.xx.xx:8848
config:
server-addr: x.xx.xx.xx:8848
file-extension: yml
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
routes:
# 管理微服务
- id: admin
uri: lb://admin-server
predicates:
- Path=/admin/**
filters:
- StripPrefix= 1
admin-server微服务配置
server:
port: 51806
spring:
application:
name: admin-server
cloud:
nacos:
discovery:
server-addr: x.xx.xx.xx:8848
config:
server-addr: x.xx.xx.xx:8848
file-extension: yml
以上就是三者配置,并且网关和微服务已经注册到nacos注册中心。接下来我们理一下,从前端nginx是如何到后端微服务的。
前端 Nginx :
- Nginx 通过配置文件指定了监听的端口号为 8803。
- 当收到请求时,如果 URL 匹配了**~/service_6001/admin(.*)** 的正则表达式,则会转发到 **http://admin-gateway/$1**。
- 请求转发时,Nginx 会保留原始请求头,并添加额外的代理头信息。admin-gateway
微服务网关:
- 该微服务网关监听在端口 21217。 使用 Spring Cloud Gateway 实现,在配置中指定了 Nacos 注册中心的地址。
- 配置了一个路由 admin,匹配路径为 /admin/**,转发到 lb://admin-server,这里的 lb://意味着使用负载均衡。
- 这里的路由也包含了一个过滤器 StripPrefix=1,用于去掉路径中的前缀,保证请求能够正确到达微服务。
admin-server 微服务:
- 该微服务监听在端口 51806。 也使用了 Nacos 作为注册中心,并指定了配置中心的地址。
综合起来,前端的请求首先到达Nginx ,根据配置的规则,如果 URL 符合 /service_6001/admin(.*) ,则会被转发到 admin-gateway 微服务网关。网关根据配置的路由将请求转发到对应的 admin-server 微服务上,进行处理。整个过程中,Spring Cloud Gateway 作为微服务网关起到了路由转发和过滤器的作用,Nacos则作为服务注册中心和配置中心,管理着服务的注册与发现以及配置的管理。
举例
如果一个请求是**http://localhost:8803/service_6001/admin/login/in**,这个请求如何变化
-
当收到这个请求时,根据前面提到的 Nginx 配置,它会匹配到 **~/service_6001/admin(.*)**的正则表达式规则。因此,这个请求将被转发到
http://admin-gateway/service_6001/admin/login/in -
根据 admin-gateway 微服务网关的配置,这个请求会进一步被路由到 admin-server微服务上,但在路由过程中,网关会将路径中的前缀 /service_6001/admin 去掉,因为配置中包含了过滤器
StripPrefix=1 。所以最终请求到达 admin-server 微服务的路径是 /login/in,完整的目标路径是http://admin-server:51806/login/in。