Spring Cloud Alibaba Nacos+Gateway踩坑

2022-05-13 18:44:30 浏览数 (1)

最近学习Nacos和Gateway的使用,把这些天踩的坑做一个记录,

Mac M1芯片

Nacos 的使用倒是比较简单,但是由于用的Mac M1芯片的电脑,使用过程中踩坑在上一篇已经写过了

Mac M1芯片Nacos

项目整体目录

截屏2022-05-07 17.59.05.png

Gateway

目的就是想用Gateway 来做项目接口访问的统一入口

pom文件

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

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

        <!-- gateway 网关依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>

application.yml 文件 因为我使用GateWayConfig 配置Gateway,所以就没有在

application.yml 配置Gateway

代码语言:javascript复制
# 应用服务 WEB 访问端口
server:
  port: 9092
spring:
  application:
    name: project-gateway # 应用名称
  cloud:
    nacos:
      discovery:
        username: nacos
        password: nacos
        # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
        server-addr: 127.0.0.1:8848
        namespace: 484de66d-d85c-4f8c-92e5-dfc4c3e03373 # 注册到 nacos 的指定 namespace,默认为 public
    # gateway 配置
    gateway:
      discovery:
        locator:
          enabled: true # gateway可以从nacos发现微服务
          lower-case-service-id: true #服务名称支持小写
踩坑1

同时使用spring-boot-starter-web和spring-cloud-starter-gateway会冲突,所以

删除spring-boot-starter-web

踩坑2

使用GateWay访问project-a服务报404,我这比较奇葩了,由于spring-cloud-starter-gateway没有写版本,所以spring-cloud-starter-gateway没有下载下来

添加版本重新下载好了就没有问题了

踩坑3

刚开始Gateway配置文件是这样写的,我访问project-a接口的时候没有问题,访问project-b接口又报404,后面找到原因了,因为转发的时候project-a和project-b的接口路径都是/api/** 开头的,所以Gateway转发的时候不知道转发那个项目

代码语言:javascript复制
@Configuration
public class GateWayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("project-a_route", r -> r.path("/api/**")
                
                        .uri("lb://project-a"))

                .route("project-b_route", r -> r.path("/api/**").
                        .uri("lb://project-b"))
                .build();
    }
}

修改为

代码语言:javascript复制
@Configuration
public class GateWayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("project-a_route", r -> r.path("/projectA/api/**")
                        .filters(f -> f.rewritePath("/projectA/(?<remaining>.*)", "/${remaining}"))
                        .uri("lb://project-a"))

                .route("project-b_route", r -> r.path("/projectB/api/**").
                        filters(f -> f.rewritePath("/projectB/(?<remaining>.*)", "/${remaining}"))
                        .uri("lb://project-b"))
                .build();
    }
}

加上一个项目前缀,然后再过滤掉前缀

使用Gateway访问:

http://localhost:9092/projectA/api/xxx/xxxx

http://localhost:9092/projectB/api/xxx/xxxx

这样就能正常转发了。

0 人点赞