本文主要是介绍2021-04-30,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
云迹网关实现 Spring Cloud Gateway vs Netflix Zull
1. 网关与微服务
在单体应用时代,并没有网关这一概念。由于业务简单,为了方便统一部署测试,所有功能往往被集中在一个应用中。
随着业务发展,组员日益增多。按上述方式开发的软件,维护成本较高。再单体应用无法满足日益增长的需求之后,催生了微服务:拆分一体化的服务,各功能相互独立。
在微服务模式下,客户端需要记住若干微服务URL地址,较为不便。应对方案便是搭建一个统一出入口(也就是网关),解决微服务下调用、统一接入等问题。如下图:
在有了网关之后,各服务团队可以更加专注于自己的业务逻辑,而又网关来处理其余问题。
事实上,网关所负责的内容还包括:
2.配置
- 统一路口:所有的数据接口统一管理和维护,保障了外部和内部的隔离,安全等。
- 路径校验:可以对请求的路径进行过滤,防止接口中的非法入侵。
- 动态路由:可以将请求分发给不同的服务器中。
ZULL | Spring 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
简单对比 | Zuul | Gateway |
实现 | 基于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) | 错误次数(个) | 错误比例 |
---|
100ms | 294134 / 1059321 | 2026 / 546 | 6136 / 1774 | 104 / 0 | 0.04% / 0% |
300ms | 101194 / 399909 | 5595 / 1489 | 15056 / 1690 | 1114 / 0 | 1.10% / 0% |
600ms | 51732 / 201262 | 11768 / 2975 | 27217 / 3203 | 2476 / 0 | 4.79% / 0% |
1000ms | 31896 / 120956 | 19359 / 4914 | 46259 / 5115 | 3598 / 0 | 11.28% / 0% |
Zuul网关的tomcat最大线程数为400,hystrix超时时间为100000。Gateway在高并发和后端服务响应慢的场景下比Zuul1的表现要好。
*并发较低的场景下,两种网关的表现差不多,表格略
4.结论
出于公司发展及机器人的服务体量考虑,Spring Cloud Gateway可能是更优秀的选择。
这篇关于2021-04-30的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!