默认情况下Gateway会根据注册中心的服务列表,以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
1.修改application.yml
增加了 spring.cloud.gateway.discovery.locator.enabled=true 配置表示开启从注册中心动态创建路由的功能,利用微服务名进行路由。
修改 spring.cloud.gateway.routes.uri=lb://cloud-payment-service 此处修改成要路由的微服务名,但是必须要加上lb协议
完整的application.yml配置文件如下:
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
#uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service #此处需要使用lb协议
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2
#uri: http://localhost:8001
uri: lb://cloud-payment-service #此处需要使用lb协议
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
lower-case-service-id: true #使用小写服务名,默认是大写
eureka:
client:
# 表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
# 是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
instance-id: payment8001
#访问路径可以显示IP地址
prefer-ip-address: true
#Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
#lease-renewal-interval-in-seconds: 1
#Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
#lease-expiration-duration-in-seconds: 2
2.启动并测试
启动Eureka注册中心:cloud-eureka-server7001,cloud-eureka-server7002
启动服务提供者:cloud-provider-payment8001,cloud-provider-payment8002
启动Gateway网关:cloud-gateway-gateway9527
浏览器执行2次请求:http://localhost:9527/payment/lb
会返回如下内容,可以发现两个服务提供者都访问成功表示根据服务名进行路由已经成功了并且实现了负载均衡
8002
8001