Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)

 

目录

服务网关Gateway_三大核心概念

服务网关Gateway_入门案例

服务网关Gateway_路由规则 

服务网关Gateway_Java API构建路由

服务网关Gateway_动态路由

服务网关Gateway_断言功能详解


服务网关Gateway_三大核心概念

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第1张图片

路由(Route) 

这是网关的基本构建块。它由一个ID,一个目标URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。

断言(predicate) 

输入类型是一个ServerWebExchange。我们可以使用它来匹配来自 HTTP请求的任何内容,例如headers或参数。

过滤(filter) 

可以在请求被路由前或者之后对请求进行修改。

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第2张图片

举个例子: 你想去动物园游玩,那么你买了一张熊猫馆的门票,只能进入熊猫馆的区域,而不能去犀牛管瞎转。因为没有犀牛馆的门票,进不去,就算走到门口,机器也不能识别。这里门票就相当于请求URL,熊猫馆相当于路由,而门口识别门卡的机器就是断言。然后我进入熊猫馆里面看到工作人员我想很有可能是过滤器,结果还真是,他在我进入馆之前拿手持设备对我全身扫描看看有没有危险品(请求前改代码),并且在我出熊猫馆之后要求再次检察看看我是否携带熊猫出馆(请求后改动代码)。这个工作人员相当于过滤器。 

总结 

首先任何请求进来,网关都会把它们拦住。根据请求的URL把它们分配到不同的路由上,路由上面会有断言,来判断请求能不能进来。进来之后会有一系列的过滤器对请求被转发前或转发后进行改动。 具体怎么个改动法,那就根据业务不同而自定义了。一般就是监控,限流,日志输出等等。

实时效果反馈

1.服务网关Gateway中路由作用是____。

A 路径匹配

B 匹配请求内容

C 被路由前或者之后对请求进行修改

D 以上都是错误

2.服务网关Gateway中断言作用是____。

A 路径匹配

B 匹配请求内容

C 被路由前或者之后对请求进行修改

D 以上都是错误 

服务网关Gateway_入门案例

创建cloud-gateway-gateway9527工程

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第3张图片

pom文件引入依赖 


        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
            org.projectlombok
            lombok
            1.18.22
        
    

新增application.yml

server:
 port: 9527
spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: http://localhost:8001
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/get/**

主启动类

@Slf4j
@EnableEurekaClient
@SpringBootApplication
public class GatewayMain {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain.class,args);
        log.info("********** GatewayMain 服务启动成功 *********");
   }
}

测试

启动注册中心 7001,7002

启动服务提供者8001

启动网关服务9527

请求http://localhost:9527/payment/index

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第4张图片 

服务网关Gateway_路由规则 

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第5张图片

Gateway 的路由规则主要有三个部分,分别是路由、断言(谓词)和过滤器。 

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第6张图片

路由

路由是 Gateway 的⼀个基本单元。

断言

也称谓词,实际上是路由的判断规则。一个路由中可以添加多个谓词的组合。 

 提示: 打个比方,你可以为某个路由设置⼀条谓词规则,约定访问路径的匹配规则为 Path=/bingo/*,在这种情况下只有以 /bingo 打头的请求才会 被当前路由选中。

过滤器 

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第7张图片

Gateway 组件使用了⼀种 FilterChain的模式对请求进行处理,每⼀个服务请求(Request)在发送到目标标服务之前都要被⼀串 FilterChain处理。同理,在 Gateway接收服务响应(Response) 的过程中也会被 FilterChain 处理⼀把。 

 实时效果反馈

1.Spring Cloud Gateway 中断言主要作用_____。

A 判断规则

B 注册发现服务

C 过滤请求

D 以上都不是

服务网关Gateway_Java API构建路由

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第8张图片

代码注入RouteLocator 

@Configuration
public class GatewayConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
        //设置路由
        routes.route("path_rote",r -> r.path("/guonei").uri("http://news.baidu.com
/guonei")).build();
        return routes.build();
   }
    
}

测试

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第9张图片

 实时效果反馈

1.服务网关Gateway通过Java API构建时需要实现__接口构建路由规则。

A Route

B RouteLocator

C RouteLocatorBuilder

D Builder

服务网关Gateway_动态路由

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第10张图片

默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。 



     org.springframework.cloud
     spring-cloud-starter-netflix-eureka-client

添加yml配置

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址 lb后跟提供服务的微服务的名
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**

注意: 需要注意的是uri的协议lb,表示启用Gateway的负载均衡的功能。

服务提供者payemt8001和payment8002工程controller添加方法 

@Value("${server.port}")
private String port;
/**
* 测试动态负载均衡
* @return
*/
@GetMapping("lb")
public String lb() {
   return port;
}

