Spring Cloud Gateway网关内容?我觉得还OK

Spring Cloud Gateway是Spring官网基于Spring 5.0、 Spring Boot 2.0、Project Reactor等技术开发的网关服务。在我们使用微服务时,需要基于其中的Filter链提供网关基本的功能,即安全、监控、限流等任务。

Spring Cloud Gateway为微服务架构提供简单、有效且统一的API路由管理方式。这就是前面讲到spring cloud基础知识提及的网关部分的内容,即Gateway网关。

1、Gateway网关简介

Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器,我们可以将客户端发送的请求转发(路由)到对应的微服务。

Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。

当然,网关服务也是需要注册到Eureka注册中心的。

2、 Gateway的基本架构组成

Spring Cloud Gateway网关内容?我觉得还OK

其实就像上面说的那样。不管是PC端还是移动端的请求,或者是服务内部的调用都需要对服务的请求经过网关,让网关来实现决定或者动态路由的操作等等。其中,Gateway就是我们服务的统一入口。

3、核心概念

基于网关的内容我在网上找到了三个概念,它囊括在Gateway的架构内,接下来我们来看一下网关的核心概念

  • 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
  • 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的 ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于HTTP Request中的任何信息比如请求头和参数。
  • 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

我这儿的理解是这样:

  • 客户端向 Spring Cloud Gateway 发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序—即路由。
  • 当然如何进行确定请求和匹配,就是断言的概念了。即通过断言函数来定义匹配。
  • 那么基于如上图,请求url进入完routePredicate处理器后,那么就会到达Filter处理器对请求和响应进行该处理器下的内容。

也就是在DispatcherHandler总管下,我们的网关的断言、路由转发和动态代理基本就是涉及以上三个核心了

4、进行实例

4.1 基本实验

需求:通过网关系统xaf-gateway将包含有 /user 的请求路由到http://localhost:9000/user/1

步骤:

1、创建子Maven工程

最后的目录如下:

Spring Cloud Gateway网关内容?我觉得还OK

2、我们将其放置于父工程下,再额外导入依赖

<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>

我们要导入网关的相关包以及开启注册发现。

3、编写启动类

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

4、配置文件

server:
  port: 10010
spring:
  application:
    name: api-gateway
eureka:
  client:
    service-url:
      defaultZone: HTTP://127.0.0.1:10086/eureka
  instance:
    prefer-ip-address: true

这里我们设置网关的端口为10010,而Eureka已经设置好相对应的网址。

最终显示如下:

Spring Cloud Gateway网关内容?我觉得还OK

即ip为127.0.0.1

端口为10010

5、修改配置文件,这里我们需要将网关代理到user下

server:
  port: 10010
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: user-service-route
          #uri: HTTP://127.0.0.1:9000
          uri: lb://user-service
          predicates:
            - Path=/user/**
eureka:
  client:
    service-url:
      defaultZone: HTTP://127.0.0.1:10000/eureka
  instance:
    prefer-ip-address: true

这里我们将符合 Path 规则的一切请求,都代理到 uri 参数指定的地址本例中。并且我们将路径中包含有 /user/** 开头的请求, 代理到http://127.0.0.1:10010

6、启动测试

Spring Cloud Gateway网关内容?我觉得还OK

2021-11-02 09:19:50.272  INFO 7304 --- [ctor-http-nio-2] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client user-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=user-service,current list of Servers=[localhost:9001, localhost:9000],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:2;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]}
Flipping property: user-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

可以看到,我们注册到了9001和9000的两个user服务端口,并且能够以负载均衡来使用其中一个端口进行服务。

4.2 进阶实验

路由的前缀添加和删除:如果客户端的请求地址与微服务的服务地址如果不一致的时候,可以通过配置路径过滤器实现路径前缀的添加和去除。

1、添加前缀:对请求地址增加前缀路径之后再作为代理的服务地址。

http://127.0.0.1:10010/1 --> http://127.0.0.1:9000/user/1 添加前缀路径/user

2、去除前缀:将请求地址中路径去除一些前缀路径之后再作为代理的服务地址。

http://127.0.0.1:10010/api/user/1 --> http://127.0.0.1:9000/user/1 去除前缀路径/api

4.2.1 添加前缀

  cloud:
    gateway:
      routes:
        - id: user-service-route
          #uri: HTTP://127.0.0.1:9000
          uri: lb://user-service
          predicates:
            - Path=/**
          filters:
            # 添加请求路径的前缀
            - PrefixPath=/user

运行后如下:

Spring Cloud Gateway网关内容?我觉得还OK

我们看到,这个时候核心概念的filter就显现出来,对请求的url进行修改。即通过PrefixPath=/xxx来指定路由添加的前缀。

4.2.2 去除前缀

cloud:
	gateway:
		routes:
			# 路由id,可以随意写
			- id: user-service-route
			# 代理的服务地址
			uri: lb://user-service
			# 路由断言,可以配置映射路径
			predicates:
				- Path=/api/user/**
			filters:
				# 表示过滤1个路径,2表示两个路径,以此类推
				- StripPrefix=1

Spring Cloud Gateway网关内容?我觉得还OK

总结

我们创建了一个网关服务,用来对user-service进行动态路由的代理等内容,全文展现的是网关较为基本的部分,在实际生产生活中我们仍然需要进行更多的配置,由于新手小白暂时还没有查找到更多的资料,还请大家多多谅解。谢谢大家的阅读

上一篇:gateway-过滤器执行顺序


下一篇:Chromium mojo