大纲
前言
版本说明
在本文中,默认使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,特别声明除外。
Gateway 基于服务发现的路由规则
Gateway 服务发现路由的概述
Spring Cloud 对 Zuul 进行封装处理之后,当通过 Zuul 访问后端微服务时,基于服务发现的默认路由规则是:http://zuul_host:zuul_port/微服务在Eureka上的ServiceId/**。Spring Cloud Gateway 在设计的时候考虑了从 Zuul 迁移到 Gateway 的兼容性和迁移成本等,Gateway 基于服务发现的路由规则和 Zuul 的设计类似,但是也有很大差别。Spring Cloud Gateway 基于服务发现的路由规则,在不同注册中心下其差异如下:
- 如果把 Gateway 注册到 Consul 上,通过网关转发服务调用,服务名称默认小写,不需要做任何处理
- 如果把 Gateway 注册到 Zookeeper 上,通过网关转发服务调用,服务名称默认小写,不需要做任何处理
- 如果把 Gateway 注册到 Eureka 上,通过网关转发服务调用,访问网关的 URL 是
http://Gateway_HOST:Gateway_PORT/大写的ServiceId/**,其中服务名称默认必须是大写,否则会抛 404 错误;如果服务名要用小写访问,可以在属性配置文件里面加 spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true 配置解决
特别注意
- 将 Gateway 注册到服务注册中心后,为了在外部可以通过服务名称让 Gateway 转发服务调用,需要在配置文件中设置
spring.cloud.gateway.discovery.locator.enabled 为 true,表示 Gateway 需要与服务发现组件进行结合使用。 - 配置之后就可以通过服务名称(
serviceId)将请求转发到具体的服务实例。比如 http://localhost:8080/cloud-payment-service/pay/list,其中 http://localhost:8080 是 Gateway 的访问地址,cloud-payment-service 是服务名称。