SpringCloud Gateway整合Eureka路由转发
一、Spring Cloud Gateway介绍
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
可是不是已经有Zuul了吗,为什么又搞了一个网关?
之所以新搞了一个网关,是因为Zuul基于servlet 2.5 (works with 3.x),使用阻塞API。它不支持任何长期的连接,如websocket。
Gateway建立在Spring Framework 5,Project Reactor和Spring Boot 2上,使用非阻塞API。支持Websockets,因为它与Spring紧密集成,所以它会是一个让开发者有更好体验的框架。当然性能的提升是肯定的,不然完全没必要重新搞一个啊,只不过Zuul2出来的太迟了,自己已经搞了一个,所以不太可能会将Zuul2集成到Spring Cloud中了。
关于性能这块的比较可以参考文章《纠错帖:Zuul & Spring Cloud Gateway & Linkerd性能对比》
二、工作原理

 如上图所示,客户端发送请求到Spring Cloud Gateway,Gateway Handler Mapping确定请求与路由匹配,则会将请求交给Gateway Web Handler处理。
在代理前后可以执行多个过滤器。最后代理到具体的服务。
三、创建项目集成Gateway
1、创建maven项目
首先还是最基本的步骤,创建一个新项目,选择下图两个依赖,会自动添加Gateway需要的依赖信息:
本文是基于上一篇Eureka搭建成功之后集成Eureka的,若不想集成Eureka,不需要添加Eureka相关依赖。

2、依赖说明
如果项目创建时没有勾选上图的依赖,可以直接复制下面的依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3、配置说明
先说一下配置具体的转发规则的配置(本文未采用),这边需要注意下的是uri的配置:
server:
port: 7888
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: eureka-client-user-service
uri: lb://eureka-client-user-service
predicates:
- Path=/user/**
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:7887/eureka/
instance:
prefer-ip-address: true
(1) uri以lb://开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称,这个服务名称必须跟eureka中的对应,否则会找不到服务。
(2) predicates:配置的是你服务的访问路径

当你访问 http://127.0.0.1:7888/user/ (http://网关地址/)的时候就会转发到:
http://eureka-client-user-service/user/。
(3) 如果引入了spring-cloud-starter-netflix-eureka-client包,但你不想整合Eureka,也可以通过下面的配置关闭:
- eureka.client.enabled=false
(4) 说完了直接配置路由的方式,我们来说说不配置的方式也能转发,只需要在访问路径上指定要访问的服务即可,通过这种方式就不用为每个服务都去配置转发规则,当新加了服务的时候,不用去配置路由规则和重启网关。(Zuul默认会为所有服务都进行转发操作)
只需要通过配置即可开启,配置如下:
- spring.cloud.gateway.discovery.locator.enabled=true
开启之后我们就可以通过地址去访问服务了,格式如下:
http://网关地址/服务名称(大写)/**
这个大写的名称还是有很大的影响,如果我们从Zuul升级到Spring Cloud Gateway的话意味着请求地址有改变,或者重新配置每个服务的路由地址,通过源码我发现可以做到兼容处理,再增加一个配置即可:
- spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true
配置完成之后我们就可以通过小写的服务名称进行访问了,如下:
http://网关地址/服务名称(小写)/**
4、添加配置文件
在application.yml文件中添加如下配置:

server:
port: 7888
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
eureka: #eureka配置
client:
serviceUrl:
defaultZone: http://127.0.0.1:7887/eureka/ #注册中心地址
instance:
prefer-ip-address: true
5、启动测试
下面的示例启动两个服务:gataway 和 eureka-client-user-service 都注册到注册中心 Eureka上,客户端请求后端服务【eureka-client-user-service】,网关提供后端服务的统一入口。网关通过负载均衡将客户端请求转发到具体的后端服务。
| 序号 | 服务名称 | 端口号 | 备注 | 
|---|---|---|---|
| 1 | gateway | 7888 | 网关服务 | 
| 2 | eureka-client-user-service | 7878 | 服务提供者 | 
| 3 | eureka-server | 7887 | 注册中心 | 
分别启动注册中心、服务提供者、网关服务:
访问:http://127.0.0.1:7887/ 可以看到,服务已经成功注册

在浏览器访问 http://127.0.0.1:7888/eureka-client-user-service/hello/HelloWord,返回如下:
此时说明网关转发内部服务成功!

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号