springcloud-gateway网关


typora-root-url: img

Gateway 网关

网关概述

  • 网关旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
  • 在微服务架构中,不同的微服务可以有不同的网络地址,各个微服务之间通过互相调用完成用户请求,客户
    端可能通过调用N个微服务的接口完成一个用户请求。
    • 存在的问题:
      • 客户端多次请求不同的微服务,增加客户端的复杂性
      • 认证复杂,每个服务都要进行认证
      • http请求不同服务次数增加,性能不高
  • 网关就是系统的入口,封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、缓存、负载均衡、流量管控、路由转发等
  • 在目前的网关解决方案里,有Nginx+ Lua、Netflix Zuul 、Spring Cloud Gateway等等

在这里插入图片描述

快速入门项目搭建

1、搭建网关模块
2、导入依赖
​ 网关坐标,eureka 客户端坐标
3、编写启动类
4、编写配置文件
网关配置-----关键点
5、启动测试

1、搭建一个普通的消费端,提供端,Eureka注册中心,再搭建一个网关模块

在这里插入图片描述

2、导入依赖

<!--引入gateway 网关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

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

3、编写启动类

@SpringBootApplication
@EnableEurekaClient
public class ApiGatewayApp {

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

}

4、编写配置文件

server:
 port:80  # http协议默认端口80,可以不写,为了提高用户体验。
 
