SpringCloud之 Gateway路由网关

这篇具有很好参考价值的文章主要介绍了SpringCloud之 Gateway路由网关。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


提示:以下是本篇文章正文内容,SpringCloud 系列学习将会持续更新

springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

Gateway 路由网关

官网地址:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/

说到路由,想必各位一定最先想到的就是家里的路由器了,那么我们家里的路由器充当的是一个什么角色呢?

我们知道,如果我们需要连接互联网,那么就需要将手机或是电脑连接到家里的路由器才可以,而路由器则连接光猫,光猫再通过光纤连接到互联网,也就是说,互联网方向发送过来的数据,需要经过路由器才能到达我们的设备。而路由器充当的就是数据包中转站所有的局域网设备都无法直接与互联网连接,而是需要经过路由器进行中转,我们一般说路由器下的网络是内网,而互联网那一端是外网。
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关
我们的局域网设备,无法被互联网上的其他设备直接访问,肯定是能够保证到安全性的。并且互联网发送过来的数据,需要经过路由器进行解析,识别到底是哪一个设备的数据包,然后再发送给对应的设备。

而我们的微服务也是这样,一般情况下,可能并不是所有的微服务都需要直接暴露给外部调用,这时我们就可以使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并且转发给多个相同微服务实例也可以实现负载均衡
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关
在之前,路由的实现一般使用 Zuul,但是已经停更,而现在新出现了由 SpringCloud 官方开发的Gateway 路由,它相比 Zuul 不仅性能上得到了一定的提升,并且是官方推出,契合性也会更好,所以我们这里就主要讲解 Gateway。

回到目录…

一、部署网关

🍍①添加依赖

现在我们来创建一个新的项目 gateway-server,作为我们的网关,这里需要添加两个依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

第一个依赖就是网关的依赖,而第二个则跟其他微服务一样,需要注册到 Eureka 才能生效,注意不要添加 Web 依赖,使用的是 WebFlux 框架。

🍍②设置配置文件

我们来完善一下配置文件:设置端口、注册到 Eureka 中

server:
  port: 8500
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8801/eureka, http://localhost:8802/eureka
spring:
  application:
    name: gateway

🍍③创建启动类

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

现在就可以启动了:
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

🍍④路由功能配置

