天天看点

SpringCloud进阶-整合Spring Cloud Gateway网关入门实操

作者:架构师面试宝典
SpringCloud进阶-整合Spring Cloud Gateway网关入门实操

Spring Cloud Gateway 是Spring 基于Spring5.0、SpringBoot2.0和Project Reactor等技术开发的微服务网关服务。是为Spring Cloud 微服务提供简单高效的API路由管理方式。作为Spring Cloud微服务生态系统中的网关服务,目标就是为了能替代Netflix的Zuul网关的存在,在提供了路由网关的基础上,通弄过Filter的方式提供了一些其他的功能例如:接口安全、服务监控、服务埋点、服务限流等功能。

下面我们就来通过一个简单的例子来看一下Spring Cloud Gateway的工作原理。

创建项目

第一步、我们来创建一个Spring Cloud Gateway的Maven项目,并且引入Spring Cloud Gateway相关的依赖。如下所示。

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>           

第二步、只需要设置一个主启动类即可

@SpringBootApplication
public class GatewayApplication {
	public static void main(String[] args) {
		SpringApplication.run(GatewayApplication.class, args);
	}
}
           

到这里,也许会有人问是不是这个项目这样搭建得有点太简单了,我们如何来实现路由的转发呢?下面我们就来看看如何实现路由转发操作

路由转发示例

我们可以在配置文件中添加如下的配置来实现路由转发功能。

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/test           

添加完这个配置之后,我们如果我们访问了http://localhost:8080/test这个时候,我们的路由就会被转发到百度的首页上去了,如果要访问多级的Path路径,只需要在对应的配置路径下加上 * 就可以了。例如

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: http://www.baidu.com
        predicates:
        - Path=/test/**	           

这样一来,上面的配置就可以支持多级Path的访问例如我们可以通过http://localhost:8080/test/iamge,http://localhost:8080/test/fanyi等等路径进行访问。

这里我们看到,在我们配置调用的过程中所有的访问都是在http://www.baidu.com上进行访问的,但是在实际的微服务场景中,我们的后端需要访问的服务有很多的微服务组成,而这些微服务都被我们统一管理在Eureka注册中心,那么我们如何才能调用注册中心中的服务呢?

整合Eureka路由

需要整合Eureka首先需要将这个网关作为一个服务注册到Eureka注册中心。所以需要在POM文件中添加Eureka客户端相关的依赖,如下。

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

添加完对应的依赖之后我们就可以对配置文件进行修改了。

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**           

我们可以通过在Eureka中配置的服务名称来进行调用,这种调用方式在之前的例子中我们也有使用到。在uri中是以lb://开头,表示这里可能还会用到负载均衡相关的内容,这个在后续的文章中我们也会提到。

在Zuul 中会对所有的服务都进行转发,在调用的时候只需要指定需要访问的服务就可以完成调用。通过这个方式就不需要再为每个服务都配置转发的规则了,当需要添加新的服务上去的时候也不需要配置路由规则以及重启网关等操作。

既然Spring Cloud Gateway是旨在替代Zuul,那么就一定也会有同样的支持。那么我们如何来实现整合Eureka的默认路由操作呢?

整合Eureka的默认路由

要开启Spring Cloud Gateway的默认路由操作需要进行如下的配置设置,这里我们进行了两个配置的修改,第一是支持默认路由的配置、第二则是开启大小写服务。

server:
  port: 8080
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/user-service/**           

大小写服务对服务的调用影响还是蛮大的,如果从Zuul改造到使用了Spring Cloud Gateway之后服务地址也会有很多的变化而大小写服务则是提供了开发者一个默认的服务配置支持操作。完成配置之后,我们就可以通过小写配置来进行访问。

这里需要注意的是开启了大小写服务之后 ,就只能用小写服务名进行调用,而不能再使用大写服务名进行调用。

总结

通过上面的例子,我们简单的理解了Spring Cloud Gateway的使用,并且也了解Spring Cloud Gateway如何整合Eureka进行服务的调用配置,在后续的文章中还会对Gateway进行深入的介绍,期待大家的关注与支持。