【Spring Cloud Alibaba】8.路由网关(Gateway)

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

简介

接下来对服务消费者添加路由网关来实现统一访问接口,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud Alibaba 搭建教程

什么是 Spring Cloud Gateway

Spring Cloud GatewaySpring 官方基于 Spring 5.0Spring Boot 2.0Project Reactor 等技术开发的网关,该项目提供了一个库,用于在Spring WebFlux之上构建API网关。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,如:安全性,监控/指标和弹性等。

功能介绍

  • 基于Spring Framework 5Project ReactorSpring Boot 2.0构建
  • 能够在任何请求属性上匹配路由。
  • Predicates(断言) 和 Filters(过滤器) 作用于特定路由
  • 集成Hystrix断路器。
  • 集成Spring Cloud DiscoveryClient(服务发现客户端)
  • 易于编写断言和过滤器
  • 限流
  • 路径重写

工作流程

【Spring Cloud Alibaba】8.路由网关(Gateway)
Spring Cloud Gateway 工作流程说明如下:

  1. 客户端将请求发送到 Spring Cloud Gateway 上。
  2. Spring Cloud Gateway 通过 Gateway Handler Mapping 找到与请求相匹配的路由,将其发送给 Gateway Web Handler
  3. Gateway Web Handler 通过指定的过滤器链(Filter Chain),将请求转发到实际的服务节点中,执行业务逻辑返回响应结果。
  4. 过滤器之间用虚线分开是因为过滤器可能会在转发请求之前(pre)或之后(post)执行业务逻辑。
  5. 过滤器(Filter)可以在请求被转发到服务端前,对请求进行拦截和修改,例如参数校验、权限校验、流量监控、日志输出以及协议转换等。
  6. 过滤器可以在响应返回客户端之前,对响应进行拦截和再处理,例如修改响应内容或响应头、日志输出、流量监控等。
  7. 响应原路返回给客户端。

总而言之,客户端发送到 Spring Cloud Gateway 的请求需要通过一定的匹配条件,才能定位到真正的服务节点。在将请求转发到服务进行处理的过程前后(prepost),我们还可以对请求和响应进行一些精细化控制。

Predicate 就是路由的匹配条件,而 Filter 就是对请求和响应进行精细化控制的工具。有了这两个元素,再加上目标 URI,就可以实现一个具体的路由了。

开始搭建

创建项目

在我们之前搭建好的父项目中右击新建->新模块
【Spring Cloud Alibaba】8.路由网关(Gateway)
为我们的子模块取名字、组ID和工件ID
【Spring Cloud Alibaba】8.路由网关(Gateway)
创建后目录结构如下
【Spring Cloud Alibaba】8.路由网关(Gateway)

修改POM文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-alibaba</artifactId>
        <groupId>com.moonce</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>moonce-gateway</artifactId>
    <packaging>jar</packaging>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Begin -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Spring Boot End -->

        <!-- Spring Cloud Begin -->
        <!-- Nacos 注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- feign  -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- sentinel 熔断 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- gateway 路由网关 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- Nacos 分布式配置中心 -->
        <!--        <dependency>-->
        <!--            <groupId>com.alibaba.cloud</groupId>-->
        <!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
        <!--        </dependency>-->
        <!-- Spring Cloud End-->
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.moonce.gateway.GatewayApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

与项目moonce-consumer-feign相比,主要增加了 org.springframework.cloud:spring-cloud-starter-gateway 依赖,去除了org.springframework.boot:spring-boot-starter-web

注意:在 gateway 网关服务中不能引入 spring-boot-starter-web 的依赖,否则会报错

添加启动类

创建com.moonce.gateway包和GatewayApplication.java启动类
【Spring Cloud Alibaba】8.路由网关(Gateway)
GatewayApplication.java

package com.moonce.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

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

添加配置文件

application.yml

spring:
  application:
    # 应用名称
    name: moonce-gateway
  cloud:
    # 使用 Nacos 作为服务注册发现
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    # 使用 Sentinel 作为熔断器
    sentinel:
      transport:
        port: 8721
        dashboard: localhost:8080
    # 路由网关配置
    gateway:
      # 设置与服务注册发现组件结合,这样可以采用服务名的路由策略
      discovery:
        locator:
          enabled: true
      # 配置路由规则
      routes:
        # 采用自定义路由 ID(有固定用法,不同的 id 有不同的功能,详见:https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters)
        - id: MOONCE-CONSUMER
          # 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在 Nacos 上的服务名
          uri: lb://moonce-consumer
          # Predicate 翻译过来是“谓词”的意思,必须,主要作用是匹配用户的请求,有很多种用法
          predicates:
            # Method 方法谓词,这里是匹配 GET 和 POST 请求
            - Method=GET,POST
        - id: MOONCE-CONSUMER-FEIGN
          uri: lb://moonce-consumer-feign
          predicates:
            - Method=GET,POST

server:
  port: 9000
  
# 开启熔断机制
feign:
  sentinel:
    enabled: true

# 暴露所以端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

# 配置日志级别,方便调试
logging:
  level:
    org.springframework.cloud.gateway: debug

启动项目测试

依次运行 Nacos 服务:ProviderApplicationConsumerApplicationConsumerFeignApplicationGatewayApplication
【Spring Cloud Alibaba】8.路由网关(Gateway)

打开浏览器访问:http://localhost:9000/moonce-consumer/test/app/name ,浏览器显示如下
【Spring Cloud Alibaba】8.路由网关(Gateway)

打开浏览器访问:http://localhost:9000/moonce-consumer-feign/test/hi 浏览器显示如下