现在还没有配置任何的路由功能,我们接着将路由功能进行配置,给刚刚的配置文件添加配置项:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes: # 配置路由,注意这里是个列表,每一项都包含了很多信息
      - id: borrow-service       # 路由名称
        uri: lb://borrowservice  # 路由的地址,lb表示使用负载均衡到微服务,也可以使用 http 正常转发
        predicates:              # 路由规则,断言什么请求会被路由
        - Path=/borrow/**        # 只要是访问的这个路径,一律都被路由到上面指定的服务

路由规则的详细列表(断言工厂列表)在这里:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories,可以指定多种类型,包括指定时间段、Cookie 携带情况、Header 携带情况、访问的域名地址、访问的方法、路径、参数、访问者IP 等。也可以使用配置类进行配置,但是还是推荐直接配置文件,省事。

🍍⑤路由访问服务

此时依然可以通过原有的服务地址进行访问:http://localhost:8082/borrow/2
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

我们现在也可以直接通过路由来访问我们的服务了:http://localhost:8500/borrow/2
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

这样我们就可以将不需要外网直接访问的微服务全部放到内网环境下,而只依靠网关来对外进行交涉。

回到目录…

二、路由过滤器

2.1 单个过滤器: 配置文件

路由过滤器支持以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应,路由过滤器的范围是某一个路由,跟之前的断言一样,Spring Cloud Gateway 也包含许多内置的路由过滤器工厂。
详细列表:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

比如,我们现在希望在请求到达时,在请求头中添加一些信息再转发给我们的服务,那么这个时候就可以使用路由过滤器来完成,我们只需要对配置文件进行修改:

spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: borrow-service
        uri: lb://borrowservice
        predicates:
        - Path=/borrow/**
      # 继续添加新的路由配置,这里就以书籍管理服务为例
      - id: book-service
        uri: lb://bookservice
        predicates:
        - Path=/book/**
        filters:   # 添加过滤器
        - AddRequestHeader=Test, HelloBook!
        # AddRequestHeader 就是添加请求头信息,其他工厂请查阅官网

接着我们在 BookController 中打印一下请求头的日志,看看是不是成功添加了:

@Slf4j
@RestController
public class BookController {
    @Resource
    private BookService bookService;
    @GetMapping("/book/{bid}")
    public Book findBookById(@PathVariable("bid") int bid, HttpServletRequest req) {
        log.info("book-service 的请求头: " + req.getHeader("Test"));
        return bookService.getBookById(bid);
    }
}

🔎当我们不通过 Gateway 访问我们的图书管理服务时:就没有请求头。
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

🔎现在我们通过 Gateway 访问我们的图书管理服务时:就成功获取到网关添加的请求头了。
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

回到目录…

2.2 全局过滤器: 自定义类

除了针对于某一个路由配置过滤器之外,我们也可以自定义全局过滤器,它能够作用于全局

比如我们要实现拦截没有携带指定请求参数的请求

①自定义全局过滤器类,实现 GlobalFilter 接口,重写 filter() 方法,实现具体过滤策略。

@Slf4j
@Component  // 需要注册为Bean
public class TestFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 先获取 ServerHttpRequest 对象,注意不是 HttpServletRequest
        ServerHttpRequest request = exchange.getRequest();
        // 打印一下所有的请求参数
        log.info("请求参数: " + request.getQueryParams());
        // 判断是否包含 val 参数,且参数值为 1
        List<String> value = request.getQueryParams().get("val");
        if(value != null && value.contains("1")) {
            // 将 ServerWebExchange 向过滤链的下一级传递(跟 JavaWeb 中介绍的过滤器其实是差不多的)
            return chain.filter(exchange);
        }else {
            // 直接在这里拦截,然后返回响应
            return exchange.getResponse().setComplete();
        }
    }
}

可以看到结果:成功实现规则判断和拦截操作。
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关
springcloudgateway路由规则配置,SpringCloud,spring cloud,gateway,spring,路由网关

②当然,过滤器肯定是可以存在很多个的,所以我们可以手动指定过滤器之间的顺序

  • Order 的值越小,优先级越高。
  • 无论是在配置文件中的单个路由过滤器,还是全局路由过滤器,都会受到 Order 值影响。
    (单个路由的过滤器 Order 值按从上往下的顺序从1开始递增)。
  • 最终是按照 Order 值决定哪个过滤器优先执行,当 Order 值一样时,全局路由过滤器执行 优于 单独的路由过滤器执行。

配置文件中的单个路由过滤器 Order 值:

filters:   # 过滤器
  - AddRequestHeader=Test, HelloBook!                     # Order = 1
  - AddRequestHeadersIfNotPresent=X-Request-Color-1:blue  # Order = 2
  - AddRequestParameter=red, blue                         # Order = 3

全局路由过滤器指定 Order 值: 实现 Ordered 接口,默认为 0

@Component
public class TestFilter implements GlobalFilter, Ordered {   // 实现 Ordered 接口  
    @Override
    public int getOrder() {
        return 0;
    }
}

回到目录…


总结:
提示:这里对文章进行总结:
本文是对SpringCloud的学习,学习了部署 Gateway路由网关,并且在配置文件中设置单个路由过滤器,以及通过自定义类实现全局过滤器的方法。之后的学习内容将持续更新!!!
文章来源地址https://www.toymoban.com/news/detail-737480.html

到了这里,关于SpringCloud之 Gateway路由网关的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    SpringCloud - Spring Cloud 之 Gateway网关,Route路由,Predicate 谓词/断言,Filter 过滤器(十三)

    阅读本文前可先参考 ​​​​​​SpringCloud - Spring Cloud根/父项目,开发准备(二)_MinggeQingchun的博客-CSDN博客 SpringCloud - Spring Cloud 之 Gateway网关(十三)_MinggeQingchun的博客-CSDN博客 Web 有三大组件(监听器 过滤器 servlet),Spring Cloud GateWay 最主要的功能就是路由转发,而在定义

    2024年02月14日
    浏览(9)
  • 【SpringCloud Alibaba】Nacos Config配置管理与Gateway 网关

    【SpringCloud Alibaba】Nacos Config配置管理与Gateway 网关

    目录 一、Config 远程配置 1.1 config 介绍 1.2 bootstrap.yml 配置文件 二、Gateway 网关 2.1 gateway 介绍 2.2 gateway 使用 2.2.1 方式一 2.2.2 方式二(动态路由)         微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大 量的服务。

    2024年02月02日
    浏览(39)
  • 39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

    39.SpringCloud—配置管理nacos、远程调用Feign、服务网关Gateway

    目录 一、SpringCloud。 (1)Nacos配置管理。 (1.1)nacos中添加配置文件、微服务引入依赖,并配置bootstrap.yml文件。 (1.2)获取配置文件信息,实现热更新。 (1.3)多环境配置共享。 (1.4)多服务共享配置。 (2)http客户端Feign。 (2.1)RestTemplate方式调用存在的问题。 (2.2)

    2024年02月10日
    浏览(40)
  • SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)

    SpringCloud + Gateway(网关) + Nacos(注册中心+配置中心)+ Dubbo(内部服务调用)

    Apache Dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力 1、协议支持方面 Feign更加优雅简单。Feign是通过REST API实现的远程调用,基于Http传输协议,服务提供者需要对外暴露Http接口供消费者调用,服务粒度是http接口级的。通过短连接的方式进行通信,

    2024年02月06日
    浏览(592)
  • SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

    Nacos除了可以做注册中心,同样可以做配置管理来使用。 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以

    2024年02月13日
    浏览(37)
  • 谷粒商城p46-配置网关路由与路径重写 Gateway配置网关路由和路径重写

    http://t.csdn.cn/Vdti6 http://t.csdn.cn/Vdti6 http://t.csdn.cn/pjLyz http://t.csdn.cn/pjLyz 前端页面的请求会发送到上述前缀地址 url:与上面的拼接 idea-gateway的yml文件 网关路由与路径重写

    2024年02月09日
    浏览(8)
  • 网关 GateWay 的使用详解、路由、过滤器、跨域配置!

    网关 GateWay 的使用详解、路由、过滤器、跨域配置!

    SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中提供的WebFlux,是一种响应式编程的实现,性能更加优越。 Zuul的实现方式比较老式

    2024年02月07日
    浏览(39)
  • 网关 GateWay 的使用详解、路由、过滤器、跨域配置

    网关 GateWay 的使用详解、路由、过滤器、跨域配置

    SpringCloudGateway网关是所有微服务的统一入口。 1.1 它的主要作用是: 反向代理(请求的转发) 路由和负载均衡 身份认证和权限控制 对请求限流 1.2 相比于Zuul的优势: SpringCloudGateway基于Spring5中提供的WebFlux,是一种响应式编程的实现,性能更加优越。 Zuul的实现方式比较老式

    2024年02月14日
    浏览(37)
  • Spring-cloud-gateway 路由配置方式及匹配规则

    1.1 基础路由配置⽅式 如果请求的⽬标地址,是单个的URI资源路径,配置⽂件实例如下: 各字段含义如下。 id:我们⾃定义的路由 ID,保持唯⼀ uri:⽬标服务地址 predicates:路由条件,Predicate 接受⼀个输⼊参数,返回⼀个布尔值结果。该接⼝包含多种默 认⽅法来将 Predicate

    2024年02月04日
    浏览(11)
  • 【微服务笔记17】微服务组件之Gateway实现动态路由、配置路由规则、路由过滤器

    【微服务笔记17】微服务组件之Gateway实现动态路由、配置路由规则、路由过滤器

    这篇文章,主要介绍微服务组件之Gateway实现动态路由、配置路由映射规则、路由过滤器。 目录 一、动态路由配置 1.1、动态URI路由配置 (1)引入eureka客户端依赖 (2)添加路由配置 1.2、服务名称转发配置 二、断言配置规则 2.1、路由断言工厂类 2.2、Path路径匹配 2.3、Query请求

    2023年04月23日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包