ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-04-30

2021-04-30 18:34:12  阅读:172  来源: 互联网

标签:zuul 04 spring 30 springframework eureka 2021 org cloud


云迹网关实现 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可能是更优秀的选择。

 

标签:zuul,04,spring,30,springframework,eureka,2021,org,cloud
来源: https://blog.csdn.net/patraixstar/article/details/116306400

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有