美文网首页springcloud
Spring Cloud Alibaba Nacos+Gatew

Spring Cloud Alibaba Nacos+Gatew

作者: 赵哥窟 | 来源:发表于2022-05-07 18:14 被阅读0次

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

    Mac M1芯片

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

    项目整体目录
    截屏2022-05-07 17.59.05.png
    Gateway

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

    pom文件

     <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

    # 应用服务 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转发的时候不知道转发那个项目

    @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();
        }
    }
    

    修改为

    @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

    这样就能正常转发了。

    相关文章

      网友评论

        本文标题:Spring Cloud Alibaba Nacos+Gatew

        本文链接:https://www.haomeiwen.com/subject/asuxurtx.html