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


    本篇文章使用一个简单的示例来演示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 中内置了很多过滤器,过滤器有两种实现,分别是 GatewayFilter 和 GlobalFilter 。 GlobalFilter 会应用到所有的路由上,而 GatewayFilter 只会应用到单个路由或者一个分组的路由上。

    环境搭建

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

    项目结构

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

    创建jasmine-cloud项目

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

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.2.5.RELEASEversion>
    9. parent>
    10. <groupId>org.jasmine.cloudgroupId>
    11. <artifactId>jasmine-cloudartifactId>
    12. <version>1.0-SNAPSHOTversion>
    13. <packaging>pompackaging>
    14. <properties>
    15. <maven.compiler.source>8maven.compiler.source>
    16. <maven.compiler.target>8maven.compiler.target>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.projectlombokgroupId>
    21. <artifactId>lombokartifactId>
    22. dependency>
    23. dependencies>
    24. <dependencyManagement>
    25. <dependencies>
    26. <dependency>
    27. <groupId>org.springframework.cloudgroupId>
    28. <artifactId>spring-cloud-dependenciesartifactId>
    29. <version>Hoxton.SR3version>
    30. <type>pomtype>
    31. <scope>importscope>
    32. dependency>
    33. <dependency>
    34. <groupId>com.alibaba.cloudgroupId>
    35. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    36. <version>2.2.1.RELEASEversion>
    37. <type>pomtype>
    38. <scope>importscope>
    39. dependency>
    40. dependencies>
    41. dependencyManagement>
    42. project>

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

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

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

    1. curl http://127.0.0.1:9010/auth/hello
    2. {"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. 项目依赖
    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloudgroupId>
    7. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>org.springframework.cloudgroupId>
    11. <artifactId>spring-cloud-starter-gatewayartifactId>
    12. dependency>
    1. 配置文件(bootstrap.yml)
    1. server:
    2. port: 9010
    3. spring:
    4. profiles:
    5. active: dev
    6. application:
    7. name: jasmine-gateway
    8. cloud:
    9. nacos:
    10. config:
    11. file-extension: yaml
    12. group: ${spring.profiles.active}
    13. prefix: ${spring.application.name}
    14. server-addr: 127.0.0.1:8848
    15. gateway:
    16. discovery:
    17. locator:
    18. enabled: true
    19. # 是否使用service-id的小写,默认是大写
    20. lower-case-service-id: true
    1. Nacos新增配置

    Data Id:jasmine-gateway.yaml

    Group:dev

    配置内容:

    1. spring:
    2. cloud:
    3. gateway:
    4. ## 路由
    5. routes:
    6. - id: jasmine-auth
    7. uri: lb://jasmine-auth
    8. predicates:
    9. - Path=/auth/**

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

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

    创建jasmine-auth子项目

    1. 项目依赖
    1. <dependency>
    2. <groupId>com.alibaba.cloudgroupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>com.alibaba.cloudgroupId>
    7. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    8. dependency>
    9. <dependency>
    10. <groupId>org.springframework.bootgroupId>
    11. <artifactId>spring-boot-starter-webartifactId>
    12. dependency>
    1. 配置文件(bootstrap.yml)
    1. server:
    2. port: 9012
    3. spring:
    4. profiles:
    5. active: dev
    6. application:
    7. name: jasmine-auth
    8. cloud:
    9. nacos:
    10. config:
    11. file-extension: yaml
    12. group: ${spring.profiles.active}
    13. prefix: ${spring.application.name}
    14. server-addr: 127.0.0.1:8848
    15. gateway:
    16. discovery:
    17. locator:
    18. enabled: true
    19. # 是否使用service-id的小写,默认是大写
    20. lower-case-service-id: true
    1. 控制器

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

    1. @RestController
    2. @RequestMapping("/auth")
    3. public class HelloController {
    4. @GetMapping("/hello")
    5. public String index() {
    6. return "hello world.";
    7. }
    8. }

    测试

    1. 依次启动 jasmine-gateway 、 jasmine-auth 项目;
    2. 打开命令行工具(我用的是 cmder ),输入命令: curl http://127.0.0.1:9010/auth/hello 。
  • 相关阅读:
    木聚糖-聚乙二醇-聚乙烯亚胺|PEI-PEG-Xylan|聚乙烯亚胺-PEG-木聚糖
    spring:详解控制反转IOC和AOP
    Python开发者必读:Pip使用全攻略与最佳实践
    redsi总结_最佳实战
    中级xss绕过【xss Game】
    【电商】跨境电商「保税」业务(附支付宝、微信对接指南)
    [注塑]各种进胶方式优缺点分析
    【wiki知识库】02.wiki知识库SpringBoot后端的准备
    Python武器库开发-flask篇之路由和视图函数(二十二)
    java计算机毕业设计辅导员班级量化管理系统源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/Q54665642ljf/article/details/126081699