阅读完需:约 3 分钟
在实际的工作中,服务的相互调用都是依赖于服务中心提供的入口来使用,服务中心往往注册了很多服务,如果每个服务都需要单独配置的话,这将是一份很枯燥的工作。Spring Cloud Gateway 提供了一种默认转发的能力,只要将 Spring Cloud Gateway 注册到服务中心,Spring Cloud Gateway 默认就会代理服务中心的所有服务。
整合 Eureka 路由
为GateWay添加 注册中心的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置基于 Eureka 的路由:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user-service/**
uri 以lb://
开头(lb 代表从注册中心获取服务),后面接的就是你需要转发到的服务名称,这个服务名称必须跟 Eureka 中的对应,否则会找不到服务,错误代码如下:
org.springframework.cloud.gateway.support.NotFoundException: Unable to find instance for user-service1
整合 Eureka 的默认路由
Zuul 默认会为所有服务都进行转发操作,我们只需要在访问路径上指定要访问的服务即可,通过这种方式就不用为每个服务都去配置转发规则,当新加了服务的时候,不用去配置路由规则和重启网关。
在 Spring Cloud Gateway 中当然也有这样的功能,通过配置即可开启,配置如下:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
示例:
server:
port: 2001
spring:
application:
name: cloud-gateway-eureka
cloud:
gateway:
discovery:
locator:
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:8000/eureka/
logging:
level:
org.springframework.cloud.gateway: debug
配置说明:
-
spring.cloud.gateway.discovery.locator.enabled
:是否与服务注册于发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为 false,设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能。 -
eureka.client.service-url.defaultZone
指定注册中心的地址,以便使用服务发现功能 -
logging.level.org.springframework.cloud.gateway
调整相 gateway 包的 log 级别,以便排查问题
开启之后我们就可以通过地址去访问服务了,格式如下:
http://网关地址/服务名称(大写)/**
http://localhost:2001/USER-SERVICE/user/get?id=1
这个大写的名称还是有很大的影响,如果我们从 Zuul 升级到 Spring Cloud Gateway 的话意味着请求地址有改变,或者重新配置每个服务的路由地址,通过源码笔者发现可以做到兼容处理,再增加一个配置即可:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
配置完成之后我们就可以通过小写的服务名称进行访问了,如下所示:
http://网关地址/服务名称(小写)/**
http://localhost:2001/user-service/user/get?id=1
注意:开启小写服务名称后大写的服务名称就不能使用,两者只能选其一。