SpringCloud-Gateway

Gateway

Spring Cloud Gateway 是 Spring Cloud 新推出的网关框架,之前是 Netflix Zuul。
常见的功能有转发服务,权限认证,限流控制等等。

三大核心概念:

  • Route(路由)
  • Predicate(断言)
  • Filter(过滤)

简单使用

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.xmm.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
        </dependency>
    </dependencies>

注意:spring-cloud-starter-gateway与spring-boot-starter-web会冲突报错,不能同时引入

2.yml
  1. 通过地址路由配置

    server:
     	 port: 9527
    cloud:
         gateway:
           discovery:
             locator:
               enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
           routes:
             - id: payment_route_get   #路由的id,没有固定规则但要求唯一,建议配合服务名使用
               uri: http://localhost:8001  #匹配后提供路由服务的路由地址
               predicates:
                 - Path=/payment/get/**  #断言,路径相匹配的进行路由
    
             - id: payment_route_lb   #路由的id,没有固定规则但要求唯一,建议配合服务名使用
               uri: http://localhost:8001  #匹配后提供路由服务的路由地址
               predicates:
                 - Path=/payment/lb/**  #断言,路径相匹配的进行路由
    eureka:
      	client:
    		register-with-eureka: true  #表示是否将自己注册进rurekaServer
    		fetch-registry: true  #是否从eurekaServer抓取已有的注册信息
    		service-url:
    		  defaultZone: http://eureka7001.com:7001/eureka/ #单机版
    
  2. 通过注册中心服务名动态路由配置

    #通过服务名动态路由  配置
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true  #开启从注册中心动态创建路由的功能,利用微服务名进行路由
          routes:
            - id: payment_route_get   #路由的id,没有固定规则但要求唯一,建议配合服务名使用
              uri: lb://CLOUD-PAYMENT-SERCICE
              predicates:
                - Path=/payment/get/**  #断言,路径相匹配的进行路由
    
            - id: payment_route_lb   #路由的id,没有固定规则但要求唯一,建议配合服务名使用
              uri: lb://CLOUD-PAYMENT-SERCICE
              predicates:
                  - Path=/payment/lb/**  #断言,路径相匹配的进行路由
    
  3. 通过以上配置,启动后可通过访问9527端口访问uri对应地址的服务,实现了不暴露原本服务端口,在上面套一层路由端口,即:localhost:9527/payment/get/1可替代:localhost:8001/payment/get/1

配置中常用的predicate

  1. After Route Predicate
  2. Before Route Predicate
  3. Between Route Predicate
  4. Cookie Route Predicate
  5. Header Route Predicate
  6. Host Route Predicate
  7. Method Route Predicate
  8. Path Route Predicate
  9. Query Route Predicate
  10. RemoteAddr Route Predicate
  11. Weight Route Predicate

解释:
例1:

spring:
   cloud:
   	gateway:
   		routes:
   			- id: after_route
   			  uri: http://locahost:8001
   			  predicates:
   			  	- After=2020-04T17:42:47.789-07:00[America/Denver]

即:在上述predicates After中对应的时间之后才可以访问成功

例4:必须要带cookie才可以访问,以此类推

自定义Filter

过滤器使用太广泛,在此只介绍自定义过滤器


一下为简单实例:具体需要实现什么功能可增加相应逻辑(例:权限,日志等等)
实现接口:

@Component
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("**********come in MyLogGatewayFilter"+new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname==null){
            System.out.println("用户名为null,非法用户");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
		//放行
        return chain.filter(exchange);
    }
	//过滤器加载的顺序越小优先级越高
    @Override
    public int getOrder() {
        return 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值