SpringCloud学习-第四节-服务网关

本文深入介绍了SpringCloud Gateway,它作为SpringCloud生态中的微服务网关,基于Webflux的reactor-netty实现。文章详细讲解了Gateway的动态路由、断言Predicate和过滤器Filter的使用,以及如何通过Eureka实现服务发现。同时,展示了自定义过滤器的实现,用于增强网关的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Gateway

1.概述

SpringCloud Gateway 使用Webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架。
主要用于:反向代理、鉴权、流量控制、熔断、日志监控

2.特性

(1)动态路由:能够匹配任何请求属性;
(2)可以对路由指定 Predicate(断言)和 Filter(过滤器);
(3)集成Hystrix的断路器功能;
(4)集成 Spring Cloud 服务发现功能;
(5)易于编写的 Predicate(断言)和 Filter(过滤器);
(6)请求限流功能;
(7)支持路径重写。

3.三大核心概念

(1)Route(路由)

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由

(2)Predicate(断言)

开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

(3)Filter(过滤)

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。

4.网关搭建

(1)依赖jar

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

(2)配置文件

server:
  port: 9527

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

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

eureka:
  instance:
    hostname: springcloud-gateway-service
    prefer-ip-address: true
    instance-id: gateway
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

(3)启动类

package cpm.zj.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 概述:
 * 作者:zhujie
 * 创建时间:2021/12/16 13:08
 */
@SpringBootApplication
@EnableEurekaClient
public class GatewayAppication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayAppication.class,args);
    }
}

5.Gateway动态路由

(1)只需修改网关搭建张的配置文件,开启从注册中心动态创建路由功能

server:
  port: 9527

spring:
  application:
    name: springcloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
          #uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://SPRINGCLOUD-PAYMENT #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/query/**         # 断言,路径相匹配的进行路由

#        - id: payment_routh2 #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
#          predicates:
#            - Path=/payment/hystrix/timeout/**         # 断言,路径相匹配的进行路由

eureka:
  instance:
    hostname: springcloud-gateway-service
    prefer-ip-address: true
    instance-id: gateway
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

6.Predicate的使用

  • After Route Predicate:在某个时间之后,断言生效
  • Before Route Predicate:在某个时间之前,断言生效
  • Between Route Predicate:在某个时间段之内,断言生效
  • Cookie Route Predicate:需要两个参数,一个是 Cookie name ,一个是正则表达式,判断某个cookie的值是否符合,符合,断言生效,否则,不生效
  • Header Route Predicate:一个是属性名称和一个正则表达式,请求头属性值和正则表达式匹配则执行
  • Host Route Predicate: 接收一组匹配的域名列表
  • Method Route Predicate:判断是GET还是POST请求,进行匹配
  • Path Route Predicate:匹配请求路径
  • Query Route Predicate:支持传入两个参数,一个是属性名,一个为属性值,属性值可以是正则表达式

7.Filter

(1)简介

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用。

Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生

(2)分类

GatewayFilter :31种
GlobalFilter:10种

(3)自定义过滤器

package cpm.zj.springcloud.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * 概述:
 * 作者:zhujie
 * 创建时间:2021/12/16 14:23
 */
@Component
public class MyFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("time:"+new Date()+"\t 执行了自定义的全局过滤器: "+"MyLogGateWayFilter"+"hello");

        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null) {
            System.out.println("****用户名为null,无法登录");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值