概述:在上一章节《SpringCloud 微服务网关Gateway介绍及简单路由配置》中我们讲述了Gateway的最简单的路由配置方式。但是其中比较明显的问题就是我们在配置路由服务的地址时写死某一台服务的地址,实际中一个服务可能会有多个服务器节点,所以本章我们来将固定ip配置调整为微服务的服务名称代替服务的ip。下面介绍不同的配置使用方式。
一、通过服务名称获取请求服务地址
由于需要通过微服务服务名称,来调用路由,所以必须通过注册中心来实现此功能,我们将微服务以及Gateway网关应用接入到Eureka中。调整Gateway工程配置文件如下:
请求测试地址:http://127.0.0.1:8080/payment/get/1
server:
port: 8080
spring:
application:
name: api-gateway-server #服务名称
cloud:
gateway:
routes:
#配置路由: 路由id,路由到微服务的uri,断言(判断条件)
- id: product-service #保持唯一
#uri: http://127.0.0.1:8001 #目标为服务地址
uri: lb://cloud-payment-service # lb:// 根据服务名称从注册中心获取请求地址路径
predicates:
- Path=/payment/** #路由条件 path 路由匹配条件
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1.com:9000/eureka/
instance:
prefer-ip-address: true #使用ip进行注册
二、重写转发路径方式
我们想对一个服务中的所有接口路径中前面加上相同的路径,比如我们需要将商品服务中查询商品,商品创建等所有接口前面都加上 /product-service 路径,那么该怎么调整呢?
实现思路:修改路径匹配规则-Path + 使用过滤器重写转发请求路径,使用-RewritePath 将前面的/product-service 部分过滤掉。
测试地址 http://127.0.0.1:8080/product-service/payment/get/1
调整后的配置文件如下:
server:
port: 8080
spring:
application:
name: api-gateway-server #服务名称
cloud:
gateway:
routes:
#配置路由: 路由id,路由到微服务的uri,断言(判断条件)
- id: product-service #保持唯一
#uri: http://127.0.0.1:8001 #目标为服务地址
uri: lb://cloud-payment-service # lb:// 根据服务名称从注册中心获取请求地址路径
predicates:
#- Path=/payment/** #路由条件 path 路由匹配条件
- Path=/product-service/** #给服务名称前加上一个固定的应用分类路径 将该路径转发到 http://127.0.0.1:8001/payment/get/1
filters: #配置路由过滤器 http://127.0.0.1:8080/product-service/payment/get/1 -> http://127.0.0.1:8001/payment/get/1
- RewritePath=/product-service/(?<segment>.*),/$\{segment} #路径重写的过滤器,在yml中$写为 $\
#eureka 注册中心
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1.com:9000/eureka/
instance:
prefer-ip-address: true #使用ip进行注册
三、开启微服务名称转发
如果我们想直接通过微服务名称进行接口对应转发,该如何配置?这时需要开启根据服务名称自动转发即可。重点 discovery 部分。
测试地址:http://127.0.0.1:8080/cloud-payment-service/payment/get/1
server:
port: 8080
spring:
application:
name: api-gateway-server #服务名称
cloud:
gateway:
routes:
#配置路由: 路由id,路由到微服务的uri,断言(判断条件)
- id: product-service #保持唯一
#uri: http://127.0.0.1:8001 #目标为服务地址
uri: lb://cloud-payment-service # lb:// 根据服务名称从注册中心获取请求地址路径
predicates:
#- Path=/payment/** #路由条件 path 路由匹配条件
- Path=/product-service/** #给服务名称前加上一个固定的应用分类路径 将该路径转发到 http://127.0.0.1:8001/payment/get/1
filters: #配置路由过滤器 http://127.0.0.1:8080/product-service/payment/get/1 -> http://127.0.0.1:8001/payment/get/1
- RewritePath=/product-service/(?<segment>.*),/$\{segment} #路径重写的过滤器,在yml中$写为 $\
# 配置自动根据微服务名称进行路由转发 http://127.0.0.1:8080/cloud-payment-service/payment/get/1
discovery:
locator:
enabled: true #开启根据服务名称自动转发
lower-case-service-id: true #微服务名称已小写形式呈现
#eureka 注册中心
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka1.com:9000/eureka/
instance:
prefer-ip-address: true #使用ip进行注册