Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】

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

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】 跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】 跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】 跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】 跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】 跳转

一、网关简介

大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
这样的架构,会存在着诸多的问题:

  • 每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为战。自己造轮子实现一遍,会很蛋疼,完全可以抽出来,放到一个统一的地方去做。
  • 如果业务量比较简单的话,这种方式前期不会有什么问题,但随着业务越来越复杂,比如淘宝、亚马逊打开一个页面可能会涉及到数百个微服务协同工作,如果每一个微辰务都分配一个域名的话,一方面客户端代码会很难维护,涉及到数百个域名,另一方面是连接数的瓶颈想象一下你打开一个APP,通过抓包发现涉及到了数百个远程调用,这在移动端下会显得非常低效。
  • 后期如果需要对微服务进行重构的话,也会变的非常麻烦,需要客户端配合你一起进行改造,比如商品服务,随着业务变的越来越复杂,后期需要进行拆分成多个微服务这个时候对外提供的服务也需要拆分成多个,同时需要客户端配合你进行改造,非常蛋疼。

上面的这些问题可以借助API网关来解决。

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
所谓的API网关,就是指系统的统一入口,它封装了应用程序的内部结构,为客户说提供统一服务,一些与业务本身功能天关的公共逻辑可以在这里实现。诸如认证、鉴权、监控、路由转发等等,添加上API网关之后,系统的架构图变成了如下所示:
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

1、什么是Spring Cloud Gateway

网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。

Sping Cloud cGateway是Sping Clou官方推出的第二代网关框架,定位于取代NeificZul。

相比Zul来说,Spring Cloud Gateway提供更优秀的性能,更强大的有功能。

Spring Cloud Gateway是由WebFlux + Netty + Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。

Sping Cloud Gateway旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Fiter的方式提供网关的基本功能,例如说安全认证、监控、限流等等。
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务官网文档: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Spring Cloud Gateway 功能特征

  • 基于Spring Framework 5, Project Reactor和 Spring Boot 2.0进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 支持路径重写;
  • 集成 Spring Cloud 服务发现功能(Nacos、Eruka) ;
  • 可集成流控降级功能(Sentinel、Hystrix) ;
  • 可以对路由指定易于编写的Predicate(断言)和Filter (过滤器);

2、核心概念

  • 路由(route)
    路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。

  • 断言(predicates)
    Java3中的断言函数,SpringCloud Gateway中的断言函数类型是Sping5.0框架中的SeverieExctange。断言函数允许开发者去定义匹酷t request中的任何信息,比加如请求头和参数等。

  • 过滤器(Filter)
    SpringCloud Gateway中的filter分为Gateway Filler和Global Filter。Filter可以对请求和响应进行处理

3、工作原理

Spring Cloud Gateway的工作原理跟Zuul的差不多,最大的区别就是Gateway的Filter只有pre和post 两种。
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
客户端向Spring Cloud Gateway发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网关Web处理程序,此时处理程序运行特定的请求过滤器链。过滤器之间用虚线分开的原因是过滤器可能会在发送代理请求的前后执行逻辑。所有pre过滤器逻辑先执行,然后执行代理请求;代理请求完成后,执行post过滤器逻辑。

二、Spring Cloud Gateway快速开始

1、环境搭建【基本环境搭建-实现路由】

注意:会和spring-webmvc的依赖冲突,需要排除spring-webmvc
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

<dependencies>
        <!--gateway的依赖 springcloud 开发-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
设置配置文件
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

server:
  port: 8088
spring:
  application:
    name: api-gateway
# gateway的配置
  cloud:
    gateway:
      routes:
        - id: order_route #路由的唯一标识,路由到order
          uri: http://localhost:8020 #需要转发的地址
          #断言规则 用于路由规则的匹配
          predicates:
            - Path=//
              # http://localhost:8088/order-serve/order/add  路由到↓
              # http://localhost:8020/order-serve/order/add
          filters:
            - StripPrefix=1 # 转发之前,去掉第一次的路径
            # http://localhost:8020/order/add
        #- id: stock_route

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问:http://localhost:8088/order-serve/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

2、集成Nacos

<!-- nacos服务注册与发现 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

