前端带你学后端系列 ⑦【网关】

前端带你学后端系列 ⑦【网关】

  • Ⅰ Nginx
    • ① 概念
    • ② 关于正向代理与反向代理
    • ③ Nginx能帮助我们做些什么
    • ④ Nginx常用--静态资源优化与动态内容缓存
      • ① 静态资源优化
      • ② 动态内容缓存
    • ⑤ Nginx 核心模块
  • Ⅱ SpringCloud Gateway
    • ① 概念
    • ② 网关的作用
    • ③ 网关的核心概念
    • ④ 网关的用法
      • ① RoutePredicateFactory 路由工厂类(断言)
      • ② GatewayFilter与GlobalFilter 路由过滤器
    • ⑤ 基于注册中心Nacos的动态路由
    • ⑥ 接入Sentinel 限流
    • ⑦ 跨域问题

Ⅰ Nginx

① 概念

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器

② 关于正向代理与反向代理

正向代理,举个例子:我们要访问github官网。但是由于网站在国外,我们访问不到,这个时候,我们可以购买一个服务器,这个服务器就是正向代理。

正向代理的概念:正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

前端带你学后端系列 ⑦【网关】_第1张图片

反向代理,举个例子:我们访问淘宝的时候,会访问http://www.taobao.com。这个时候我们并不知道具体访问的是哪个服务器(比如淘宝布了n个服务器),但是依然可以返回我们想要的数据。这个代理就是反向代理。

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

③ Nginx能帮助我们做些什么

  1. 正向代理
  2. 反向代理
  3. 动静分离
  4. 负载均衡
  5. 集群高可用

④ Nginx常用–静态资源优化与动态内容缓存

① 静态资源优化

  1. 设置缓存过期时间
    静态资源如图片、CSS和JavaScript等一般不会频繁变动,因此可以通过设置缓存过期时间来减少服务器压力。在Nginx配置文件中,可以使用expires指令设置静态资源的缓存过期时间。
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
	expires:7d
}
  1. 启用gzip压缩

启用gzip压缩可以有效减小传输文件的大小,提升页面加载速度。在Nginx配置文件中,可以使用gzip指令来开启gzip压缩。

gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain text/css application/javascript;
gzip_vary on;

② 动态内容缓存

比如有个需求,对于状态码200的响应,缓存保留5分钟;对于404的响应,缓存保留1分钟。

