Gateway服务网关(二)

入门配置

引入依赖


<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-gateway</artifactId>

</dependency>

修改YML


spring:

  application:

    name: cloud-gateway

  cloud:

    gateway:

      discovery:

        locator:

          enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由

      routes:

        - id: payment_route # 路由的id,没有规定规则但要求唯一,建议配合服务名

          #匹配后提供服务的路由地址

          #uri: http://localhost:8001

          uri: lb://CLOUD-PAYMENT-SERVICE

          predicates:

            - Path=/payment/get/** # 断言,路径相匹配的进行路由

        - id: payment_route2

          #uri: http://localhost:8001

          uri: lb://CLOUD-PAYMENT-SERVICE

          predicates:

            - Path=/payment/lb/** #断言,路径相匹配的进行路由

            - After=2020-03-09T22:40:37.365+08:00[Asia/Shanghai]

访问

在添加网关之前,我们的访问是


http://localhost:8001/payment/get/31

添加网关之后,我们的访问路径是


http://localhost:9527/payment/get/31

这么做的好处是慢慢淡化我们真实的IP端口号

路由匹配

在这里插入图片描述

路由配置的两种方式

在配置文件yml中配置

代码中注入RouteLocator的Bean


@Configuration

public class GateWayConfig {



	// 配置了一个id为route-name的路由规则,当访问地址 http://localhost:9527/guonei时,会自动转发到

	// 地址 http;//news.baidu.com/guonei

    @Bean

    public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){

        RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();

        routes.route("path route atguigu",

                r ->r.path("/guonei").uri("https://www.baidu.com")).build();

        return routes.build();

    }

}

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

默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能。

首先需要开启从注册中心动态创建路由的功能,利用微服务名进行路由


spring:

  application:

    name: cloud-gateway

  cloud:

    gateway:

      discovery:

        locator:

          enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由

URL换成服务名


uri: lb://CLOUD-PAYMENT-SERVICE

Predicate的使用

概念

断言,路径相匹配的进行路由
在这里插入图片描述
Spring Cloud Gateway将路由匹配作为Spring WebFlux HandlerMapping基础架构的一部分

Spring Cloud Gateway包括许多内置的Route Predicate 工厂,所有这些Predicate都与Http请求的不同属性相匹配,多个Route Predicate工厂可以进行组合

Spring Cloud Gateway创建Route对象时,使用RoutePredicateFactory创建Predicate对象,Predicate对象可以赋值给Route,SpringCloudGateway包含许多内置的RoutePredicateFactores。

所有这些谓词都匹配Http请求的不同属性。多种谓词工厂可以组合,并通过逻辑 and
在这里插入图片描述

常用的Predicate

After Route Predicate:在什么时间之后执行

在这里插入图片描述
Before Route Predicate:在什么时间之前执行

Between Route Predicate:在什么时间之间执行

Header Route Predicate:携带请求头

Host Route Predicate:什么样的URL路径过来

Method Route Predicate:什么方法请求的,Post,Get

Path Route Predicate:请求什么路径 - Path=/api-web/**

Query Route Predicate:带有什么参数的

Filter的使用

概念

路由过滤器可用于修改进入的HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用

Spring Cloud Gateway内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生的

Spring Cloud Gateway Filter

GatewayFilter

GlobalFilter

自定义过滤器

主要作用:

  • 全局日志记录
  • 统一网关鉴权

需要实现接口:implements GlobalFilter, Ordered

全局过滤器代码如下:


@Component

@Slf4j

public class MyLogGateWayFilter implements GlobalFilter, Ordered {



    @Override

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        log.info("come in global filter: {}", new Date());



        ServerHttpRequest request = exchange.getRequest();

        String uname = request.getQueryParams().getFirst("uname");

        if (uname == null) {

            log.info("用户名为null,非法用户");

            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);

            return exchange.getResponse().setComplete();

        }

        // 放行

        return chain.filter(exchange);

    }



    /**

     * 过滤器加载的顺序 越小,优先级别越高

     *

     * @return

     */

    @Override

    public int getOrder() {

        return 0;

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值