测试  

1、启动eureka服务注册发现 7001,7002

2、启动服务提供者payment8001,8002

3、启动网关服务测试

 

实时效果反馈

1.服务网关Gateway配置中lb指__。

A 过滤器

B 路由

C 目标地址

D 提供服务的微服务的名 

服务网关Gateway_断言功能详解

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第11张图片

一个请求在抵达网关层后,首先就要进行断言匹配,在满足所有断言之后才会进入Filter阶段。说白了Predicate就是一种路由规则, 通过Gateway中丰富的内置断言的组合,我们就能让一个请求找到对应的Route来处理。 

After路由断言 Factory 

After Route Predicate Factory采用一个参数——日期时间。在该日期时间之后发生的请求都将被匹配。

YML文件添加配置 

predicates:
   # 路径相匹配的进行路由
   - Path=/payment/**
   - After=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

注意: UTC时间格式的时间参数。

UTC时间格式的时间参数时间生成方法

public static void main(String[] args) {
    ZonedDateTime now = ZonedDateTime.now();
    System.out.println(now);
}

Before路由断言 Factory

Before Route Predicate Factory采用一个参数——日期时间。在该日期时间之前发生的请求都将被匹配。

YML文件添加配置

predicates:
   - Before=2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

Between 路由断言 Factory

Between 路由断言 Factory有两个参数,datetime1和datetime2。 在datetime1和datetime2之间的请求将被匹配。datetime2参数的实际时间必须在datetime1之后。

predicates:
   - Between=2030-02-15T14:54:23.317+08:00[Asia/Shanghai],2030-02-15T14:54:23.317+08:00[Asia/Shanghai]

 Cookie路由断言 Factory

顾名思义,Cookie验证的是Cookie中保存的信息,Cookie断言和上面介绍的两种断言使用方式大同小异,唯一的不同是它必须连同属性值一同验证,不能单独只验证属性是否存在。

YML文件添加配置 

predicates:
    # 路径相匹配的进行路由
   - Cookie=username,zzyy

使用postman测试

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第12张图片

Header路由断言 Factory 

这个断言会检查Header中是否包含了响应的属性,通常可以用来验证请求是否携带了访问令牌。

YML文件添加配置 

# 请求头要有X-Request-Id属性并且值为整数的正则表达
式
predicates:
 - Header=X-Request-Id, \d+

测试

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第13张图片

Host路由断言 Factory 

Host 路由断言 Factory包括一个参数:host name列表。使用Ant 路径匹配规则, . 作为分隔符。访问的主机匹配http或者https, baidu.com 默认80端口, 就可以通过路由。 多个 , 号隔开。

YML文件添加配置 

predicates:
- Host=tong

Host文件新增配置

127.0.0.1 tong

Method路由断言 Factory

这个断言是专门验证HTTP Method的,在下面的例子中,我们把 Method断言和Path断言通过一个and连接符合并起来,共同作用于路由判断,当我们访问“/gateway/sample”并且HTTP Method是 GET的时候,将适配下面的路由。

YML文件添加配置 

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**
           - Method=GET

Query路由断言 Factory

请求断言也是在业务中经常使用的,它会从ServerHttpRequest中的Parameters列表中查询指定的属性,有如下两种不同的使用方式。

 YML文件添加配置

spring:
 cloud:
   gateway:
     routes:
        # 路由ID,没有固定规则但要求唯一,建议配合服务名
       - id: payment_provider
          # 匹配后提供服务的路由地址
         uri: lb://CLOUD-PAYMENT-PROVIDER
          # 断言
         predicates:
            # 路径相匹配的进行路由
           - Path=/payment/**
            # 要有参数名称并且是正整数才能路由
           - Query=username,\d+

测试

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)_第14张图片

实时效果反馈

1.服务网关Gateway中在该日期时间之后发生的请求都将被匹配, 使用路由断言。

A After

B Before

C Cookie

D Header

2.服务网关Gateway中检查Header中是否包含了响应的属性,使用路由断言。

A After

B Before 

C Cookie

D Header

你可能感兴趣的:(Spring全家桶,Spring,Cloud,java,后端)