# spring-gateway-demo
**Repository Path**: guanxiongzai/spring-gateway-demo
## Basic Information
- **Project Name**: spring-gateway-demo
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-28
- **Last Updated**: 2023-08-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# gateway实战Demo
1.实现简单的转发请求,将访问网关的/nacos-service-provider请求转发到
nacos-service-provider项目的端口
# 涉及技术
spring-gateway
nacos配置监听
# gateway搭建步骤
做法:eureka+gateway(由于eureka2.0闭源所以不建议使用)
这里使用的是nacos+gateway
1. 加入依赖
由于spring-boot-parent项目没有指定spring-cloud的版本,所以需要指定版本,不然会报错
spring-boot 2.3.6.RELEASE版本对应的是Hoxton.SR12
spring-boot 2.3.6.RELEASE版本对应com.alibaba.cloud的是2.2.7.RELEASE
```xml
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR12
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.7.RELEASE
pom
import
```
然后再加入gateway的jar包
```xml
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-starter-gateway
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
org.apache.commons
commons-lang3
```
2. 修改配置
```yml
# ancos 配置
spring:
application:
name: spring-gateway-demo
cloud:
gateway: # 网关配置
enabled: true # 开启网关
routes:
- id: nacos-service-provider # 路由id,只要符合Java命名规则即可
uri: http://localhost:8082 # 转发的uri
predicates: # 匹配谓词,访问地址符合下面规则才会转发
- Path=/nacos-service-provider/**
#filters:
# - StripPrefix= 1 # 过滤转发地址前缀过滤1节,这里用不到,所以注释了
server:
#servlet:
# context-path: /spring-gateway-demo # !!!如果使用了网关,这个配置不齐作用的
port: 9999
nacos: # 此处使用nacos是为了读取动态路由配置
config:
server-addr: 127.0.0.1:8848
```
详细配置讲解:
谓词配置:
```yml
# 定义一个谓词,格式:谓词名字=参数 或者 name: 名字 args : 参数,详细可看PredicateDefinition
# 谓词命名是有特殊语法的
# 如果存在 等于号,那么等于号前面那一串为name【不包含等于号】后面那一串以逗号分隔,放入一个map集合中,map的key值使用NameUtils.generateName(i)生成
# Path = /api/** 的意思是匹配/api+任意路径的地址,如果没有没有/**,只会匹配/api,不会匹配/api/xxx
predicates:
- name: xxx
- args: xxx
- Path = /api/**
```
过滤器配置:
```yml
# 定义一个过滤器,格式:过滤器=参数 或者 name: 名字 args : 参数,详细可看FilterDefinition
# 过滤器命名是有特殊语法的
# 如果存在 等于号,那么等于号前面那一串为name【不包含等于号】后面那一串以逗号分隔,放入一个map集合中,map的key值使用NameUtils.generateName(i)生成
# StripPrefix= 1 的意思是将转发地址的前缀过滤1节,例如:访问localhost:9999/spring-gateway-demo/nacos-service-provider/getUser(这里只是说明,此demo不会有/spring-gateway-demo这一段)
# 经过网关转发后变成:localhost:8082/spring-gateway-demo/nacos-service-provider/getUser
# 然后载进行过滤1节:localhost:8082/nacos-service-provider/getUser
filters:
- name: xxx
- args: xxx
- StripPrefix= 1
```
```
3. 完成配置,启动网关,访问
localhost:9999/spring-gateway-demo/nacos-service-provider/getUser
地址将会转发到:
localhost:8082/nacos-service-provider/getUser
效果:

# 加入微服务注册与发现的方式
如果服务IP变动的话,就需要修改代码,使用服务注册与发现可以避免这种情况
1. 加入依赖
```xml
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
```
2. 加入配置
```yml
spring:
cloud:
nacos: # 加入服务发现的nacos配置
discovery:
server-addr:server: 127.0.0.1:8848
username: nacos
password: nacos
namespace: public
gateway:
enabled: true # 开启Gateway网关功能
routes:
- id: mdc-mvc-demo
uri: http://localhost:8081
predicates:
- Path=/mdc-mvc-demo/**
filters:
- StripPrefix= 1
- id: nacos-service-provider
# uri: http://localhosst:8082 # 这种方式在实际调试中仅能使用IP地址
uri: lb://nacos-service-provider # 如果需要使用微服务调用,需要使用lb://
predicates:
- Path=/nacos-service-provider/**
```
3. 启动调试
访问localhost:9999/nacos-service-provider/getUser

# 改造为动态路由
1. 依赖不变
2. 配置不变
3. 编写一个Service类,提供修改Route的服务
1. 声明一个存放Route的集合
```java
private static List routeIds = Lists.newArrayList();
```
2. 使用注解@NacosConfigListener监听指定配置