在之前的文章介绍了Spring Cloud Gateway的Predict(断言)、Filter(过滤器),大家对Spring Cloud Gateway有初步的认识,其中在对服务路由转发的这一块,在之前的文章是采用硬编码的方式进行路由转发。这篇文章以案例的形式来讲解Spring Cloud Gateway如何配合服务注册中心进行路由转发。

工程介绍

本案例中使用spring boot的版本为2.0.3.RELEASE,spring cloud版本为Finchley.RELEASE。在中涉及到了三个工程, 分别为注册中心eureka-server、服务提供者service-hi、 服务网关service-gateway,如下:

工程名

端口

作用

eureka-server

8761

注册中心eureka server

eureka-client

8762,8763

服务提供者 eureka client

api-gateway

9001

路由网关 eureka client

这三个工程中,其中eureka-client、service-gateway向注册中心eureka-server注册。用户的请求首先经过api-gateway,根据路径由gateway的predict 去断言进到哪一个 router, router经过各种过滤器处理后,最后路由到具体的业务服务,比如 eureka-client。如图:

gateway里调用其他微服务 gateway 服务发现_gateway里调用其他微服务

 

gateway工程详细介绍

在gateway工程中引入项目所需的依赖,包括eureka-client的起步依赖和gateway的起步依赖,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.chyer</groupId>
        <artifactId>chyer-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.chyer</groupId>
    <artifactId>api-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>api-gateway</name>
    <description>Demo project of gateway</description>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>

</project>

在工程的配置文件application.properties中 ,指定程序的启动端口为9001,注册地址、gateway的配置等信息,配置信息如下:

spring.application.name=api-gateway

#访问URL
# http://localhost:9001/
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

#为所有服务都进行转发操作,只需要在访问路径上指定要访问的服务即可
spring.cloud.gateway.discovery.locator.enabled=true
#服务ID大小写(true:小写)
spring.cloud.gateway.discovery.locator.lowerCaseServiceId=false

其中,spring.cloud.gateway.discovery.locator.enabled为true,表明gateway开启服务注册和发现的功能,并且spring cloud gateway自动根据服务发现为每一个服务创建了一个router,这个router将以服务名开头的请求路径转发到对应的服务。spring.cloud.gateway.discovery.locator.lowerCaseServiceId是将请求路径上的服务名配置为小写(因为服务注册的时候,向注册中心注册时将服务名转成大写的了),比如以/EUREKA-CLIENT/*的请求路径被路由转发到服务名为eurka-client的服务上。

在浏览器上请求输入http://localhost:9001/EUREKA-CLIENT/hi?name=chyer,网页获取以下的响应:

hi chyer ,i am from port:8762

hi chyer ,i am from port:8763

在上面的例子中,向api-gateway发送的请求时,url必须带上服务名EUREKA-CLIENT这个前缀,才能转发到eureka-client上,转发之前会将EUREKA-CLIENT去掉。