http {
	proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
	server {
		listen 80;
		server_name example.com;

	location / {
  		proxy_cache my_cache;
  		proxy_pass http://backend;
  		proxy_cache_valid 200 5m;
  		proxy_cache_valid 404 1m;
	}
}

这个配置启用了一个名为"my_cache"的缓存区,并将其设置在"/path/to/cache"路径中。这里还设置了缓存过期时间,对于状态码200的响应,缓存保留5分钟;对于404的响应,缓存保留1分钟

⑤ Nginx 核心模块

  1. 核心模块:HTTP模块、EVENT模块和MAIL模块
  2. 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  3. 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

HTTP模块:用于进行http协议信息的一些配置

EVENT模块:用于nginx工作模式的配置

MAIL模块:模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。

Nginx实践

Ⅱ SpringCloud Gateway

① 概念

API网关是一个服务器,是系统对外的唯一入口。H5、APP、PC访问的统一入口。

且提供统一的路由方式。

前端带你学后端系列 ⑦【网关】_第2张图片

前端带你学后端系列 ⑦【网关】_第3张图片

② 网关的作用

1 同一对外接口,比如app,网站,客户端都通过网关来访问服务。
2 可以进行统一鉴权。
3 服务限流
4 全链路跟踪

③ 网关的核心概念

前端带你学后端系列 ⑦【网关】_第4张图片

④ 网关的用法

① RoutePredicateFactory 路由工厂类(断言)

路由断言工厂RoutePredicateFactory包含的主要实现类如图所示,包括Datetime、请求的远程地址、路由权重、请求头、Http地址、请求方法、请求路径和请求参数等类型的路由断言。

前端带你学后端系列 ⑦【网关】_第5张图片

Datetime–AfterRoutePredicateFactory

spring:
  cloud:
    gateway:
      enabled: true
      routes:
      - id: app-service001 /**路由唯一ID**/
        uri: http://localhost:9000   /** 目标URI**/
        predicates:   /**断言,为真则匹配成功**/
        /**匹配亚洲上海时间 2021-11-29:17:42:47 以后的请求**/
        - After=2021-11-29T17:42:47.000+08:00[Asia/Shanghai]
        - Path=/app1/** 配置规则Path,如果是app1开头的请求,则会将该请求转发到目标URL**/

同样BeforeRoutePredicateFactory是在某个时间之前执行。
BetweenRoutePredicateFactory有两个参数,datetime1、datetime2 (Java ZonedDateTime)。匹配发生在 datetime1之后和datetime2之前的请求

CookieRoutePredicateFactory

CookieRoutePredicateFactory可以接收两个参数,一个是 Cookie 名称,一个是正则表达式,路由规则会通过获取对应的 Cookie 名称值和正则表达式去匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。

以下路由匹配具有名为chocolate的cookie,且该 cookie的值以 ch.p开头的请求。

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: https://example.org
        predicates:
        - Cookie=chocolate, ch.p

HeaderRoutePredicateFactory

一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: https://example.org
        predicates:
        - Header=X-Request-Id, \d+

HostRoutePredicateFactory

HostRoutePredicateFactory 接收一组参数,一组匹配的域名列表。它通过参数中的主机地址作为匹配规则。

以下配置表示消息头中的Host以somehost.org或者anotherhost.org结尾则会匹配转发。

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: https://example.org
        predicates:
        - Host=**.somehost.org,**.anotherhost.org

MethodRoutePredicateFactory

MethodRoutePredicateFactory 需要methods的参数,它是一个或多个参数,使用HTTP方法来匹配。

如果请求方法是GET或POST,则此路由匹配。

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: https://example.org
        predicates:
        - Method=GET,POST

PathRoutePredicateFactory

PathRoutePredicateFactory接收一个匹配路径的参数。使用请求路径来匹配。

如果请求路径是,例如:/red/1、 /red/1/、 /red/blueor、/blue/green ,则此路由匹配。

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: https://example.org
        predicates:
        - Path=/red/{segment},/blue/{segment}

QueryRoutePredicateFactory

QueryRoutePredicateFactory接受两个参数,请求参数和可选的regexp(Java正则表达式)。

以下配置表示,必须包含一个名为green的参数,并且其值匹配正则表达式 gree.。

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
        - Query=green,gree.

WeightRoutePredicateFactory

WeightRoutePredicateFactory有两个参数:group 和 weight(一个int数值)。权重是按组计算的。

该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发到weightlow.org。

spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

② GatewayFilter与GlobalFilter 路由过滤器

过滤器将会对请求响应进行处理.。比如添加参数、URL重写等。

局部过滤器过滤单个路由,全局过滤器过滤整体路由。

AddRequestHeader

将X-Request-red:blue消息头添加到所有匹配请求的下游请求消息头中

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-red, blue

AddRequestParameter

red=blue添加到下游请求参数中

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        filters:
        - AddRequestParameter=red, blue

AddResponseHeader 同样如此




DedupeResponseHeader

DedupeResponseHeader 剔除重复的响应头,接受一个name参数和一个可选strategy参数。name可以包含以空格分隔的标题名称列表。

如果网关 CORS 逻辑和下游逻辑都添加了响应头Access-Control-Allow-Credentials和Access-Control-Allow-Origin响应头的重复值,这将删除它们。

spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: https://example.org
        filters:
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

RedirectTo

RedirectTo需要两个参数,status和url。该status参数应该是300系列HTTP重定向代码,如301,url参数应该是一个有效的URL。这是消息头的Location值。

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - RedirectTo=302, https://acme.org

⑤ 基于注册中心Nacos的动态路由

在之前的案例中,我们的路由都是写在配置文件中的,在微服务架构中,后台有很多个,如果每一个都需要配置,那么肯定是不现实的,所以Spring Cloud Gateway提供了基于注册中心服务发现机制的动态路由。

Spring Cloud Gateway支持与Eureka、Nacos、Consul等整合开发,根据service ld自动从注册中心获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例时不用修改Gateway的路由配置。

前端带你学后端系列 ⑦【网关】_第6张图片

前端带你学后端系列 ⑦【网关】_第7张图片

⑥ 接入Sentinel 限流

后面的文章将具体介绍

⑦ 跨域问题

spring:
    cloud:
        gateway:
          globalcors:
            cors-configurations:
              '[/**]':
                allowedOrigins: "*"
                allowedHeaders: "*"
                allowedMethods: "*"
          default-filters:
          - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST

你可能感兴趣的:(前端带你学后端系列,前端,java,spring,后端,gateway)