GateWay

网关的作用

 GateWay-网关是我们服务的守门神,所有微服务的统一入口。

Spring Cloud GateWay官方文档

SpringCloudGateWay官网icon-default.png?t=M0H8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-starter

GateWay入门使用

使用步骤

1. 创建GateWay项目

2. 引入依赖Nacos和GateWay依赖

        引入Nacos依赖的目的是为了将GateWay项目注册到Nacos中,以及可以实现负载均衡

3. 配置application.yml,包括服务名称,Nacos地址,GateWay路由等

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos服务地址
    gateway:
      routes: # 网关路由配置
        - id: user-service #路由id,自定义,唯一即可
          #uri: http://localhost:8082 # 路由目标地址 http就是固定地址
          uri: lb://userservice # 路由目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 断言:判断进入当前路由规则
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头的就符合要求
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
            - Before=2031-01-20T17:42:47.789-07:00[America/Denver]  # 时间断言,符合时间规则才可以访问Before之前,After之后

4. 运行GateWay项目,启动GateWay网关服务

开启网关之后客户端与服务端访问流程如下:

 

 路由断言工厂

路由断言工厂icon-default.png?t=M0H8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

最常用的断言规则就是Path规则,表示“请求路径必须符合指定规则”。还有很多其他断言规则,

如下图: 

路由过滤器

GateWayFilter:网关过滤器

GateWayFilter-网关过滤器icon-default.png?t=M0H8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

GateWayFilter的作用

1. 给请求和响应加工处理,比如添加请求头

2. 可以为单个路由添加Filter,也可以为所有的路由都添加DefaultFilter

使用步骤

1. 配置application.yml

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos服务地址
    gateway:
      routes: # 网关路由配置
        - id: user-service #路由id,自定义,唯一即可
          #uri: http://localhost:8082 # 路由目标地址 http就是固定地址
          uri: lb://userservice # 路由目标地址 lb就是负载均衡,后面跟服务名称
          predicates: # 断言:判断进入当前路由规则
            - Path=/user/** # 这个是按照路径匹配,只要以/user/开头的就符合要求
#          filters: # 网关过滤器,只过滤当前路由网关
#            - AddRequestHeader=say,I`m freaking awesome!
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
            - Before=2031-01-20T17:42:47.789-07:00[America/Denver]  # 时间断言,符合时间规则才可以访问Before之前,After之后
      default-filters:  # 网关过滤器,过滤所有路由网关
        - AddRequestHeader=say,I`m freaking awesome!

GlobalFilter 全局过滤器

GlobalFiler-全局过滤器

GlobalFilter-全局过滤器icon-default.png?t=M0H8https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#global-filters

/*
 * 模拟拦截判断用户身份,查看authorization的值是否为admin,满足放行,否则拦截
 */
//@Order(-1)    过滤器优先级
@Component
public class AuthorizationFilter implements GlobalFilter, Ordered {

    /**
     * 处理当前请求,有必要的话通过{@link GatewayFilterChain} 将请求交给下一个过滤器处理
     * @param exchange 请求上下文,里面可以获取Request Response等信息
     * @param chain (过滤器链)用来把请求委托给下一个过滤器
     * @return {@code Mono<Void>} 返回标识当前过滤器业务结束
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.通过exchange获取Request
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        // 2.从Request对象中获取authorization
        String auth = params.getFirst("authorization");
        // 3.判断authorization是否等于admin
        if("admin".equals(auth)){
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// 5.2 响应状态码
        return exchange.getResponse().setComplete();// 响应结束
    }

    @Override
    public int getOrder() {// 过滤器优先级,数字越小 优先级越高
        return -1;
    }
}

过滤器执行顺序

​跨域问题处理

跨域:域名不一致就是跨域,主要包括:

  • 域名不同:www.taobao.com 和 www.taobao.org 和 www.jd.com 和 miaosha.jd.com
  • 域名相同,端口不同:localhost:8080 和 localhost:8081

跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截的问题

解决方案:CORS

网关处理跨域采用的同样是CORS方案,并且只需要简单配置即可实现。

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos服务地址
    gateway:
      globalcors: # 全局跨域配置
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        corsConfigurations:
          '[/**]':
            allowedOrigins: # 允许哪些网站的跨域请求
              - "http://localhost:8090"
              - "www.xxx.com" #允许跨域的域名
            allowedMethods: # 允许的跨域ajax请求方式
              - GET
              - POST
              - DELETE
              - PUT
              - OPTIONS
              - HEAD
            allowedHeaders: # 允许在请求中携带的头信息
              - "*"
            allowCredentials: true  # 是否允许携带Cookie
            maxAge: 360000  # 这次跨域检测的有效期  这个时间段内,一直可以跨域访问

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值