server:
  port: 8088
spring:
  application:
    name: api-gateway
# gateway的配置
  cloud:
    gateway:
      routes:
        - id: order_route #路由的唯一标识,路由到order
          uri: lb://order-service # 需要转发的地址  lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略 order-service服务名
          #断言规则 用于路由规则的匹配
          predicates:
            - Path=/order-serve/**
              # http://localhost:8088/order-serve/order/add  路由到↓
              # http://localhost:8020/order-serve/order/add
          filters:
            - StripPrefix=1 # 转发之前,去掉第一次的路径
            # http://localhost:8020/order/add
        #- id: stock_route
    # 配置Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

重新运行并访问:
http://localhost:8088/order-service/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
设置约定集成nacos
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

server:
  port: 8088
spring:
  application:
    name: api-gateway
  cloud:
    # gateway的配置
    gateway:
      discovery:
        locator:
          enabled: true  #是否启动自动识别nacos服务
    #配置Nacos
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: nacos

重新启动项目
访问服务名对应的地址:http://localhost:8088/order-service/order/add

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
重新启动项目
访问:http://localhost:8088/order/add

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
调整时间
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
重新运行项目
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

http://localhost:8088/order/add

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

3、路由断言工厂(Route Predicate Factories)配置

https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

作用:当请求gateway的时候, 使用断言对请求进行匹配, 如果匹配成功就路由转发,如果匹配失败就返回404

类型:内置,自定义

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:

  • 基于Datetime类型的断工厂

此类型的断言根据时间做判断,主要有三个:
AfterRoutePredicateFactory:接收一个日期参数, 判断请求日期是否晚于指定日期
BeforeRoutePredicateFactory:接收- 个日期参数,判断请求日期是否早于指定日期
BetweenRoutePredicateFactory:接收两个日期参数,判断请求日期是否在指定时间段内

- After=2023-10-19T09:07:00.660+08:00[Asia/Shanghai]

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  • 基于远程地址的断言工厂
    RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
- RemoteAddr=192.168.1.1/24
  • 基于Cookie的断言工厂
    CookieRoutePredicateFactory:接收两个参数, cookie 名字和一个正则表达式。判断请求cookie是否具有给定名称且值与正则表达式匹配。
-Cookie=chocolate, ch.
  • 基于Header的断言工厂

HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。判断请求Header是否具有给定名称且值与正则表达式匹配。

- Header=X-Request-Id, \d+

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

重新启动项目
利用API工具发送请求
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
把Headers当中的请求参数取消重新发起请求,会报错
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  • 基于Host的断言工厂

HostRoutePredicateFactory:接收一个参数, 主机名模式。判断请求的Host是否满足匹配规则。

-Host=**.testhost.org
  • 基于Method请求方法的断言工厂

MethodRoutePredicateFactory:接收一个参数, 判断请求类型是否跟指定的类型匹配。
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
重新启动测试
通过GET发送请求
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
通过POST发起请求
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  • 基于Query请求参数的断言工厂
    Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
    设置必须传递参数为name的参数
- Query=name

重新启动发起请求,没有设置name参数报错
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
设置name参数
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
设置指定参数
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

 - Query=name,xushu|zhuge

设置name的参数只能是xushu或者zhuge否则断言失败
发送请求报错
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
将参数改为xushu请求成功,改为zhuge也请求成功
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  • 基于路由权重的断言工厂

WeightRoutePredicateFactory:接收-个[组名 权重],然后对于同-一个组内的路由按照权重转发

routes:
	-id: weight_ route1
	uri: host1
	predicates:
		-Path=/ product/**
		-Weight=group3,1
	-id: weight_ route2
	uri: host2
	predicates:
		- Path=/ product/**
		-Weight= group3, 9

4、自定义路由断言工厂

自定义路由断言工厂需要继承AbstractRoutePredicateFactory类,重写apply方法的逻辑。

在apply方法中可以通过exchange. getRequest()倒ServerHttpRequest对象,从而可以获取到请求的参数、请求方式、请求头等信息。

1、必须是Spring组件bean
2、类必须加上RoutePredicateFactory作为结尾
3、必须继承AbstractRoutePredicateFactory
4、必须声明静态的内部类 声明属性来接受配置文件当中配置的断言信息
5、需要结合shortcutFieldOrder进行绑定
6、通过apply方法进行逻辑判断 true 就是匹配成功 false就是匹配失败

注意:命名需要以RoutePredicateFactory结尾
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务


@Component
public class CheckAuthRoutePredicateFactory
        extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {

    public CheckAuthRoutePredicateFactory() {
        super(CheckAuthRoutePredicateFactory.Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("name");
    }

    @Override
    public Predicate<ServerWebExchange> apply(CheckAuthRoutePredicateFactory.Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {

                if(config.getName().equals("xushu")){
                    return true;
                }
                return false;
            }

        };
    }


    // 用于接收配置文件中 断言的信息
    @Validated
    public static class Config {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

重新启动项目
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问:http://localhost:8088/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
修改对应的断言名称
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

查询启动
http://localhost:8088/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5、过滤器工厂( GatewayFilter Factories)配置

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayilter-factories

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5.1、添加请求头参数

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

          filters:
            - AddRequestHeader=X-Request-color,red

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

    @RequestMapping("/header")
    public String header(@RequestHeader("X-Request-color") String color){
        return color;
    }

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
重新启动两个项目

http://localhost:8088/order/header
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5.2、添加请求参数

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

- AddRequestParameter=color,blue

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  @RequestMapping("/parameter")
    public String parameter(@RequestParam("color") String color){
        return color;
    }

http://localhost:8088/order/parameter
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5.3、为匹配的路由统一添加前缀

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

  servlet:
    context-path: /mall-order

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

            - PrefixPath=/mall-order #添加前缀对应微服务需要配置context-path

重新启动两个项目
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问:http://localhost:8088/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
现在访问:http://localhost:8020/mall-order/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
然而访问8082必须携带前缀
http://localhost:8020/mall-order/order/add
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5.4、配置重定向

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

- RedirectTo=302, https://www.baidu.com

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问:http://localhost:8088/order/add
重定向到了百度
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

5.5、自定义状态码

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

- SetStatus= 404

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问:http://localhost:8088/order/add
虽然访问成功了,但是返回的状态码为404
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

6、自定义过滤器工厂

继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。
创建CheckAuthGatewayFilterFactory
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务


/***
 */
