Java教程

2021-04-30

本文主要是介绍2021-04-30,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

云迹网关实现 Spring Cloud Gateway vs Netflix Zull


1. 网关与微服务

在单体应用时代,并没有网关这一概念。由于业务简单,为了方便统一部署测试,所有功能往往被集中在一个应用中。

随着业务发展,组员日益增多。按上述方式开发的软件,维护成本较高。再单体应用无法满足日益增长的需求之后,催生了微服务:拆分一体化的服务,各功能相互独立。

在微服务模式下,客户端需要记住若干微服务URL地址,较为不便。应对方案便是搭建一个统一出入口(也就是网关),解决微服务下调用、统一接入等问题。如下图:

          

在有了网关之后,各服务团队可以更加专注于自己的业务逻辑,而又网关来处理其余问题。

事实上,网关所负责的内容还包括:

  • 统一接入
  • 协议适配
  • 流量管理与容错
  • 安全防护

2.配置

  1. 统一路口:所有的数据接口统一管理和维护,保障了外部和内部的隔离,安全等。
  2. 路径校验:可以对请求的路径进行过滤,防止接口中的非法入侵。
  3. 动态路由:可以将请求分发给不同的服务器中。
ZULLSpring Cloud Gateway

<!-- 引入库 -->

<properties>
     <java.version>1.8</java.version>
     <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
 </properties>

<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>

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.hh</groupId>
            <artifactId>user-service-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-sleuth -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-sleuth-zipkin -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-zipkin</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-zuul -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <!-- actuator监控信息完善 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

<!-- 引入库 -->

<properties>

        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <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>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat.embed</groupId>
                    <artifactId>tomcat-embed-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <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>
 

#yml配置

server:
  port: 10086

spring:
  application:
    name: user-service-zuul


eureka:
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:7000/eureka,http://eureka01:7001/eureka,http://eureka02:7002/eureka

zuul:
  routes:
    zuul-path:
      path: /zuul-path/**
      serviceId: USER-SERVICE-PROVIDE
    zuul-ribbon-path:
      path: /zuul-ribbon-path/**
      serviceId: USER-SERVICE-CONSUME

#yml配置

server:
  port: 7070

spring:
  application:
    name: user-service-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: way
          uri: lb://user-service-provide
          #          uri: http://localhost:9002
          predicates:
            - Path=/** # 请求路径匹配所有的路径,和zuul网关的路径过滤不同(切记)
#            - Path=/findUserInfo      后面放接口路径,切记不能自定义路径然后进行匹配。和zuul不同,zuul可以自定义匹配
#            - Method=GET
eureka:
  client:
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:7000/eureka,http://eureka01:7001/eureka,http://eureka02:7002/eureka

要在主启动类上添加 @EnableZuulProxy 相关注解

http://localhos:10086/zuul-path/findUserInfo/1
切记请求的路径不同。很容易会出现问题。例:zuul-path请求的路径过滤下来,拼接到请求的路径后面,zuul-path后面才是真正的接口路径(和gateway不同)。

请求路径: http://localhos:10086/findUserInfo/1 请求的路径不能自定义添加,只能放接口中的路径,否则会路由失败。提示无法找到网页等。

表中代码节选自CSDN博主「凉忆-」的原创文章。链接:https://blog.csdn.net/weixin_45982841/article/details/113834358

3.对比

Spring Cloud Gateway 是 Spring Cloud 微服务平台的一个子项目,属于 Spring 开源社区,依赖名叫:spring-cloud-starter-gateway。https://spring.io/projects/spring-cloud-gateway

Zuul 是 Netflix 公司的开源项目,Spring Cloud 在 Netflix 项目中也已经集成了 Zuul,依赖名叫:spring-cloud-starter-netflix-zuul。https://github.com/Netflix/zuul

简单对比ZuulGateway
实现基于Servlet2.x构建,使用阻塞的API。基于Spring 5、Project Reactor、Spring Boot 2,使用非阻塞式的API

长连接

不支持支持
不适用场景

后端服务响应慢或者高并发场景下,

(因为线程数量有限,容易被耗尽,导致新请求被拒绝)

中小流量的项目

(使用Zuul1.x更合适)

限流

内置限流过滤器
上手难度同步编程,上手简单门槛较高,上手难度中等
Spring Cloud集成是*
Sentinel集成

 

 

 

 

 

 

 

 

 

 

*Spring Cloud集成特指是Zuul1.x,尽管Zull2.x已开发完成且相较Zuul1.x有较大改进,但出于种种原因并未被Spring Cloud集成,故暂且不加讨论

  • 高并发场景下两者对比*

配置同样的线程数(2000),同样的请求时间(5分钟),后端服务在不同的响应时间(休眠时间),对Zuul1/Gateway进行压力测试:

休眠时间测试样本(个)平均响应时间(ms)99%响应时间小于(ms)错误次数(个)错误比例
100ms294134 / 10593212026 / 5466136 / 1774104 / 00.04% / 0%
300ms101194 / 3999095595 / 148915056 / 16901114 / 01.10% / 0%
600ms51732 / 20126211768 / 297527217 / 32032476 / 04.79% / 0%
1000ms31896 / 12095619359 / 491446259 / 51153598 / 011.28% / 0%

 

 

 

 

 

 

Zuul网关的tomcat最大线程数为400,hystrix超时时间为100000。Gateway在高并发和后端服务响应慢的场景下比Zuul1的表现要好。

*并发较低的场景下,两种网关的表现差不多,表格略

 

4.结论

出于公司发展及机器人的服务体量考虑,Spring Cloud Gateway可能是更优秀的选择。

 

这篇关于2021-04-30的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!