前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud基础(2)–网关Gateway

SpringCloud基础(2)–网关Gateway

作者头像
摸鱼的G
发布2023-10-23 14:56:45
1770
发布2023-10-23 14:56:45
举报
文章被收录于专栏:火属性小虫

SpringCloud基础(2)–网关Gateway

在学习了Eureka之后,我们应该学习的服务降级与熔断,但因为SpringCloud已经停止维护Hystrix,因此把这部分学习延后到SpringCloud Alibaba中。直接进行Gateway网关。

降级与熔断机票~

在我们生活中,我们的局域网设备,无法被互联网上的其他设备直接访问,肯定是能够保证到安全性的。并互联网发送过来的数据,需要经过路由器进行解析,识别到底是哪一个设备的数据包,然后再发送给对应的设备。路由器下的网络是内网,而互联网那一端是外网。

而我们的微服务也类似,一般情况下,并不是所有的微服务都需要直接暴露给外部调用,这时我们就可以使用路由机制,添加一层防护,让所有的请求全部通过路由来转发到各个微服务,并且转发给多个相同微服务实例也可以实现负载均衡。

首先,我们需要创建一个Gateway项目,并创建启动类,添加依赖

代码语言:javascript
复制
<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>
</dependencies>

第一个依赖就是网关的依赖,而第二个则跟其他微服务一样,需要注册到Eureka才能生效

接下来创建并修改application文件使它注册到注册中心。

代码语言:javascript
复制
server:
  port: 8500
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8188/eureka, http://localhost:8288/eureka
spring:
  application:
    name: gateway

接下来我们需要对路由进行配置:

代码语言:javascript
复制
spring:
  cloud:
    gateway:
        # 配置路由,注意这里是个列表,每一项都包含了很多信息
      routes:
        - id: borrow-service   # 路由名称
          uri: lb://borrowservice  # 路由的地址,lb表示使用负载均衡到微服务,也可以使用http正常转发
          predicates: # 路由规则,断言什么请求会被路由
          - Path=/borrow/**  # 只要是访问的这个路径,一律都被路由到上面指定的服务

通过这样的配置之后,我们只要是访问Path的路径就会被路由到指定服务上。

除了根据路径进行路由,Gateway提供了别的路由方式,具体查看 路由文档

配置之后,我们就可以直接通过路由的端口来访问服务了。

路由过滤器

上面我们学习了Gateway路由策略,而Gateway也包含了很多内置的路由过滤器工厂,路由过滤器支持以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应,路由过滤器的范围是某一个路由。

比如,我们希望在请求到达时,在请求头中添加一些信息在转发给我们的服务,我们可以使用路由过滤器来完成:

代码语言:javascript
复制
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
      - id: borrow-service
        uri: lb://borrowservice
        predicates:
        - Path=/borrow/**
      # 继续添加新的路由配置,这里就以书籍管理服务为例
      # 注意-要对齐routes:
      - id: book-service
        uri: lb://bookservice
        predicates:
        - Path=/book/**
        filters:   # 添加过滤器
        - AddRequestHeader=Test, HelloWorld!
        # AddRequestHeader 就是添加请求头信息,其他工厂请查阅官网

这样我们就可以在服务的request获取到header了,如这里我们通过 request.getHeader("Test")获取到HelloWorld!

除了针对某个路由配置过滤器之外,我们可以自定义全局过滤器,它能够作用于全局。需要我们通过代码形式编写。

代码语言:javascript
复制
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    //先获取ServerHttpRequest对象,注意不是HttpServletRequest
    ServerHttpRequest request = exchange.getRequest();
    //打印一下所有的请求参数
    System.out.println(request.getQueryParams());
    //判断是否包含test参数,且参数值为1
    List<String> value = request.getQueryParams().get("test");
    if(value != null && value.contains("1")) {
        //将ServerWebExchange向过滤链的下一级传递(跟JavaWeb中介绍的过滤器其实是差不多的)
        return chain.filter(exchange);
    }else {
        //直接在这里不再向下传递,然后返回响应
        return exchange.getResponse().setComplete();
    }
}

上面的示例为实现拦截没有指定请求参数(test)的请求.

过滤器能有很多个,所以我们能手动指定过滤器之间的顺序。

我们需要在过滤器上实现Ordered接口:

代码语言:javascript
复制
@Component
public class TestFilter implements GlobalFilter, Ordered {   //实现Ordered接口
  
    @Override
    public int getOrder() {
        return 0;
    }

通过getOrder的值来决定顺序,值越小,优先级越高,并且无论是在配置文件中编写的单个路由过滤器还是全局路由过滤器,都会受到Order值影响(单个路由的过滤器Order值按从上往下的顺序从1开始递增),最终是按照Order值决定哪个过滤器优先执行,当Order值一样时 全局路由过滤器执行优于单独的路由过滤器执行。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的四七层流量分发服务,访问流量经由 CLB 可以自动分配到多台后端服务器上,扩展系统的服务能力并消除单点故障。轻松应对大流量访问场景。 网关负载均衡(Gateway Load Balancer,GWLB)是运行在网络层的负载均衡。通过 GWLB 可以帮助客户部署、扩展和管理第三方虚拟设备,操作简单,安全性强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档