最近学习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
这样就能正常转发了。