spring:
 application:
  name: api-gateway-server
  
 cloud:
  gateway:
   routes:
   - id: gateway-provider        # 唯一标识,默认是一个UUID
     uri: http://localhost:8001/ # 转发路径
     predicates:				 # 条件,用于请求网关路径的匹配规则
     - Path=/goods/**		     # 例如请求是 http://localhost:80/goods/findOne/1
     							 # goods/findOne/1 截取后面的路径进行比较,如果符合就将uri和								  # Path进行拼接,将请求发送到指定的服务端
     
Gateway 网关路由配置 – 静态路由

快速入门案例里的路由配置就是静态路由配置,转发路径uri是固定写死的。
存在问题,如果网关里的配置上百台服务器接口,发生变化重写网关代价太大。

server:
 port:80  # http协议默认端口80,可以不写,为了提高用户体验。
 
spring:
 application:
  name: api-gateway-server
  
 cloud:
  gateway:
   routes:
   - id: gateway-provider        # 唯一标识,默认是一个UUID
     uri: http://localhost:8001/ # 转发路径
     predicates:				 # 条件,用于请求网关路径的匹配规则
     - Path=/goods/**		     # 例如请求是 http://localhost:80/goods/findOne/1
     							 # goods/findOne/1 截取后面的路径进行比较,如果符合就将uri和								  # Path进行拼接,将请求发送到指定的服务端
   - id: gateway-provider       
     uri: http://localhost:9000/ 
     predicates:				 
     - Path=/order/**		     
Gateway 网关路由配置 – 动态路由

步骤

1、引入eureka-client配置

2、修改uri属性:uri: lb://服务名称 这儿就说明为什么要引入Eureka

在这里插入图片描述

1、引入eureka-client配置

  • 引入Eureka-client依赖

  • 启动类开启Eureka-client服务

    在上面的入门案例代码中已经引入对应依赖,启动类注解也已经添加

2、修改uri属性:uri: lb://服务名称

server:
  port: 80

spring:
  application:
    name: api-gateway-server

  cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则

      - id: gateway-provider
        # 静态路由
        # uri: http://localhost:8001/
        # 动态路由
        uri: lb://GATEWAY-PROVIDER
        predicates:
        - Path=/goods/**
       
      - id: gateway-consumer
        # uri: http://localhost:9000
        uri: lb://GATEWAY-CONSUMER
        predicates:
        - Path=/order/**
      

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
小结

请求处理流程:前端发送请求到网关,默认80端口,所以可以不指定端口号。

1、网关接收到请求,根据predicates: - Path 判断这个请求发送到那里去

2、从Eureka注册中心,动态获取服务端的地址,将完整地址进行拼接后发送到对应的服务接口

Gateway 网关路由配置 – 微服务名称配置

以后业务功能多了之后,难免会发生撞车。 微服务名称配置 就是在原有的请求前面加上一个表示,防止地址撞车,一般都设置为Eureka的服务名称
http://localhost:80/gateway-consumer/goods/findOne/1
而且配置之后,不是一定要加这个前缀,只要没撞车,也是可以不加前缀进行访问

discovery:
 locator:
  enabled: true # 设置为true 请求路径前可以添加微服务名称
  lower-case-service-id: true # 允许为小写
Gateway 过滤器

概述

  • Gateway 支持过滤器功能,对请求或响应进行拦截,完成一些通用操作。
  • Gateway 提供两种过滤器方式:“pre”和“post”
  • pre 过滤器,在转发之前执行,可以做参数校验、权限校验、流量监控、日志输出、协议转换等。
  • post 过滤器,在响应之前执行,可以做响应内容、响应头的修改,日志的输出,流量监控等。
  • Gateway 还提供了两种类型过滤器
    • GatewayFilter:局部过滤器,针对单个路由
    • GlobalFilter :全局过滤器,针对所有路由

在这里插入图片描述

Gateway 过滤器 – 局部过滤器
  • GatewayFilter 局部过滤器,是针对单个路由的过滤器。
  • 在Spring Cloud Gateway 组件中提供了大量内置的局部过滤器,对请求和响应做过滤操作。
  • 遵循约定大于配置的思想,只需要在配置文件配置局部过滤器名称,并为其指定对应的值,就可以让其生效

直接在yml文件的对应路由配置下面加属性即可,那么就只有这配置了的路由才有过滤器功能

cloud:
    # 网关配置
    gateway:
      # 路由配置:转发规则
      routes: #集合。
      # id: 唯一标识。默认是一个UUID
      # uri: 转发路径
      # predicates: 条件,用于请求网关路径的匹配规则
      # filters:配置局部过滤器的

      - id: gateway-provider
        # 静态路由
        # uri: http://localhost:8001/
        # 动态路由
        uri: lb://GATEWAY-PROVIDER
        predicates:
        - Path=/goods/**
        filters:
        - AddRequestParameter=username,zhangsan

      - id: gateway-consumer
        # uri: http://localhost:9000
        uri: lb://GATEWAY-CONSUMER
        predicates:
        - Path=/order/**
Gateway 过滤器 – 全局过滤器
  • GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。
  • Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。置,系统初始化时加载,并作用在每个路由上
  • 自定义全局过滤器步骤:
    1. 定义类实现 GlobalFilter 和 Ordered接口
    2. 复写接口方法
    3. 完成逻辑处理

定义类实现 GlobalFilter 和 Ordered接口

@Component
public class MyFilter implements GlobalFilter, Ordered {
    //复写接口方法
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        //完成逻辑处理
        System.out.println("自定义全局过滤器执行了~~~");

        return chain.filter(exchange);//放行
    }

    /**
     * 过滤器排序
     * @return 数值越小 越先执行
     */
    //复写接口方法
    @Override
    public int getOrder() {
        return 0;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringCloud Gateway是一个基于Spring Cloud的全新项目,它是基于Spring 5.0、Spring Boot 2.0和Project Reactor等技术开发的网关。它的主要目标是为微服务架构提供一种简单有效的统一API路由管理方式。SpringCloud Gateway具有许多特性,包括动态路由、断路器功能、服务发现功能、请求限流功能和支持路径重写等。它是基于WebFlux框架实现的,底层使用了高性能的Reactor模式通信框架Netty。总之,SpringCloud Gateway是一个功能强大且易于使用的网关,可用于构建和管理微服务架构中的API路由。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [springcloud入门——gateway](https://blog.csdn.net/tang_seven/article/details/118523647)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [springcloudGateWay](https://blog.csdn.net/qq_35512802/article/details/122049808)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值