[小白学微服务] 网关 GateWay 的基础使用

一、什么是网关

        1.网关相当于一个网络请求的中转站,这里以淘宝为例。假如淘宝的商品相关功能和用户相关功能分别在不同的服务器上,拥有不同的网址假设是: https://good.tb.com 和 https://user.tb.com

但用户不能分别访问这两个网址使用相关服务。所以我们需要一个统一路由管理的中转站,当用户使用商品服务,他就会自动的将用户的请求转发给https://good.tb.com,用户请求亦是如此。

 二、什么是gateway

        1.gateway简介

                点击进入gateway中文文档

                gateway提供了一个建立在Spring生态系统之上的API网关,包括Spring 6、Spring Boot 3 和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为其提供跨领域的关注,如:安全、监控/指标和容错。

  三、gateway的使用

        1.创建网关模块引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

        注意:这里引入那nacos服务发现依赖是为了将geteway交给nacos管理

2.编写gateway配置文件

        在application.yml文件写入如下配置

server:
  port: 10010
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: localhost:8848

        启动服务

 可以发现,getaway服务已经注册了

增加路由配置

spring:
  cloud:    
    gateway:
       routes:
        - id: user-service #路由id,可任意命名,但必须保持唯一
          uri: lb://userservice #目的uri
          predicates: #断言配置,用于匹配请求,这里是以 /user/.... 的请求路由到上面的目的uri
            - Path=/user/**
          filters: #路由过滤器配置  给匹配本路由下的请求 添加一个请求头: X-Request-red:blue
            - AddRequestHeader=X-Request-red, blue
        - id: order-service #同上
          uri: lb://orderservice
          predicates:
            - Path=/order/**
          filters:
            - AddRequestHeader=X-Request-red, blue
      

特别注意:  Path=/user/**   Path的P是大写的,是大写的

重启服务,访问 http://localhost:10010/order/103 

可以看到我们已经通过网关访问到我们注册的订单服务了,这样最基本的网关就搭建完成了。

3.gateway的过滤器

过滤器主要负责对请求的修饰加工以及筛选功能

官方中文文档:相关教程

上面我们已经配置了路由过滤器,但总有些配置是所有路由都需要的,这时候我们就需要使用默认过滤器,他是对所有路由都生效的配置。具体配置如下:

spring:
  cloud:
    gateway:
      default-filters: 
       - AddResponseHeader=X-Response-Default-Red, Default-Blue

这里的意思是给所有的请求添加响应头  X-Response-Default-Red:Default-Blue

以上两种方式配置的过滤器是按照注册的顺序进行优先级排序的,简单了说就是按编写的先后顺序执行的。优先级的起始值是1,逐步递增

出此之外,我们还可以通过编写类的形式自定义全局路由 GlobalFilter。代码如下

@Order(-3) // 数字越小越优先
@Component
public class LoginFilter implements GlobalFilter {
    @Override
    /**
     *  exchange: 用于存放请求的容器
     *  chain: 过滤器串,gateway的多个过滤器是串联在一起的,这个对象就是存放管理这个串的
     */
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //拿到请求
        ServerHttpRequest request = exchange.getRequest();
        //获取请求参数
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        //获取key为name 的参数
        String name = queryParams.getFirst("name");
        if(name.equals("admin")){
            //放行
            return chain.filter(exchange);
        }
            //设置身份验证未通过的状态码:401
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            //终结请求
            return exchange.getResponse().setComplete();
    }
}

1.这个过滤器的功能就是检查请求是key为name 的参数的值是否是 admin, 如果是则正常放行,如果不是则验证未通过,设置状态码为401并终结请求。

2. @Order(-3)  这个注解配置了这个过滤器的优先级,值越小越优先

那么这样就出现了一个问题,如果我同是编写了以上三种过滤器,并且order值都想同,又该如何排序呢?

答案是: 当order一致时, default-filters > 路由过滤器 > 全局过滤器

4. CORS配置

        这个配置是为了解决前端浏览器访问时的跨域问题,有时候我们在前端开发的过程中会发现请求回报出一个403状态码,这就是服务端拒绝了请求。这时候我们就要进行CORS配置,允许我们自己的客户端访问。如下

全局的CORS配置如下

spring:
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true #解决option(询问)请求被拦截问题
        cors-configurations:
          '[/**]':
            allowedOrigins: #可跨域的网站
              - "http://127.0.0.1:5173" #我发起请求的地址
            allowedMethods: #可跨域的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "UPDATE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*"    #允许携带的请求头信息
            allowCredentials: true  #允许携带cookie
            maxAge: 360000  #本次跨域验证成功后有效期

add-to-simple-url-handler-mapping: true

这个配置的用处是:

        客户端在发送ajax请求时,ajax会先发送一个询问请求,问一下后端是否让我访问,不配置的话可能会导致ajax拿不到结果

除了全局的配置,我们还可以配置单个路由的相关配置

spring:
  cloud:
    gateway:
      routes:
      - id: cors_route
        uri: lb://userservice
        predicates:
        - Path=/user/**
        metadata:
          cors
            allowedOrigins: '*' #任意地址均可访问
            allowedMethods:
              - GET
              - POST
            allowedHeaders: '*'
            maxAge: 30

完成以上配置后我们重新发起请求

可以看出浏览器已经可以通过ajax正常发起请求了 

四、总结

以上就是gateway的基本使用了,新人作者,还有不足,欢迎大佬多多补充,多多关照哈~拜拜↑拜拜↓拜拜↑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值