SpringCloud Alibaba入门教程五——服务网关

SpringCloud GateWay

SpringCloud Gateway 是SpringCloud网关的第二代,相对于Zuul,它的性能提升了大约一半,但是它不是Servlet编程模型,不能在Tomcat容器中运行,无法构成war包,并且不支持SpringBoot 1.x。不支持的原因是Gateway是异步编程模型,而Tomcat是同步编程模型,Gate适合于Netty这种服务器上跑。

构建GateWay

  1. 创建SpringBoot项目,选择gateway依赖,一路next。
  2. 在pom文件中引入springcloud alibaba依赖、springcloud nacos依赖、以及监控依赖。
  3. 书写配置文件
server:
  port: 8040
spring:
  application:
    name: gateway
  cloud:
  	这里的nacos可以换成其他的如eureka的注册中心
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          # 让gateway通过服务发现组件找到其他的微服务  开启动态路由
          enabled: true
      rotes:
      	- id: payment_routh 路由的ID,没有固定规则但是要求唯一,建议配合服务名
      	  uri: lb://微服务名称  lb代表从注册中心获取服务
      	  predicates: 
      	  	- Path=/payment/get/**  断言,路径相匹配的进行路由
      		
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always
  1. 访问 gateway地址/其他微服务名/参数 就会跳转到对应的微服务方法中

PS : 在使用GateWay时,必须去除spring-boot-starter-web的依赖,否则会报错。

GateWay核心架构

在这里插入图片描述

GateWay谓词工厂(匹配规则)

谓词工厂是进行url匹配的所有规则,可以根据url的不同,从而实现其转发的各个微服务,或者是通过一些特定的条件,让其跳转到一些指定的微服务。
谓词工厂可以直接在配置文件中指定,也可以自定义谓词工厂。

GateWay谓词工厂详解

自定义路由谓词工厂

例如限制指定时间内才能访问。

  1. 在配置文件中写入
predicates:
 - TimeBetween:=9:00,17:00 # 这个名字可以自定义
  1. 编写对应的类 例如 TimeBetweenRoutePredicateFactory 后面这个一定要写成这样,继承AbstractRoutePredicateFactory,实现其中的方法,因为这个类是一个泛型,所以要传入一个配置类,配置类中的属性要对应配置文件中的参数。

其中shortcutFieldOrder方法是设置配置类与配置文件对应,apply方法是设置配置规则。

@Component
public class TimeBetweenRoutePredicateFactory
    extends AbstractRoutePredicateFactory<TimeBetweenConfig> {
    public TimeBetweenRoutePredicateFactory() {
        super(TimeBetweenConfig.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return exchange -> {
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

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

    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
        System.out.println(formatter.format(LocalTime.now()));
    }
}
  1. 编写配置类,用来对应配置文件的参数
package com.itmuch.gateway;
import lombok.Data;
import java.time.LocalTime;

@Data
public class TimeBeweenConfig {
    private LocalTime start;
    private LocalTime end;
}

过滤器工厂详解(GatewayFilter Factory)

Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)

自定义过滤器工厂

在这里插入图片描述

  1. 编写自定义过滤器工厂类继承AbstractNameValueGatewayFilterFactory,实现其中的方法。
@Slf4j
@Component
public class PreLogGatewayFilterFactory
    extends AbstractNameValueGatewayFilterFactory {
    @Override
    public GatewayFilter apply(NameValueConfig config) {
        return ((exchange, chain) -> {
            log.info("请求进来了...{},{}", config.getName(), config.getValue());
            ServerHttpRequest modifiedRequest = exchange.getRequest()
                .mutate()
                .build();
            ServerWebExchange modifiedExchange = exchange.mutate()
                .request(modifiedRequest)
                .build();

            return chain.filter(modifiedExchange);
        });
    }
}
  1. 书写配置文件,这里和自定义谓词工厂有一定相似性。
filters:
  - PreLog=a,b # 前面是name 后面是value

全局过滤器

全局过滤器会作用于所有的路由。全局过滤器详解

SpringCloud Gateway 整合Sentinel

网关也有可能会被某个微服务崩溃而陷入连环雪崩的情况,所以也要配置负载均衡。
Spring Cloud Gateway-过滤器工厂详解(GatewayFilter Factories)

监控Spring Cloud Gateway

Spring Cloud Gateway监控

排查问题总结

Spring Cloud Gateway排错、调试技巧总结

网关限流

Spring Cloud Gateway限流详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值