Springcloud-alibaba整合gateway

Springcloud-alibaba整合gateway

每天多学一点点~
话不多说,这就开始吧…

文章目录

  • Springcloud-alibaba整合gateway
  • 1.前言
  • 2. gateWay简介
  • 2. 搭建SpringCloudGateWay
  • 3. gateway转发规则
  • 4. GateWay的核心概念
  • 5. 路由断言工厂
  • 6. 自定义谓词工厂
  • 7.结语

1.前言

之前学习了nacos,sentinel,并对sentinel进行了持久化改造。现在轮到了gateway了

gateway官网

2. gateWay简介

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul 网关。网关作为流量的,在微服务系统中有着非常作用。据说性能是第一代网关 zuul的1.5倍。(基于Netty,WebFlux)。
:由于不是Sevlet容器,所以他不能打成war包, 只支持SpringBoot2.X不 支持1.x

网关作用:
路由转发、权限校验、限流控制等作用

没有网关:
Springcloud-alibaba整合gateway_第1张图片

使用网关:
Springcloud-alibaba整合gateway_第2张图片

2. 搭建SpringCloudGateWay

  1. 添加依赖
       
       
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
  1. yml文件
#规划GateWay的服务端口
server:
  port: 8888
##规划gateWay注册到到nacos上的服务应用名称
spring:
  application:
    name: api-gateway
  cloud:
    nacos:
      discovery:
        #gateway工程注册到nacos上的地址
        server-addr: localhost:8848
    gateway:
      discovery:
        locator:
          #开启gateway从nacos上获取服务列表
          enabled: false
  profiles:
    active: xxxxx  # 具体的gateway配置
#开启acutor端点
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      #打开端点详情
      show-details: always


  1. 写注解
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayDemo{

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

}

gateway没有注解。。。

3. gateway转发规则

Springcloud-alibaba整合gateway_第3张图片

4. GateWay的核心概念

  1. 路由
    网关的基本构建模块,它是由ID、目标URl、断言集合和过滤器集合定义, 如果集合断言为真,则匹配路由。
  2. Predicate(断言)
    这是java 8的一个函数式接口predicate,可以用于lambda表 达式和方法引用,输入类型是:Spring Framework ServerWebExchange,允许开发人员匹配来自HTTP请求的任何内容,例如请求头headers和参数paramers
  3. Filter(过滤器)
    这些是使用特定工厂构建的Spring Framework GatewayFilter 实例,这里可以在发送下游请求之前或之后修改请求和响应

5. 路由断言工厂

Springcloud-alibaba整合gateway_第4张图片

类名必须以 RoutePredicateFactory 结尾,下面有个例子

具体请看gateway官网,都有

6. 自定义谓词工厂

这里以时间举个例子

  1. 书写一个配置类,用于接受配置
/**
 * Created by zjq on 2020/06/05.
 */
@Data
public class MyTimeBetweenConfig {

    private LocalTime startTime;

    private LocalTime endTime;

}

  1. 写一个自定义谓词工厂,类名必须要以RoutePredicateFactory结尾然后继承AbstractRoutePredicateFactory
/**
 * Created by zjq on 2020/06/05.
 */
@Component
@Slf4j
public class MyBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory {

    public MyBetweenRoutePredicateFactory() {
        super(MyTimeBetweenConfig.class);
    }

    @Override
    public Predicate apply(MyTimeBetweenConfig config) {

        LocalTime startTime = config.getStartTime();

        LocalTime endTime = config.getEndTime();

        return new Predicate(){
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                LocalTime now = LocalTime.now();
				// 判断当前时间是否在在配置的时间范围类
                return now.isAfter(startTime) && now.isBefore(endTime);
            }
        };

    }

    public List shortcutFieldOrder() {
        return Arrays.asList("startTime", "endTime");
    }

}
  1. yml配置
# 加上 2 中springcloud搭建gateway的yml文件 spring.profiles.active: 这个文件
spring:
  cloud:
    gateway:
      routes:
       - id: my-timeBetween #id必须要唯一
         uri: lb://product-center # 任意一个微服务工程
         predicates:
           #当前请求的时间必须在早上7点到 晚上11点 http://localhost:8888/selectProductInfoById/1
           #才会被转发 到http://product-center/selectProductInfoById/1
           - MyTimeBetween=上午7:00,下午11:00

gateway还有很很多,官网都有啦。下面就是sentinel集成gateway了。

7.结语

世上无难事,只怕有心人,每天积累一点点,fighting!!!

你可能感兴趣的:(gateway,springcloud,alibaba,谓词工厂)