Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >spring gateway 取代 nginx

spring gateway 取代 nginx

原创
作者头像
安宁
修改于 2020-07-07 02:18:17
修改于 2020-07-07 02:18:17
11.7K11
代码可运行
举报
运行总次数:1
代码可运行

最近学了 spring gateway,之前都是使用 nginx 作为反向代理服务器,但 nginx 比较生疏,现在有了 spring gateway,也可以进行反向代理,作为 java 程序员,配置起来更顺手,所以自然而然地想要用 spring gateway 替换掉 nginx。

1. 创建项目

创建 spring gateway 的项目,简单地添加依赖 org.springframework.cloud:spring-cloud-starter-gateway:2.3.0.RELEASE 后启动运行。

如果执行单元测试需要添加依赖 testImplementation 'org.springframework.boot:spring-boot-starter-validation',否则会报错,具体原因有待进一步分析。

2. 代理动态资源

spring gateway 提供了非常方便的配置,可以实现动态资源的转发和重定向,以下简单地配置转发:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: peacetrue-microservice-resource-server
          uri: lb://peacetrue-microservice-resource-server/
          predicates:
            - Path=/resource-server/**
        - id: peacetrue-region
          uri: lb://peacetrue-region/
          predicates:
            - Path=/regions/**
        - id: peacetrue-user
          uri: lb://peacetrue-user/
          predicates:
            - Path=/users/**
        - id: peacetrue-attachment
          uri: lb://peacetrue-attachment/
          predicates:
            - Path=/attachments/**

3. 代理静态资源

代理动态资源很容易,但对于静态资源目前只能在代码中声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public RouterFunction<ServerResponse> staticResourceLocator() {
        return RouterFunctions.resources("/static/**", new FileSystemResource("/Users/peacetrue/static/"));
}

上面的示例,路径以 /static/ 起始的静态资源,会从物理路径 /Users/peacetrue/static/ 下读取,例如:请求 https://peacetrue.cn/static/index.html 会匹配 /Users/peacetrue/static/index.html 文件。

3.1. 配置化支持

只能在代码中声明比较繁琐,简单地实现从配置读取:

StaticResourceProperties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@ConfigurationProperties("peacetrue")
public class StaticResourceProperties {
    /** 静态资源配置,key 表示路径规则,value 表示转发地址 */
    private Map<String, String> staticResources = new LinkedHashMap<>();
}

StaticResourceAutoConfiguration

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Configuration
@EnableConfigurationProperties(StaticResourceProperties.class)
public class StaticResourceAutoConfiguration {

    private StaticResourceProperties properties;

    public StaticResourceAutoConfiguration(StaticResourceProperties properties) {
        this.properties = properties;
    }

    @Bean
    @ConditionalOnMissingBean(name = "staticResources")
    public Map<String, String> staticResources() {
        return properties.getStaticResources();
    }

    @Bean
    @ConditionalOnBean(name = "staticResources", value = Map.class)
    public RouterFunction<ServerResponse> staticResourceLocator(ResourceLoader resourceLoader,
                                                                Map<String, String> staticResources) {
        //空 `Map` 其实不需要启用配置,但没有 `@ConditionalOnNotEmptyBean` 这种注解, https://stackoverflow.com/questions/62734544/spring-conditionalonproperty-for-bean[此问题^] 待优化
        if (staticResources.isEmpty()) return null;
        RouterFunctions.Builder builder = RouterFunctions.route();
        staticResources.forEach((key, value) -> {
            log.debug("添加静态资源配置: [{}] -> [{}]", key, value);
            builder.add(RouterFunctions.resources(key, resourceLoader.getResource(value)));
        });
        return builder.build();
    }

}

配置示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
peacetrue:
  static-resources:
    #路径需要转译
    '[/test/**]': file:/Users/docs/antora/modules/ROOT/pages/
    #配置物理路径地址
    '[/summarize/**]': file:/root/peacetrue/document-antora/public/
    #配置类路径地址
    '[/classpath/**]': classpath:public/

4. 案例分析

有一个 node 应用,前端监听在 3000 端口,后端监听在 8001 端口,想统一通过 https 端口 443 访问,并且前端直接挂在主域 peacetrue.cn 下。

之前使用 nginx 配置如下:

