资料

Kubernetes 还是 SpringCloud?

2020-12-28  本文已影响0人  码道功臣

前些年,随着微服务的概念提出以及落地,不断有很多的公司都加入到了这场技术革新中,现在可谓是人人都在做和说微服务。
提到微服务,Java栈内,就不得不提SpringBoot、SpringCloud、Dubbo。
近几年,随着Cloud Native技术的普及,又涌现出了一大批新技术,Docker、Kubernetes、Istio、Service Mesh,这些新技术的加入,又对微服务有了更深层次的定位。
那么,我们该如何去定位这些技术在我们实际工作中的应用呢?如果你参与到了技术选型中,就不得不把这些弄清晰,否则将毒害整个团队。

首先让我们了解下SpringBoot和SpringCloud的发展(下列内容摘自网络)

2012年10月,Mike Youngstrom在Spring jira中创建了一个功能需求,要求在Spring框架中支持无容器Web应用程序体系结构。他建议通过main方法引导的Spring容器内配置Web容器服务。这一需求促成了2013年初开始的Spring Boot项目的开发。2014年4月,Spring Boot 1.0.0发布。从那以后,一些Spring Boot小版本开始出现。

随着2015年3月SpringCloud的第一个版本Angel发布,微服务的全部落地,正式拉开序幕。
SpringCloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。我们可以看出,Spring Cloud 是一套微服务框架。

我们再来了解下Kubernetes与SpringCloud的对比

想要更多的了解SpringCloud可以参考我的另几份文章
微服务 一:微服务架构概述
微服务 二:微服务开发框架SpringCloud
微服务 三:服务注册与发现
微服务 四:客户端负载均衡器
微服务 五:断路器
微服务 六:服务网关
微服务 七:配置管理
微服务 八:服务跟踪
微服务 九:持续交付

Kubernates概述
下一代微服务技术-服务网格-Istio

SpringCloud与Kubernetes的功能重叠 SpringCloud与Kubernetes的层次重叠

Kubernetes和Spring Cloud的激烈冲突

Java 生态的 Spring Cloud 可谓是迄今最完整的微服务框架,基本满足所有微服务架构需求,网上的教程也不胜枚举。
但也因为 Spring Cloud 生态过于完整,如今 k8s 大行其道,当我们把原来基于 Spring Cloud 开发的服务放到 k8s 后, 一些机制自成一格,不受 k8s 生态的工具和机制管控。

因为从扩展部署、运维角度出发的 k8s,在最原始容器、应用程序部署及网络层管理的基础上,已逐步实现並贴近应用层的需要,一些微服务架构下的基础需求(如:Service Discovery、API Gateway 等)开始直接或间接被纳入 k8s 生态。
导致双方有很多组件功能重复,且只能择一而终, 一旦你选了 Spring Cloud 的解決方案,就得放弃 k8s 那边的机制。

服务发现 (Service Discovery)

Spring Cloud 的经典解决方案:Netflix Eureka、Alibaba Nacos、Hashicorp。主要原理都是在服务部署时,去注册自己的服务,让其他服务可检索到自己。

spring.cloud.service-registry.auto-registration.enabled
@EnableDiscoveryClient(autoRegister=false)

但在 k8s ,服务的注册和查询由 Service 元件负责,其连线名称,是利用內部 DNS 实现。这代表我们要将服务发现功能,接上 k8s 的 Service 机制。
为达成目的,方案中提供了 DiscoveryClient 组件,让基于 Spring Cloud 所开发的程序可方便查询其他服务。
使用了 Kubernetes 原生的服务发现,才能被 Istio 追踪,未來才能纳入 Service Mesh 的管控。

配置管理 (Configuration Management)

Spring Cloud 的解决方案:spring-cloud-config。但在 Kubernetes 上,有 ConfigMap 和 Secret 可使用,而且通常还会搭配 Vault 管理敏感配置。

而该方案提供了 ConfigMapPropertySource 和 SecretsPropertySource,来存取 Kubernetes 上的 ConfigMap 和 Secret。

负载均衡和熔断器 (Load Balancing & Circuit Breaker)

Spring Cloud原有方案:Netflix Ribbon 和 Hystrix,但在 k8s 有 Service 实现负载均衡,以及 Istio 可实现熔断器,开发者只需专注 crud。
由于负载均衡和熔断器會依赖服务发现机制,因此 Ribbon 和 Hytrix 原先的功能在 k8s 原生环境下失效。
该解决方案內虽然有提到一些关于 Ribbon 整合 Kubernetes 原生环境的实现,但相关链接已消失,应该是放弃了。
所以推荐避免使用客户端的负载均衡和熔断器。

最后

上一篇 下一篇

猜你喜欢

热点阅读