@Component
public class CheckAuthGatewayFilterFactory
        extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {

    public CheckAuthGatewayFilterFactory() {
        super(Config.class);
    }
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }
    @Override
    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                String name=exchange.getRequest().getQueryParams().getFirst("name");

                if(StringUtils.isNotBlank(name)){
                    if(config.getValue().equals(name)){
                        return chain.filter(exchange);
                    }
                    else {
                        // 返回404
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                // 正常请求
                return chain.filter(exchange);
            }
        };
    }

    public static class Config {
        private String value;
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }

}

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

            - CheckAuth=xushu

7、全局过滤器(Global Filters)

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
局部过滤器和全局过滤器的区别

局部:针对某个路由,需要在路由中进行配置
全局:针对所有路由请求,一旦定义就会投入使用

GlobalFilter接口和GatewayFilter有一样的接口定义, 只不过,GlobalFilter 会作用于所有路由。
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

@Component
public class LogFilter implements GlobalFilter {
    Logger log= LoggerFactory.getLogger(this.getClass());
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }
}

重新启动:http://localhost:8088/order/add?name=xushu

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

8、Reactor Netty访问日志

要启用Reactor Netty访问日志,请设置

-Dreactor.netty.http.server.accessLogEnabled=true

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

它必须是Java系统属性,而不是Spring Boot属性。

您可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个Logback配置:

<appender name=" accessLog" class="ch.qos.logback.core.FileAppender">
	<file>access_log.log</file>
	<encoder>
		<pattern>%msg%n</pattern>
	</encoder>
</appender>

<appender name=" async" class="ch.qos.logback.classic.AsyncAppender">
	<appender-ref ref="accessLog" />
</appender>

<logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
	<appender-ref ref=" async"/>
</logger>
8.1、Gateway跨域配置(CORS Configuration)

