Springboot 整合 SpringCloud组件-Gateway 网关服务 (四)

绝地灬酷狼 2021-12-14 17:07 629阅读 0赞

这篇我将介绍的是网关服务,那么从标题已经知道我们整合的组件时gateway;

也许有人说,为啥不用zuul,这个组件也可以用于做网关。 至于这两组件的性能比较与区别,我们来看一个表格简单了解下:

Gateway与Zuul





























  gateway zuul
基本介绍 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链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
 
Zuul1 是基于 Servlet 框架构建,如图所示,采用的是阻塞和多线程方式,即一个线程处理一次连接请求,这种方式在内部延迟严重、设备故障较多情况下会引起存活的连接增多和线程增加的情况发生。
性能 WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。使用非阻塞API。 Websockets得到支持,并且由于它与Spring紧密集成,所以将会是一个更好的 开发 体验。  本文的Zuul,指的是Zuul 1.x,是一个基于阻塞io的API Gateway。Zuul已经发布了Zuul 2.x,基于Netty,也是非阻塞的,支持长连接,但Spring Cloud暂时还没有整合计划。
源码维护组织 spring-cloud-Gateway是spring旗下spring-cloud的一个子项目。还有一种说法是因为zuul2连续跳票和zuul1的性能表现不是很理想,所以催生了spring孵化Gateway项目。 zuul则是netflix公司的项目,只是spring将zuul集成在spring-cloud中使用而已。关键目前spring不打算集成zuul2.x。
版本 springboot2.0 springboot1.x

接下来我们开始整合gateway,实现该组件的基础使用:

创建一个springboot项目,起名 gateway:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70

(同样,我们这里选用的springcloud版本是:Finchley.RELEASE)

pom.xml里核心的依赖包为:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.springframework.cloud</groupId>
  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  8. <version>2.0.0.RELEASE</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-starter-gateway</artifactId>
  13. <version>2.0.0.RELEASE</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-test</artifactId>
  18. <scope>test</scope>
  19. </dependency>

实现基础功能使用,我们可以直接在application.yml进行配置:

  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: test-gateway-service
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: false
  11. #开启小写验证,默认feign根据服务名查找都是用的全大写
  12. lowerCaseServiceId: true
  13. routes:
  14. - id: client-test
  15. uri: lb://CLIENT-TEST
  16. predicates:
  17. - Path=/testclient/**
  18. filters:
  19. - StripPrefix=1
  20. - id: service-feign
  21. uri: lb://FEIGN
  22. predicates:
  23. - Path=/service-feign/**
  24. filters:
  25. - StripPrefix=1
  26. eureka:
  27. instance:
  28. preferIpAddress: true
  29. instance-id: ${spring.cloud.client.ip-address}:${server.port}
  30. client:
  31. service-url:
  32. defaultZone: http://localhost:8761/eureka/

启动类也同样加上 @EnableEurekaClient。

可以看到我们简单配置了2个路由:

路由id为client-test的,

只要是访问路径带有 /testclient的, 都会根据从Eureka注册中心获取的服务信息去寻找储服务名为CLIENT-TEST的服务实例,进行接口转发调用。

路由id为service-feign的,

同理,只要是访问路径带有 /service-feign的, 都会根据从Eureka注册中心获取的服务信息去寻找储服务名为FEIGN的服务实例,进行接口转发调用。

那么我们先把网关gateway服务跑起来,逐一调用接口看看:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 1

访问:http://localhost:8081/testclient/haveatry?name=JCccc

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 2

访问: http://localhost:8081/service-feign/feignTest?name=TestMessage

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1Mzg3OTQw_size_16_color_FFFFFF_t_70 3

可以看到通过网关访问,路由转发都是OK的。

发表评论

表情:
评论列表 (有 0 条评论,629人围观)

还没有评论,来说两句吧...

相关阅读