【Spring Cloud Alibaba】8.路由网关(Gateway)

注意:请求方式是 http://路由网关IP:路由网关Port/服务名/

至此说明 Spring Cloud Gateway 的路由功能配置成功!!!

网关全局过滤

全局过滤器作用于所有的路由,不需要单独配置,我们可以用它来实现很多统一化处理的业务需求,比如权限认证,IP 访问限制等等。

创建全局过滤器

创建com.moonce.gateway.filters包和AuthFilter.java类,实现 GlobalFilter, Ordered 接口并在类上增加 @Component 注解。

package com.moonce.gateway.filters;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Maps;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * 鉴权过滤器
 */
@Component
public class AuthFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");

        if (token == null || token.isEmpty()) {
            ServerHttpResponse response = exchange.getResponse();

            // 封装错误信息
            Map<String, Object> responseData = Maps.newHashMap();
            responseData.put("code", 401);
            responseData.put("message", "非法请求,Token不存在!");

            try {
                // 将信息转换为 JSON
                ObjectMapper objectMapper = new ObjectMapper();
                byte[] data = objectMapper.writeValueAsBytes(responseData);

                // 输出错误信息到页面
                DataBuffer buffer = response.bufferFactory().wrap(data);
                response.setStatusCode(HttpStatus.UNAUTHORIZED);
                response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        return chain.filter(exchange);
    }

    /**
     * 设置过滤器的执行顺序
     *
     * @return
     */
    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

测试

重启GatewayApplication,浏览器访问http://localhost:9000/moonce-consumer/test/app/name 网页显示如下
【Spring Cloud Alibaba】8.路由网关(Gateway)

浏览器访问:http://localhost:9000/moonce-consumer/test/app/name?token=moonce 网页显示如下
【Spring Cloud Alibaba】8.路由网关(Gateway)

结尾

本文只做简单搭建介绍详情使用请见官网文档文章来源地址https://www.toymoban.com/news/detail-424091.html

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

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

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

相关文章

  • Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

    Actuator 是 Spring Boot 提供的用来对应用系统进行监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator 的核心是端点 Endpoint 。 Endpoint 可以让我们监视应用程序并与其交互。 Spring Boot 包含许多内置端点,并允许您添加自己的端

    2024年02月09日
    浏览(59)
  • 【深入解析spring cloud gateway】02 网关路由断言

    断言是路由配置的一部分,当断言条件满足,即执行Filter的逻辑,如下例所示 当请求路径满足条件/red/,即添加头信息:X-Request-Red,value为Blue-{segment},segment是路径里面带的信息。 gateWay的主要功能之一是转发请求,转发规则的定义主要包含三个部分 Route(路由) 路由是网关

    2024年02月09日
    浏览(42)
  • 第八章 : Spring cloud 网关中心 Gateway (动态路由)

    第八章 : Spring cloud 网关中心 Gateway (动态路由) 前言 本章知识点:重点介绍动态网关路由的背景、动态路由与静态路由的概念,以及如何基于Nacos实现动态网关路由 的实战案例。 背景 前面章节介绍了Spring Cloud Gateway提供的配置路由规则的两种方法,但都是在Spring Cloud Ga

    2024年01月19日
    浏览(48)
  • 第七章 : Spring cloud 网关中心 Gateway (静态路由)

    第七章 : Spring cloud 网关中心 Gateway (静态路由) 前言 本章知识点:本章将会介绍什么是Spring Cloud Gateway、为什么会出现Spring Cloud Gateway,以及Spring Cloud Gateway的工作原理和实战用法,以及Spring Cloud Gateway 路由概念以及基于nacos注册中心Spring Cloud Gateway 静态路由的实战。 什么

    2024年02月02日
    浏览(57)
  • 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日
    浏览(67)
  • 【Spring Cloud 八】Spring Cloud Gateway网关

    【Spring Cloud一】微服务基本知识 【Spring Cloud 三】Eureka服务注册与服务发现 【Spring Cloud 四】Ribbon负载均衡 【Spring Cloud 五】OpenFeign服务调用 【Spring Cloud 六】Hystrix熔断 【Spring Cloud 七】Sleuth+Zipkin 链路追踪 在项目中是使用了Gateway做统一的请求的入口,以及统一的跨域处理以及

    2024年02月12日
    浏览(47)
  • Spring Cloud 之 Gateway 网关

    🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝 🍓 更多文章请点击 Gateway官网 :https://spring.io/projects/

    2024年02月16日
    浏览(37)
  • Spring cloud教程Gateway服务网关

    写在前面的话: 本笔记在参考网上视频以及博客的基础上,只做个人学习笔记,如有侵权,请联系删除,谢谢! Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提

    2024年02月08日
    浏览(45)
  • 神领物流 day02-网关与支付 Spring Cloud Alibaba 微服务

    单token存在的问题 双token三验证 用户端token校验与鉴权 对接三方支付平台 分布式锁 新入职的你加入了开发一组,也接到了开发任务,并且你也顺利的修复了bug,完成了快递员、司机的鉴权,现在的你已经对项目的业务功能、开发环境以及网关代码设计都有了一定的了解,但

    2024年01月15日
    浏览(48)
  • Spring Cloud之API网关(Gateway)

    目录 API网关 好处 解决方案 Gateway 简介 特征 核心概念 Route(路由) Predicate(断言) Filter(过滤器) 工作流程 Route(路由) 路由配置方式 1.yml配置文件路由 2.bean进行配置 3.动态路由 动态路由 Predicate(断言) 特点 常见断言 示例 Filter(过滤器) filter分类 Pre 类型 Post 类型 网关过滤器 格式

    2024年02月08日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包