SpringCloud GateWay新一代网关_学习笔记

在这里插入图片描述

GateWay三大核心概念

Route(路由)

路由是构建网关的基本模块,它有ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由.

Predicate(断言)

开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由

Filter(过滤)

指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.

GateWay工作流程

在这里插入图片描述
核心逻辑: 路由转发+执行过滤器链

GateWay的入门配置

1.新建Module

2.在pom.xml中引入gateway依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

注意网关作为微服务也需要注册到服务中心,所以导入一来是也需要注册中心的相关项.;
同时gateway不需要引入web的相关依赖,否则启动会报错;

3.配置application.yml

server:
  port: 9527
spring:
  application:
    name: cloud-gateway

eureka:
  instance:
    hostname: cloud-gateway-service
  client:
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

4.业务类??

网关就是看门的,没有业务类

5.写主启动类

6.给网关做路由映射

网关的理解:保护一些服务地址端口不暴露给外部,对外暴露网关端口;
外部想访问某个服务访问网关端口,由网关调用响应的服务;
网关好比看门的保安,对外阻止攻击等;
在application.yml中添加网关的配置:

spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh #payment_route   #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http:localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/get/**          #断言,路径相匹配的进行路由

        - id: payemnt_routh2 #payment_route  #路由的ID,没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001          #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/lb/**           #断言,路径相匹配的进行路由

通过以上配置,平时访问服务提供者需要访问:localhost:8001/payment/get/**;
配置网关后可以访问localhost:9527/payment/get/**也可以访问服务提供者

网关配置的两种方式

1.在配置文件yml中配置

在入门配置中用的就是yml配置方式,此种方式会随着网关的配置种类增加文件会很长

2.在代码中注入RouteLocator的Bean

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

通过微服务名实现动态路由

多数情况下客户端访问服务提供者时是通过ribbon实现负载均衡的,又ribbon通过某种机制调用服务提供者;现在我们通过网关实现负载均衡的功能(动态路由);
默认情况下GateWay会根据注册中心注册的服务列表.以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能;

1.启动一个服务注册中心,两个微服务

2.在pom中添加依赖

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

3.配置application.yml

在这里插入图片描述

Predicate(断言)的使用

Predicate就是为了实现一组匹配规则,让请求过来找对应的Route进行处理.

1.Route Predicate Factories是什么?

在这里插入图片描述

2.常用的Route Predicate

①After Route Predicate
在这里插入图片描述
在这里插入图片描述

获取时间格式:

public class T1 {
    public static void main(String[] args) {
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println(zonedDateTime);
    }
}

②Before Route Predicate
③Between Route Predicate
以上三个是时间级别的


④Cookie Route Predicate
Cookie级别的
在这里插入图片描述

curl发送请求:
带cookie
在这里插入图片描述

curl http://localhost:9527/payment/discovery       不带cookie

⑤Header Route Predicate
在这里插入图片描述

⑥Host Route Predicate
在这里插入图片描述

⑦Method Route Predicate
在这里插入图片描述

⑧Path Route Predicate
⑨Query Route Predicate
在这里插入图片描述

3.全部的断言路由匹配规则样例

在这里插入图片描述

Filter的使用

路由过滤器可以用于修改进入HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用.
Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生.
他的生命周期只有两个:pro 和post(业务逻辑之前和之后)。有点像spring的前置通知和后置通知.
他的种类分为:GatewayFilter和GlobalFilter(单一的和全局的);

写一个自定义过滤器

自定义全局GlobalFilter
主要实现两个接口:

@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("************come in MyLogGateWayFilter: "+new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if(uname==null){
            log.info("*************用户名为null,非法用户");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);//执行下一个过滤器链
    }

    @Override
    public int getOrder() {
        return 0;   //设置优先级
    }
}

此时,再次访问就必须带上uname参数才能正常访问了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值