nginx 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
    listen       443 ssl http2 default_server;
    server_name  peacetrue.cn;
    #证书信息
    ssl_certificate 1_peacetrue.cn_bundle.crt;
    ssl_certificate_key 2_peacetrue.cn.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 所有请求默认转发到前端,因为前端直接挂在主域下
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:3000/;
    }

    # 以 games 起始的请求转发到后端
    location /games/ {
        include /etc/nginx/include/proxy.conf;
        proxy_pass http://localhost:8001/games/;
    }

    # 以 socket.io 起始的请求转发到后端
    location /socket.io/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://localhost:8001/socket.io/;
    }

    # 备案信息
    location /MP_verify_t4rKSxor2MowtjoC.txt {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://localhost:9000/MP_verify_t4rKSxor2MowtjoC.txt;
    }
}

现改为使用 spring gateway 配置如下:

spring gateway 初始配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#https 配置
server:
  port: 443
  ssl:
    key-store: file://${user.home}/peacetrue.cn.jks
    key-alias: peacetrue.cn
    key-store-password: ${MICROSERVICE_SSL_PASSWORD:password}

#配置动态代理
spring:
  cloud:
    gateway:
      routes:
        #前端转发到 3000
        - id: biog_front
          uri: http://localhost:3000/
          predicates:
            - Path=/**
        #后端转发到 8001
        - id: biog_back
          uri: http://localhost:8001/
          predicates:
            - Path=/games/**,/socket.io/**
#配置静态代理
peacetrue:
  static-resources:
    #备案信息
    '[/MP_verify_t4rKSxor2MowtjoC.txt]': file:/usr/share/nginx/html/MP_verify_t4rKSxor2MowtjoC.txt

路由会从上到下顺序匹配,所以代理所有请求的 biog_front 必须放在末尾,而且还要保证它的优先级低于静态代理,不然静态代理不会被执行。测试后发现,动态代理的优先级始终高于静态代理,那么就不能使用代理所有请求。调整配置如下:

spring gateway 子路径配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#配置动态代理
spring:
  cloud:
    gateway:
      routes:
        #如果是主域 https://peacetrue.cn/ 直接重定向到 https://peacetrue.cn/game/
        - id: biog_front
          uri: https://peacetrue.cn/game/
          predicates:
            - Path=/
          filters:
            - RedirectTo=302, https://peacetrue.cn/game/
        #如果是 /game 起始的,去掉 /game 后,进行转发
        - id: biog_front_game
          uri: http://localhost:3000/
          predicates:
            - Path=/game/**
          filters:
            - RewritePath=/game(?<segment>/?.*), $\{segment}

测试发现,访问 https://peacetrue.cn/ 会重定向到 https://peacetrue.cn/game/ ,界面可以正常打开,但静态资源全部失效:

静态资源仍然直接访问主域,应该是使用了绝对地址而非相对地址。这样只能找出前端所有的具体请求,然后分别配置代理:

spring gateway 静态资源配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: biog_front
          uri: http://localhost:3000/
          predicates:
            - Path=/,/*.js,/*.json,/static/**,/_next/**,/room/**

测试后发现一切正常,最终配置如下:

spring gateway 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  cloud:
    gateway:
      routes:
        - id: biog_front
          uri: http://localhost:3000/
          predicates:
            - Path=/,/*.js,/*.json,/static/**,/_next/**,/room/**
        - id: biog_back
          uri: http://localhost:8001/
          predicates:
            - Path=/games/**,/socket.io/**

peacetrue:
  static-resources:
    #不能直接使用 /MP_verify_t4rKSxor2MowtjoC.txt,必须使用匹配模式,简单的将末尾字符改为?: MP_verify_t4rKSxor2Mowtjo?.txt
    '[/MP_verify_t4rKSxor2Mowtjo?.txt]': file:/usr/share/nginx/html/MP_verify_t4rKSxor2MowtjoC.txt

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
赞?
赞?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Spring Cloud Gateway 的简单搭建
在 《服务注册、发现和远程调用》 这篇文章中介绍关于服务注册、发现和远程调用的一个 Demo,本文在这篇文章的基础上介绍如何使用 Spring Cloud Gateway 搭建一个网关。
码农UP2U
2021/10/27
1.8K0
网关 gateway_gateway网关集群
解释: 客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。 pre:这种过滤器在请求被路由之前调用。Filter在”pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等 post:这种过滤器在路由到微服务以后执行。在”post”类型的过滤器中可以做响应内容、响应头的修改、日志的输出、流量监控等有着非常重要的作用。 总结:路由转发+执行过滤器链。
全栈程序员站长
2022/11/10
1.5K0
同样是网关gateway取代了zuul,我们项目使用了这么多gateway特性!你有没有中标|Java 开发实战
gateway的诞生是因为zuul2.0一直跳票,既然这样gateway可以说是zuul的替代品。既然是替代品功能肯定是包含了zuul的。
啵啵肠
2023/11/29
1.3K0
Nginx 常用的基础配置(web前端相关方面)
最近很多朋友通过趣站网问到Nginx配置前端 web 服务,所以特地写了这篇文章;希望能够帮助更多的朋友。
趣站网
2023/02/07
1.5K0
Nginx 常用的基础配置(web前端相关方面)
Spring Cloud Gateway微服务网关
  官网文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/
别团等shy哥发育
2023/02/25
8140
Spring Cloud Gateway微服务网关
微服务路由网关之Spring Cloud Gateway入门使用教程
Spring Cloud Gateway是类似Nginx的网关路由代理,有替代原来Spring cloud zuul之意:
lyb-geek
2022/03/10
9920
gateway的基本使用
路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由
一个风轻云淡
2022/11/13
3700
gateway的基本使用
Gateway笔记
请求localhost:9527/get会转发到http://httpbin.org:80 ,并且添加了一个请求头
CBeann
2023/12/25
1790
Gateway笔记
微服务 Gateway 的基本配置
这样当我们访问 http://localhost:8001/payment/get/1 时其实和 http://localhost:9527/payment/get/1 是一样的,因为访问 9527 他会匹配路由然后转发到指定的地址。
wsuo
2020/10/10
8710
第一章:Mybatis与微服务注册
天蝎座的程序媛
2023/10/17
1900
第一章:Mybatis与微服务注册
Spring Cloud Gateway
Spring Cloud 全家桶中有个很重要的组件:网关。在 1.x 版本中使用的是 Zuul 网关,但是到了 2.x,由于Zuul的升级不断跳票,Spring Cloud 自己研发了一套网关组件:Spring Cloud Gateway。
灰太狼学Java
2022/06/17
7590
Spring Cloud Gateway
手把手教你玩转 Nginx 配置
在现代的互联网应用中,Nginx 已经成为了不可或缺的组成部分。无论是作为静态资源服务器、反向代理服务器、还是负载均衡器,Nginx 的高性能和灵活配置都让它备受青睐。
南山竹
2024/07/03
1.5K0
手把手教你玩转 Nginx 配置
SpringCloud集成Gateway
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
大忽悠爱学习
2021/12/07
1.7K0
SpringCloud集成Gateway
SpringCloud之GateWay
传统的Web框架,比如说: Struts2,SpringMVC等都是基于Servlet APl与Servlet容器基础之上运行的。
shaoshaossm
2022/12/27
7000
SpringCloud之GateWay
spring cloud gateway
在单体应用的架构中, 我们都习惯用Nginx 作为反向代理, 以实现高可用架构. 架构图类似这样:
ruochen
2021/11/23
7030
Spring Cloud Gateway 2.1.0 中文官网文档
该项目提供了一个建立在Spring Ecosystem之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由,并为他们提供切面,例如:安全性,监控/指标 和弹性等。
高广超
2019/03/15
59.5K1
Spring Cloud Gateway 2.1.0 中文官网文档
spring cloud gateway 简介
在单体应用的架构中, 我们都习惯用Nginx 作为反向代理, 以实现高可用架构. 架构图类似这样:
ruochen
2021/12/07
1.3K0
Spring Cloud Gateway 参考指南
该项目提供了一个基于Spring生态的API网关。Spring Cloud Gateway。Spring Cloud Gateway旨在提供一个种简单有效的方式去路由API,并给API提供相应关注点:如:security、monitoring/metrics和resiliency。
阿提说说
2022/12/02
4.5K0
GateWay 服务网关
Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;
用户9615083
2022/12/25
5390
GateWay 服务网关
Gateway 网关路由、断言、过滤
Spring Cloud 全家桶中有个很重要的组件:网关。在 1.x 版本中使用的是 Zuul 网关,但是到了 2.x,由于Zuul的升级不断跳票,Spring Cloud 自己研发了一套网关组件:Spring Cloud Gateway。
BUG弄潮儿
2021/06/25
1.2K0
Gateway 网关路由、断言、过滤
相关推荐
Spring Cloud Gateway 的简单搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验