SpringCloud-Alibaba 最新的 依赖版本管理组合以及 整合gateway遇到的问题

Posted 一个哈欠走天下

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud-Alibaba 最新的 依赖版本管理组合以及 整合gateway遇到的问题相关的知识,希望对你有一定的参考价值。

一般来说,cloud 与 alibaba 拥有版本组合说明文档wiki,不过这里可以做一个最新的组合的分享。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <!-- Import dependency management from Spring Boot -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.4.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

cloud: 2020.0.1
cloud alibaba: 2021.1
springboot: 2.4.6
spring-cloud-starter-openfeign: 3.0.3
spring-cloud-starter-loadbalancer: 3.0.3

再跟着官网整合 gateway的时候,启动网关报错。发现网关作为一个服务的入口对内进行访问肯定也是需要服务发现,那么也是需要远程调用服务的,于是就需要引入openfeign以及后面ribbon的替换 loadbalancer

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

都修改完毕之后,发现网关服务可以正常启动了,但是这个时候发现一件事,gateway 配置Path属性之后尝试不符合回报404,但是符合会报错503提示没有找到该服务。

经过百度了解到:
gateway 网关在发送请求之后会将Path后面的包含绝对匹配内容如/nacos-service/xxx 中的nacos-service也拼过去就会形成匹配到了,但是没有找到对应的服务接口导致gateway给予503没有可用资源。

yml 完整配置如下:


spring:
  application:
    name: gateway-test
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: feign-consumer
          uri: lb://feign-consumer
          predicates:
            - Path=/consumer/**
          filters:
            - StripPrefix=1

        - id: nacos-test
          uri: lb://nacos-test
          predicates:
            - Path=/nacos/**
          filters:
            - StripPrefix=1
server:
  port: 8888

id作为一个标识
uri是lb = loadbalancer的缩写,请求会自动负载均衡,nacos-test就是注册中心所在的服务注册中心的服务名称。

解决503匹配到对应的服务中心之后对应的RPC远程请求的时候会把/consumer也给拼上去,导致资源找不到

解决办法有两个:
第一种:
是在网关以外的请求服务模块yml中新增一个server.servlet.context-path="/consumer" 这样在完整转发的时候就可以以资源开头作为统一的访问。
第二种:
是在网关的yml 配置匹配约束Path的时候,对请求资源完成一个过滤,

          filters:
            - StripPrefix=1

属性就可以解决,汉译:剥夺前缀。1就会剥夺前面的/consumer 而将后面的作为请求资源转发过去。

个人认为第二种比较合适一些。

以上是关于SpringCloud-Alibaba 最新的 依赖版本管理组合以及 整合gateway遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

springcloud-Alibaba入门简介

SpringCloud-Alibaba系列教程2.搭建用户微服务模块

SpringCloud-Alibaba的Nacos究竟有多好用?

【SpringCloud-Alibaba系列教程】5.负载均衡

SpringCloud-Alibaba系列教程14.一文教你入门RocketMQ

【SpringCloud-Alibaba系列教程】13.gateway网关结合Sa-token进行登录鉴权