通过ym|配置的方式
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

      globalcors:
        cors-configurations:
          '[/**]': # 允许跨域访问的资源
            allowedOrigins: "*" #跨域允许的来源 例如:www.smsm.com
            allowedMethods:
              - GET
              - POST
              - PUT

模拟跨域请求,设置发起请求的页面
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
    <div >
        <table border="1">
        <thead>
        <tr>
            <th>id</th>
            <th>username</th>
            <th>age</th>
        </tr>
        </thead>
        <tbody id="userlist">
        </tbody>
    </table>
    </div>
    <input type="button" value="用户列表" onclick="getData()">
    <script>
        function getData() {
            $.get('http://localhost:8088/order/add',function(data){
                alert(data)
            });
        }
    </script>
</body>
</html>

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
访问网页
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务

            allowedOrigins: "localhost:8088" #跨域允许的来源 例如:www.smsm.com

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
再次访问访问网页(抛出跨域异常)
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
设置*运行所有的来源访问
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Spring自带的跨域方式
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务


@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");   //允许运行method
        config.addAllowedOrigin("*");   //允许的来源
        config.addAllowedHeader("*");   //允许的请求头参数

        // 允许访问的资源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**",config);
        return new CorsWebFilter(source);
    }
}

Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】,Java[精选]一篇精通系列【头脑风暴】,Java,SpringBoot,java,spring cloud,微服务文章来源地址https://www.toymoban.com/news/detail-739292.html

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】 跳转
Java之SpringCloud Alibaba【二】【微服务调用组件Feign】 跳转
Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】 跳转
Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】 跳转
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】 跳转
Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】 跳转
Java之SpringCloud Alibaba【七】【Spring Cloud微服务网关Gateway组件】 跳转
Java之SpringCloud Alibaba【八】【Spring Cloud微服务Gateway整合sentinel限流】 跳转
Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】 跳转

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

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

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

相关文章

  • SpringCloud Alibaba入门7之引入服务网关Gateway

    我们需要在客户端和服务端之间加一个统一的入口,来作为请求的统一接入,而在微服务的体系中,承担这个角色的就是网关。我们只需要将网关的机器IP配置到DNS,或者接入负载,那么客户端的服务最终通过我们的网关,再转发到对应的服务端服务。 一、创建网关服务  1.引

    2024年02月11日
    浏览(46)
  • 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教程Gateway服务网关

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

    2024年02月08日
    浏览(45)
  • Spring Cloud第二季--服务网关Gateway

    Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project Reactor等技术。 Gateway 使用的Webflux中的reactor-netty响应式编程组件,底层使用了 Netty 通讯框架。Spring Cloud Gateway能干嘛呢? Gateway是原zuul1.x版的替代。 Spring Cloud Gateway 与 Zuul的区别: Zuu

    2024年02月03日
    浏览(52)
  • 【springcloud 微服务】Spring Cloud Alibaba Sentinel使用详解

    目录 一、前言 二、分布式系统遇到的问题 2.1 服务可用性问题 2.1.1  单点故障

    2024年01月16日
    浏览(51)
  • 【springcloud 微服务】Spring Cloud Alibaba Nacos使用详解

    目录 一、前言 二、nacos介绍 2.1  什么是 Nacos 2.2 nacos 核心能力 2.2.1 服务发现和服务健康监测

    2024年01月22日
    浏览(51)
  • 【springcloud 微服务】Spring Cloud Alibaba整合Sentinel详解

    目录 一、前言 二、环境准备 2.1 部署sentinel管控台 2.1.1 官网下载sentinel的jar包 2.1.2 启动控制台

    2023年04月09日
    浏览(57)
  • SpringCloud 微服务系列——Spring Cloud Alibaba 微服务工具集

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SpringCloud 微服务学习专栏 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:SpringCloud 微服

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

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

    2024年01月15日
    浏览(47)
  • 微服务·架构组件之网关- Spring Cloud Gateway

    微服务架构已成为构建现代化应用程序的关键范式之一,它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件,用于构建和管理微服务架构中的网关。本报告旨在调查和介绍Spring Cloud Gateway的核心概念、架构、功能以及其在

    2024年02月09日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包