第七章集成spring cloud alibaba集成 Gateway

1:首先了解一下什么是Gatway
Spring Cloud Gateway 是 Spring 官方基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,Spring Cloud Gateway 旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式。Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,目标是替代 Netflix ZUUL,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
注:说了Gatway是为了替代ZUUL的那么就简单介绍一下Gatway的一点限制。
1:Gatway必须需要SpringBoot2.X才能支持
2:Gatway底层依赖实现Netty和WebFulx,不同于我们servelt编程模型。
3: 基于第二点,所以我们不能以tomcat这类容器来运行,及在项目中我们不要把其打包成war包建议打包成jar包。
2:讲完概念我们直接上手写代码新建项目spring-cloud-alibaba-study-gatway步骤直接参考生产者。
2.1 pom文件修改(切记不能引入web包)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.hyl.study</groupId>
      <artifactId>spring-cloud-alibaba-study</artifactId>
      <version>0.0.1-SNAPSHOT</version>
   </parent>
   <groupId>com.hyl.study</groupId>
   <artifactId>spring-cloud-alibaba-study-gatway</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>spring-cloud-alibaba-study-gatway</name>
   <description>Demo project for Spring Boot</description>

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

   <dependencies>
      <!--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-discovery</artifactId>
      </dependency>
      <!--feign-->
      <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

2.2 修改启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class SpringCloudAlibabaStudyGatwayApplication {

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

}

2.3 修改.yml 文件

server:
  port: 9540

spring:
  application:
    name: study-gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

    gateway:
   # 设置与服务注册发现组件结合,这样可以采用服务名的路由策略
     discovery:
       locator:
         enabled: true
       # 配置路由规则
     routes:
       # 采用自定义路由 ID 没什么要求 建议服务名加下标
       - id: study-consumer-01
         # 采用 LoadBalanceClient 方式请求,以 lb:// 开头,后面的是注册在 Nacos 上的服务名 lb:默认开启负载算法
         uri: lb://study-consumer
         #路由优先级
         orser: 1
         # “断言”,主要作用是匹配用户的请求,有很多种用法
         predicates:
           # Method 方法谓词,这里是匹配 GET 请求
           #- Method=GET 
           # 请求必须以 study-consumer 打头才会走这个路由
           - Path=/study-consumer-service/**
        # 过滤器
         filters:
         #路径转发时向上去除一级
           - StripPrefix=1

启动项目在浏览器访问
http://localhost:9540/study-consumer-service/test_consumer/get_test出现如下页面代表gateway集成成功。
第七章集成spring cloud alibaba集成 Gateway_第1张图片
其实配置路由我们可以省去因为gateway会去拿nacos上面的服务为我们生成一套路由规则。
在浏览器访问http://localhost:9540/study-consumer/test_consumer/get_test(这个路由规则我们其实没指定是gateway为我们默认生成的)
第七章集成spring cloud alibaba集成 Gateway_第2张图片
对生产则也一样我们其实未对生产者配置任何路由规则
第七章集成spring cloud alibaba集成 Gateway_第3张图片
到目前为止gateway和我们的项目基本集成完成。
扩展一下:
Gateway 除了给我们提供了系统断言(predicates)和过滤(filters)同时他还允许我们自定义断言规则及过滤规则我们来简单介绍一下:
1:自定义断言规则:
首先我们自定义自己的断言类AuthRoutePredicateFactory
@Component

public class AuthRoutePredicateFactory extends AbstractRoutePredicateFactory<AuthRoutePredicateFactory.Config> {


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

    //将配置文件里面的信息读进来
    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("token");
    }
    //断言方法
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return  new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {
                String token = exchange.getRequest().getQueryParams().getFirst("token");
                if(token!=null&&config.getToken().equals(token)){
                    return true;
                }else{
                    return false;
                }
            }
        };
    }

    @Data
    public static  class Config {
        private String token;
    }
}

之后再yml配置我们的断言规则添加配置(必须传递一个token为123456的才可以访问):在predicates:下面

 - Auth=123456

Auth 这个不是随意写的必须和我们定义的断言类开头一致AuthRoutePredicateFactory(断言类命名规则 xxx+RoutePredicateFactory)其中xxx就是我们要写在配置文件里面的。
重启项目在浏览器里面访问出现如下界面可正常访问:
http://localhost:9540/study-consumer-service/test_consumer/get_test?token=123456
第七章集成spring cloud alibaba集成 Gateway_第4张图片
我们把token的值改成12345再次访问出错
第七章集成spring cloud alibaba集成 Gateway_第5张图片
2:自定义过滤器:
@Component

public class AuthGlobalFilter implements GlobalFilter, Ordered {
    //过滤器逻辑
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getQueryParams().getFirst("token");
        String sign = exchange.getRequest().getQueryParams().getFirst("sign");
        //假设我们这里对参数进行验签及
        if(token==null||sign==null){
            //设置404状态嘛
            exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
            return  exchange.getResponse().setComplete();
        }
        if(!token.equals(sign)){
            //设置404状态嘛
            exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
            return  exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }


    //过滤器的优先级
    @Override
    public int getOrder() {
        return 0;
    }
    }

在浏览器访问(token尽量传123456因为刚才的自定义断言我们没去掉)
http://localhost:9540/study-consumer-service/test_consumer/get_test?token=123456此时页面发挥状态码404
第七章集成spring cloud alibaba集成 Gateway_第6张图片
之后我们在url加上sign值也写上123456
第七章集成spring cloud alibaba集成 Gateway_第7张图片
可以正常访问。到目前为止gateWay 已经正常集成到我们项目。可以根据自己具体的业务需要来做取舍。

本项目地址:https://gitee.com/hylgj/spring-cloud-alibaba-study.git

你可能感兴趣的:(spring,cloud,Alibab)