SpringCloud之服务网关(总体第五篇)

上一篇笔记中已经学习到了服务降级,服务注册等内容,接下来学习服务网关。

一、Gateway

(一)Gateway是什么

1、概念

可以看看zuul:https://github.com/Netflix/zuul/wiki
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、能干嘛

在这里插入图片描述
在这里插入图片描述

3、一些核心概念

(1)核心概念

  • 路由(router)路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Fliter组成。如果路由断言为真,说明请求URL和配置路由匹配
  • 断言(Predicate)Spring Cloud GateWay中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud GateWay的断言函数允许开发者迁移定义匹配来自于HttpRequest中任何信息比如请求头和参数。
  • 过滤器(Filter)一个标准的SpringWebFilter。Spring Cloud GateWay中的Fliter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

(2)zuul1和Gateway底层模型

  • zuul
    在这里插入图片描述
  • Gateway
    在这里插入图片描述
  • 两者的区别
    在这里插入图片描述
  • 传统的servlet2.X
    在这里插入图片描述
    在这里插入图片描述
  • Gateway是采用WebFlux
    在这里插入图片描述

4、Gateway工作流程

  • 路由(router)路由信息的组成
  • 断言(Predicate)
  • 过滤器(Filter)

总体流程
在这里插入图片描述

  • 看看官网的
    在这里插入图片描述
    在这里插入图片描述

(二)搭建项目练习

1、搭建项目

1)建一个9527模块

  • 将model
    在这里插入图片描述
  • 导依赖
<dependencies>
        <!--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>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--一般基础配置类-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

仔细看这次是没有web的依赖和actuator依赖的,因为我们的Gateway不用这个。

  • 写yml
server:
  port: 9527
spring:
  application:
    name: cloud-gateway
eureka:
  instance:
    hostname: cloud-gateway-service
    instance-id: gateway9527
  #服务提供者provider注册进Eureka服务列表
  client:
    service-url:
      register-with-eureka: true
      fethc-registry: true
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
  • 主启动
    在这里插入图片描述

2)对相关模块进行路由配置

(1)9527网关如何做路由映射呢

  • 只有在路由,断言,过滤器为true后则转发过去。
    在这里插入图片描述
    只要别人想攻击你,外面有一层挡着的。

(2)payment8001配置网关(外面套一层9527)

配置9527新增网关

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh # payment_routh 路由的ID,没有固定规则但要求唯一,建议配置服务器
          uri: http://localhost:8001
          predicates:
            - Path=/payment/get/** # 断言,路径相匹配的进行路由
        - id: payment_routh2 # payment_routh2路由id,没有固定规则但要求唯一,建服务器名
          uri: http://localhost:8001
          predicates:
            - Path=/payment/create/** #断言,匹配相路径匹配的进行匹配


eureka:
  instance:
    hostname: cloud-gateway-service
    instance-id: gateway9527
  #服务提供者provider注册进Eureka服务列表
  client:
    service-url:
      register-with-eureka: true
      fethc-registry: true
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka

routes:就是我们这次配置的。

(4)启动测试

在这里插入图片描述
在这里插入图片描述

  • 用9527测试
    在这里插入图片描述

3)路由配置的方式

其实感觉说到了配置路由我又感觉我在学习Vue框架了
在这里插入图片描述

  • 这里添加也是可以的,但是要用其他测试
    在这里插入图片描述

(1)第一种方式

就刚刚学习的那种。

(2)用Bean方式配置

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder builder1 = builder.routes();
        builder1.route("path_routh_id",r -> r.path("/hello").uri("https://www.baidu.com")).build();
        builder1.route("path_routh_id2",r -> r.path("/hello2").uri("http://localhost:8001/payment/get/2")).build();
        return builder1.build();
    }
}

4)Gateway配置动态路由

(1)存在的问题分析

上面配置方式中存在的问题在现实中是不可能应用的,因为我们给写死了,肯定要动态变化的才可能。【我们之前的是负载均衡,要是我们的微服务很多的话,手动配置不太现实】
在这里插入图片描述
在这里插入图片描述

(2)进行配置处理

  • 首先启动这几个8001,8002,9527,7001
    在这里插入图片描述
  • 配置9527yml
    在这里插入图片描述
    在这里插入图片描述

5)Gateway的Predicate(断言)

  • 启动9527就会发现这个
    在这里插入图片描述
    其实就是和mysql查询的差不多的作用。
    在这里插入图片描述
    在这里插入图片描述

(1)After Route Predicate

  • 在什么什么之后

  • 获取当前时间
    在这里插入图片描述
    我们的目的是在多少多少时间后访问这个请求才可以放行

  • 进行配置
    在这里插入图片描述

(2)Before Route Predicate

这个就不用讲了吧

(3)Between Route Predicate

逗号隔开即可。
在这里插入图片描述

(4)Cookie Route Predicate

  • 就是带cookie允许你访问【而且还可以要求带什么样子的cookie可以访问】
    在这里插入图片描述
    逗号后面是要什么样子的cookie

  • 先看看配置内容
    在这里插入图片描述
    比如这里就要带username这个key,zzyy这个value。

  • 这里使用cur模拟cookie进行处理
    在这里插入图片描述
    这样访问是会报404
    带上cookie
    在这里插入图片描述

(5)Header Route Predicate

  • 要带一个http的请求头
    在这里插入图片描述
    在这里插入图片描述
  • 进行测试
    在这里插入图片描述

(6)还有一些其他的

在这里插入图片描述
要用的时候再学习。

6)Filter

在这里插入图片描述

(1)再次介绍

在这里插入图片描述
在这里插入图片描述

  • 单一的有31种
  • 全局的有10个

(2)常用的Gateway

在这里插入图片描述
具体的可以去官网看看,这个不是最重要的,下面自定义的才是最重要的。

(3)自定义Filter

  • 首先实现如下接口
    在这里插入图片描述

  • 能干嘛:统一网关啊,全局日志。

  • 案例

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Configuration
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("全局过滤器执行" + new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null ) {
            log.info("有问题");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //让他继续走下去
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

  • 过滤器还是很好理解的,比较简单。
    在这里插入图片描述
    只要你带上这个uname就可以,其他的就不行。

二、Zuul

由于暂时时间也比较紧张,暂时就把Zuul放一放,有需要的朋友可以自己去找资源学习。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值