# 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 效果: ![网关转发后.png](https://gitee.com/guanxiongzai/spring-gateway-demo/raw/main/jpg/%E7%BD%91%E5%85%B3%E8%BD%AC%E5%8F%91%E5%90%8E.png) # 加入微服务注册与发现的方式 如果服务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 ![通过微服务名进行网关转发.png](https://gitee.com/guanxiongzai/spring-gateway-demo/raw/main/jpg/%E9%80%9A%E8%BF%87%E5%BE%AE%E6%9C%8D%E5%8A%A1%E5%90%8D%E8%BF%9B%E8%A1%8C%E7%BD%91%E5%85%B3%E8%BD%AC%E5%8F%91.png) # 改造为动态路由 1. 依赖不变 2. 配置不变 3. 编写一个Service类,提供修改Route的服务 1. 声明一个存放Route的集合 ```java private static List routeIds = Lists.newArrayList(); ``` 2. 使用注解@NacosConfigListener监听指定配置