微服务架构中的nginx作用

在 Spring Boot 微服务架构中,使用 Nginx 作为反向代理,再通过 Gateway 网关进行请求路由和处理:Client -> Nginx -> Spring Cloud Gateway -> 微服务。

Nginx 的职责

1. 处理 SSL 终结(TLS 加密/解密)

  • 客户端发起加密的 HTTPS 请求(客户端和服务器之间的通信是通过 SSL/TLS 协议进行加密的)。
  • Nginx 接收加密的请求并解密得到原始的 HTTP 请求数据。
  • Nginx 将解密后的请求转发给后端服务器。
  • Nginx 返回响应并加密。

2. 静态内容的缓存和分发(比如图片、CSS 文件等)

3. 初步的负载均衡(可以将请求转发到多个 Gateway 实例)

首先,假设你有多个 Spring Cloud Gateway 实例在运行,比如:
Gateway 实例 1: http://gateway1:8080
Gateway 实例 2: http://gateway2:8080
Gateway 实例 3: http://gateway3:8080
在 Nginx 中,我们使用 upstream 指令定义这些 Gateway 实例,然后通过 Nginx 会根据负载均衡算法(默认是轮询)负载均衡到这些实例。

http {
    # 定义多个后端 Spring Cloud Gateway 实例
    upstream gateway_servers {
        server gateway1:8080;
        server gateway2:8080;
        server gateway3:8080;
    }

    server {
        listen 80; # 监听80端口
		server_name example.com
		
        # 静态资源处理(如果有静态资源)
        location /static/ {
            root /var/www/html;
        }

        # 配置负载均衡到 Spring Cloud Gateway 实例
        location / {
            proxy_pass http://gateway_servers; #负载均衡到多个后端服务器
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # 可选:跨域配置
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'Authorization, Content-Type';
    }
}

listen 80: 监听 HTTP 的 80 端口。
server_name example.com: 定义要代理的域名。
location /: 匹配所有 URL 路径。
proxy_pass http://gateway_servers: 将客户端请求转发给后端服务器 gateway_servers。可以是 IP 地址或另一个域名。
proxy_set_header 用于设置一些头信息:
Host: 将客户端请求中的原始主机名传递给后端服务器。
X-Real-IP: 将客户端的真实 IP 传递给后端服务器。
X-Forwarded-For: 记录客户端的 IP,尤其在通过多个代理时有用。
X-Forwarded-Proto: 传递客户端请求所使用的协议(HTTP 或 HTTPS)。

1.负载均衡策略

Nginx 支持多种负载均衡策略,除了默认的轮询,可以根据具体场景选择适合的策略:
1. 加权轮询(Weighted Round Robin)

  • 根据权重将请求分发到不同的实例,权重越高,接收到的请求越多。
    示例配置:
upstream gateway_servers {
    server gateway1:8080 weight=3; # 权重为3
    server gateway2:8080 weight=2; # 权重为2
    server gateway3:8080 weight=1; # 权重为1
}

2. 最少连接数(Least Connections)

  • 将请求分发到当前处理请求最少的服务器。
    示例配置:
upstream gateway_servers {
    least_conn;
    server gateway1:8080;
    server gateway2:8080;
    server gateway3:8080;
}

3. IP 哈希(IP Hash)

  • 使用客户端的 IP 地址进行哈希运算,确保相同客户端的请求总是转发到同一个后端实例。这种策略适合需要保持会话的场景。
    示例配置:
upstream gateway_servers {
    ip_hash;
    server gateway1:8080;
    server gateway2:8080;
    server gateway3:8080;
}

4. 超时设置
proxy_connect_timeout: 设置与后端服务器建立连接的超时时间。
proxy_read_timeout: 设置从后端服务器读取响应的超时时间。
proxy_send_timeout: 设置向后端服务器发送请求的超时时间。

proxy_connect_timeout: 10s #设置与后端服务器建立连接的超时时间。
proxy_read_timeout: 10s #设置从后端服务器读取响应的超时时间。
proxy_send_timeout: 10s #设置向后端服务器发送请求的超时时间。

4. 配置缓存代理响应

在 Nginx 中配置缓存代理响应可以显著提高性能,特别是当后端服务器需要处理一些重复的请求时。通过缓存,Nginx 可以直接返回缓存的响应,而不必每次都将请求转发到后端服务器,从而减少服务器的负载并加快响应时间。

为了启用缓存,首先需要定义缓存存储的位置、缓存的大小、缓存的有效期等。以下是一个基本的 Nginx 缓存配置示例。

1. 定义缓存目录和缓存相关参数 在 Nginx 的 http 部分配置缓存参数。

http {
    # 定义缓存路径和大小
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    # 其他全局配置
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    sendfile on;
    keepalive_timeout 65;
    
    # 定义缓存区域 my_cache
    server {
        listen 80;
        server_name example.com;

        location / {
            # 启用缓存
            proxy_cache my_cache;
            
            # 定义缓存的有效期
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;

            # 设置缓存键
            proxy_cache_key "$scheme$request_method$host$request_uri";

            # 是否允许缓存请求带有查询参数的 URL
            proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;

            # 代理到后端服务
            proxy_pass http://backend_server;

            # 设置头信息
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

2. 配置解析

  • proxy_cache_path:定义缓存存储路径 /var/cache/nginx 和缓存相关参数。

    • levels=1:2:指定缓存目录的层级结构,Nginx 会在这个路径下创建两级子目录存放缓存文件。
    • keys_zone=my_cache:10m:定义一个名为 my_cache 的缓存区域,使用 10MB 内存存储缓存键。
    • max_size=1g:限制缓存目录的大小为 1GB。当达到限制时,Nginx 会自动删除旧的缓存文件。
    • inactive=60m:缓存对象在 60 分钟内没有被访问,则会被清除。
    • use_temp_path=off:缓存时不使用临时路径。
  • proxy_cache my_cache:启用缓存并指定使用名为 my_cache 的缓存区域。

  • proxy_cache_valid 200 302 10m:定义哪些 HTTP 状态码的响应可以被缓存,以及它们的缓存有效期。

    • 状态码 200 和 302 的响应将被缓存 10 分钟。
    • 404 状态码的响应将被缓存 1 分钟。
  • proxy_cache_key:定义缓存键,通常是基于请求方法、URL 和参数构建的,确保相同请求的响应能被命中缓存。

  • proxy_cache_use_stale:允许 Nginx 在后端服务器不可用或出现超时的情况下,使用旧的缓存响应。

    • 支持的状态码包括 500、502、503 和 504,这样可以提高系统的容错能力。

3. 缓存控制
Nginx 缓存机制会根据 HTTP 头信息来决定是否缓存响应。可以通过后端服务器的响应头来控制缓存行为,常见的控制头包括:

  • Cache-Control: 控制缓存的行为。
    • Cache-Control: no-cache:告诉 Nginx 不要缓存该响应。
    • Cache-Control: max-age=3600:缓存响应 3600 秒(1 小时)。
  • Expires: 指定响应过期的时间。
    • Expires: Thu, 01 Dec 2024 16:00:00 GMT:设置过期时间。
  • Vary: 告诉缓存服务器基于不同的请求头生成不同的缓存版本。例如:
    • Vary: Accept-Encoding:根据 Accept-Encoding 生成不同的缓存条目(如 gzip 和 non-gzip)。

4. 查看缓存状态
Nginx 提供了一个 X-Cache-Status 响应头,用于检查某个响应是否是从缓存中获取的。可以在 location 配置中添加以下指令,以便在响应中显示缓存状态:

location / {
    proxy_cache my_cache;
    proxy_cache_valid 200 10m;
    proxy_pass http://backend_server;

    # 添加缓存状态到响应头
    add_header X-Cache-Status $upstream_cache_status;
}
  • X-Cache-Status 的可能值:
    • MISS:缓存中没有找到请求的响应,需要从后端获取。
    • HIT:响应是从缓存中获取的。
    • BYPASS:Nginx 忽略了缓存(例如通过某些条件,如 POST 请求)。
    • EXPIRED:缓存已过期,Nginx 会从后端获取新的响应。

5. 缓存更新策略
当后端服务器响应的数据需要更新时,缓存中的旧数据也需要过期或刷新。Nginx 提供了几种常见的缓存刷新策略:
1. 主动缓存刷新
可以通过向 Nginx 发送 HTTP 请求并附带 PURGE 方法,主动清除缓存条目。Nginx 支持通过第三方模块 ngx_cache_purge 实现该功能。

在 Nginx 配置文件中,添加对 PURGE 请求的支持。为指定的路径启用 PURGE 方法。

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;

    server {
        listen 80;
        server_name example.com;

        # 启用缓存
        location / {
            proxy_cache my_cache;
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 配置 PURGE 方法
        location ~ /purge(/.*) {
            allow 127.0.0.1;   # 允许特定 IP 地址执行 PURGE
            deny all;          # 拒绝其他 IP 地址
            proxy_cache_purge my_cache "$scheme$request_method$host$1";
        }
    }
}

在这个配置中,/purge URL 路径会用于清除缓存。可以通过本地或特定 IP 地址发送 PURGE 请求。
假设要清除缓存条目 /some/path,可以通过以下命令发送 PURGE 请求:

curl -X PURGE http://example.com/purge/some/path

如果缓存条目成功清除,Nginx 将返回类似 200 OK 的响应。

2. 缓存过期控制
通过在后端服务器的响应头中设置 Cache-Control 或 Expires 头,可以控制缓存对象的过期时间。

3. 条件缓存
可以根据请求参数或某些业务规则来决定是否缓存某些响应。Nginx 提供了灵活的条件控制选项:

location / {
    proxy_cache my_cache;

    # 如果请求带有“no-cache”参数,则不缓存
    if ($arg_no_cache) {
        set $no_cache 1;
    }

    # 控制缓存行为
    proxy_no_cache $no_cache;
    proxy_cache_bypass $no_cache;

    proxy_pass http://backend_server;
}

6. 总结
通过 Nginx 的缓存机制,可以大幅提升应用的响应速度,减轻后端服务器的负担。正确配置缓存策略和响应控制头,可以确保缓存的有效性和一致性。配合缓存的主动刷新机制,可以进一步优化缓存管理,提高系统的性能和可用性。

5. 反向代理

当客户端向 Nginx 发送请求时,Nginx 并不会自己处理请求,而是将请求转发到一个或多个后端服务器。Nginx 收到后端服务器的响应后,再将其返回给客户端。可以隐藏后端服务器的真实 IP 地址,客户端只能看到 Nginx 的地址。这有助于增强安全性,避免后端服务器直接暴露在互联网上;可以控制哪些请求能够到达后端服务器,并实现 IP 限制、防火墙和认证等功能。

6. 健康检查(可选)

为了确保 Nginx 在分发请求时只将请求发送到健康的 Gateway 实例,Nginx 支持配置健康检查。健康检查可以自动剔除不健康的实例。
通过第三方模块(如 nginx-upstream-fair 或 nginx_upstream_check_module)可以实现更高级的健康检查。
以下是使用 nginx_upstream_check_module 的示例:

upstream gateway_servers {
    server gateway1:8080;
    server gateway2:8080;
    server gateway3:8080;

    # 配置健康检查
    check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    check_http_send "GET /health HTTP/1.1\r\nHost: localhost\r\n\r\n";
    check_http_expect_alive http_2xx http_3xx;
}

在上面的配置中:

  • interval=3000: 每隔 3 秒进行一次健康检查。
  • rise=2: 如果连续两次健康检查通过,认为服务是健康的。
  • fall=5: 如果连续 5 次健康检查失败,认为服务是不可用的。
  • check_http_send 和 check_http_expect_alive: 指定健康检查的请求和期望的响应状态码(如 2xx 或 3xx)。

7. 完整流程总结

1. 客户端请求:

  • 客户端发送请求,Nginx 作为反向代理首先接收请求。

2. Nginx 负载均衡:

  • Nginx 根据配置,将请求通过负载均衡策略分发到多个 Gateway 实例。
  • 如果某个 Gateway 实例不可用,健康检查模块可以将其剔除。

3. Gateway 处理请求:

  • Gateway 接收到请求后,根据自身配置的路由规则,将请求转发到下游的微服务。

4. 返回响应:

  • Gateway 将微服务的响应返回给 Nginx,Nginx 最终将响应发送给客户端。

通过 Nginx 的负载均衡功能,可以将请求高效地分发到多个 Spring Cloud Gateway 实例,确保系统的高可用性和可扩展性。可以根据实际需求选择不同的负载均衡策略(如轮询、最少连接、IP 哈希等),并通过健康检查模块确保只将请求发送给健康的实例。这种架构使得系统更具容错能力,并能够处理更大的请求量。

8. 正向代理

nginx不做正向代理,此处是做内容补充,扩展知识点

  1. 正向代理是一种代理服务器,通常用于帮助客户端访问外部网络资源。它充当客户端与目标服务器之间的中介,客户端通过正向代理发送请求,代理服务器代表客户端向目标服务器发出请求,并将目标服务器的响应转发给客户端。
  2. 主要用于访问受限资源,有时客户端所在的网络可能无法直接访问外部网络,使用正向代理可以帮助客户端突破这些网络障碍。
  3. 正向代理可以隐藏用户的真实 IP 地址,因为目标服务器只会看到代理服务器的 IP 地址,不能直接识别到客户端的真实身份。这有助于提高用户的匿名性和隐私保护。
  4. 正向代理可以缓存来自外部服务器的响应,如果客户端再次请求相同的资源,代理服务器可以直接从缓存中返回结果,而不必重新请求目标服务器。这有助于减少带宽消耗和加快访问速度。
  5. 在企业环境中,正向代理通常用于控制员工对互联网资源的访问。代理服务器可以根据公司策略限制对某些网站或服务的访问,并监控和记录员工的上网行为。

6. 反向代理 vs 正向代理

反向代理:客户端不知道请求的具体后端服务器,Nginx 在中间将请求转发给后端,后端也不知道客户端的具体信息,只有代理服务器(Nginx)知道两者之间的通信。

正向代理:客户端知道代理服务器,但目标服务器不知道请求的真实客户端。正向代理常用于翻墙、缓存、匿名访问等场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值