Spring Cloud | Nacos + Spring Cloud Gateway整合示例

网关的应用场景

网关是所有微服务的门户,我总结了一些网关的常用应用场景。

Spring Cloud Gateway中几个比较重要的概念

  • 路由(Route):它是网关的基本组件,由ID、目标URI、Predicate集合、Filter集合组成。
  • 断言(Predicate):参照Java8的新特性Predicate,允许开发人员匹配HTTP请求中的任何内容,比如头或参数。
  • 过滤器(Filter):可以在返回请求之前或之后修改请求和响应的内容。

断言

断言是Java 8提供的一个函数式接口,它允许接收一个参数并返回一个布尔值,可以用于条件过滤、请求参数的校验。

Spring Cloud Gateway 默认提供了许多断言,这些断言的源码在org.springframework.cloud.gateway.handler.predicate包中。这些断言会分别匹配 HTTP 请求的不同属性,并且多个断言可以通过 and 逻辑进行组合。

过滤器

过滤器分为Pre类型的过滤器和Post类型的过滤器。

  • Pre类型的过滤器在请求转发到后端微服务之前执行,在Pre类型过滤器链中可以做鉴权、限流等操作。
  • Post类型的过滤器在请求执行完之后、将结果返回给客户端之前执行。

在 Spring Cloud Gateway 中内置了很多过滤器,过滤器有两种实现,分别是GatewayFilterGlobalFilterGlobalFilter会应用到所有的路由上,而GatewayFilter只会应用到单个路由或者一个分组的路由上。

环境搭建

搭建项目前需要先启动 Nacos 服务。我比较喜欢使用 Docker 安装、启动 Nacos 。如果你对这种方式感兴趣,可以参考我之前写的一篇文章传送门

项目结构

项目名称端口号说明
jasmine-cloud--父工程
jasmine-gateway9010网关服务,服务注册到nacos
jasmine-auth9012权限服务,服务注册到nacos

创建jasmine-cloud项目

jasmine-cloud是一个父工程,没有代码,只有一个pom.xml文件。pom.xml文件的具体内容如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <groupId>org.jasmine.cloud</groupId>
    <artifactId>jasmine-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

 

Spring CloudSpring Cloud AlibabaSpring Boot三者的版本需要注意下,Spring CloudSpring Cloud AlibabaSpring Boot三者的版本应该是有对应关系的,如果版本对应不上,可能会有意想不到的BUG。我只尝试了如下两套版本。

Spring CloudSpring Cloud AlibabaSpring Boot是否可行
第一套2020.0.02021.12.4.2报错
第二套Hoxton.SR32.2.1.RELEASE2.2.5.RELEASE可行

最初的时候,我使用的是第一套版本。执行curl命令报错。我没有深究错误原因,然后就尝试了第二套版本,没有再报错。

 

curl http://127.0.0.1:9010/auth/hello
{"timestamp":"2022-07-30T00:51:40.182+00:00","path":"/auth/hello","status":503,"error":"Service Unavailable","message":"","requestId":"ef67c669-1"}

创建jasmine-gateway子项目

jasmine-gateway是网关服务,服务注册到Nacos,使用Nacos的配置管理功能实现了配置信息动态变更。如果不了解与Nacos整合,可以参考我之前写的一篇文章传送门

  1. 项目依赖
  2. <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <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>

  3. 配置文件(bootstrap.yml)
    server:
      port: 9010
    spring:
      profiles:
        active: dev
      application:
        name: jasmine-gateway
      cloud:
        nacos:
          config:
            file-extension: yaml
            group: ${spring.profiles.active}
            prefix: ${spring.application.name}
            server-addr: 127.0.0.1:8848
        gateway:
          discovery:
            locator:
              enabled: true
              # 是否使用service-id的小写,默认是大写
              lower-case-service-id: true

  4. Nacos新增配置
  5. Data Id:jasmine-gateway.yaml
    Group:dev
    配置内容:

  6. spring:
      cloud:
        gateway:
          ## 路由
          routes:
            - id: jasmine-auth
              uri: lb://jasmine-auth
              predicates:
                - Path=/auth/**

    上面配置中字段的含义简单说明下。

  7. id:自定义路由ID,保持唯一。
  8. uri:目标服务地址,支持普通URI及lb://应用注册服务名称,后者表示从注册中心获取集群服务地址。
  9. predicates:路由条件,根据匹配的结果决定是否执行该请求路由。
  10. 创建jasmine-auth子项目

  11. 项目依赖
  12. <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>

  13. 配置文件(bootstrap.yml)
  14. server:
      port: 9012
    spring:
      profiles:
        active: dev
      application:
        name: jasmine-auth
      cloud:
        nacos:
          config:
            file-extension: yaml
            group: ${spring.profiles.active}
            prefix: ${spring.application.name}
            server-addr: 127.0.0.1:8848
        gateway:
          discovery:
            locator:
              enabled: true
              # 是否使用service-id的小写,默认是大写
              lower-case-service-id: true

  15. 控制器
  16. 一个简单的用于测试接口的控制器类。

  17. @RestController
    @RequestMapping("/auth")
    public class HelloController {
    
        @GetMapping("/hello")
        public String index() {
            return "hello world.";
        }
    }

    测试

  18. 依次启动jasmine-gatewayjasmine-auth项目;
  19. 打开命令行工具(我用的是cmder),输入命令:curl http://127.0.0.1:9010/auth/hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值