SpringCloudGateway搭建及路由配置

194 阅读2分钟

一、jc-club-oss微服务注册到nacos上

之前只进行动态配置未注册到注册中心,后续其他微服务都要远程调用oss文件微服务

1.1 通过阿里云脚手架进行版本控制

<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.4.2</spring-boot.version>
    <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    <spring-cloud.version>2020.0.6</spring-cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

1.2 添加bootstrap依赖

当cloud alibaba 版本为2021.1时,默认不会加载bootstrap文件,需要引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

1.3 添加discovery注册中心服务发现依赖

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

1.4 结果

此时Nacos服务列表中会出现oss微服务

image.png

二、Gateway网关搭建及路由配置

2.1 将Gateway微服务注册到nacos

引入cloud alibaba;cloud;boot;nacos服务端、discovery等依赖

引入Gateway依赖

<!--gateway依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2.2 配置网关属性

spring:
  cloud:
    gateway:
      routes: # - 代表数组,有多个值
        - id: oss #路由id,自定义,只要唯一即可(唯一标识)
          uri: lb://jc-club-oss #路由的目标地址 lb是负载均衡,后面跟微服务名称
          predicates:  #路由断言,判断请求是否符合路由规则的条件
            - Path=/oss/** #只要以oss开头的请求都符合,都会路由到jc-club-oss微服务中
          filters:
            - StripPrefix=1

StripPrefix=1意思是在将请求转发到目标微服务之前,会把请求路径中的第一层前缀去掉。

例如:如果请求路径是 /oss/upload经过这个过滤器处理后,转发给 jc-club-oss 微服务的实际请求路径就会变成 /upload与controller层一致。这样可以使得后端微服务接收到的请求路径更符合其自身的接口设计预期等情况。

2.3 解决gateway与MVC冲突问题

此时启动会报错:

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.

image.png

原因:这个错误信息是因为你的项目中同时存在Spring MVC和Spring Cloud Gateway,这两者是不兼容的。Spring Cloud Gateway是基于Spring WebFlux构建的,Spring WebFlux是一个非阻塞的反应式web框架,而Spring MVC是一个阻塞的框架,它包含在spring-boot-starter-web依赖中

解决:将pom文件中的spring-boot相关依赖删除(web、slf4j)

此时可正常启动、gateway服务也成功注册到nacos。(springcloud继承了springboot自动配置的功能、即使不引入spring-boot-starter-web、cloud内部已经包含了该starter)

2.4 添加loadbalancer依赖

在router中uri配置了lb://时要引入负载均衡依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>

2.5 测试

调用http://localhost:5000/oss/upload 后 oss微服务可正确进行响应

image.png