Spring Cloud Gateway微服务网关

2022-10-28 10:21:45 浏览数 (1)

写在前面

网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。

GateWay : 是Spring Cloud的一个全新的API网关项目,基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型 等技术开发,性能高于Zuul。旨在为微服务架构提供种简单有效的统的API路由管理式。

spring cloud gateway 核心功能:

  • 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
  • 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
  • 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

一些概念

路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:

  • id: 唯一标识,名字
  • uri: 路由的目的地URL,请求被转发到这里
  • predicate:断言,它的作用是进行条件判断,符合判断的才会执行路由
  • filter: 过滤器,用于修改请求和响应信息

对应的先看下怎么配置一个路由,长这样:

代码语言:javascript复制
# 下面的路由配置了: 来自 /account 开头的请求,都转到 account-service 微服务中。同时 先去掉 url 中的第一个段。

routes:
  - id: account-service
    uri: http://localhost:8803/
    predicates:
      - Path=/account/**
    filters:
      - StripPrefix=1

# StripPrefix 的意思是去掉 url 中的第一个段,比如 /account/user/list 就变成了/user/list 这样的 url 发送到具体的微服务。

路由的逻辑过程:

代码语言:javascript复制
(1) 请求开始:Gateway Client 向 Spring Cloud Gateway 发送请求,请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文.
(2) 执行断言:网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用
(3) 过滤器链:如果过断言成功,由FilteringWebHandler 创建过滤器链并调用
执行所有 前置过滤器逻辑。然后进行代理请求(分发到具体微服务)。完成代理请求后,将运行 后置过滤器逻辑。
(4) 响应:处理完毕之后将 Response 返回到 Gateway 客户端

动手上代码

1、添加依赖

添加 gateway 依赖

代码语言:javascript复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、写个 main 函数启动

代码语言:javascript复制
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("启动成功 !");
    }
}

3、写 yml 配置文件

代码语言:javascript复制
# Tomcat
server:
  port: 8080

# Spring
spring:
  application:
    # 应用名称
    name: gateway
  profiles:
    # 环境配置
    active: dev
  main:
    allow-bean-definition-overriding: true
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        - id: account-service
          uri: http://localhost:8803/
          #uri: lb://account-service
          predicates:
            - Path=/account/**
          filters:
            - StripPrefix=1

配置转发的方式,常用两种: (1) 直接转发,直接写网址,这样配置。

代码语言:javascript复制
uri: http://localhost:8803/

(2) 负载均衡转发到具体微服务

代码语言:javascript复制
uri: lb://account-service

扩展:关联到 naocs

如果关联nacos,依赖:

代码语言:javascript复制
<!-- SpringCloud Alibaba Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

注意, nacos 不要使用 ribon负载均衡器,建议使用 loadbalancer,添加下面的依赖。 不引入下面这个依赖的话,配置 lb://you_service 格式的url 将无法使用

代码语言:javascript复制
<!-- SpringCloud Loadbalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

0 人点赞