开发者社区> javaedge> 正文

全面进入云原生时代,拥抱Kubernetes,再见了Spring Cloud

简介: 相信很多开发者在熟悉微服务工作后,才发现: 以为用 Spring Cloud 已经成功打造了微服务架构帝国,殊不知引入了 k8s 后,却和云原生的生态发展脱轨
+关注继续查看
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅998元/3年,立即抢购>>>:9i0i.cn/aliyun

福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

相信很多开发者在熟悉微服务工作后,才发现:
以为用 Spring Cloud 已经成功打造了微服务架构帝国,殊不知引入了 k8s 后,却和 Cloud Native 的生态发展脱轨。

从 2013 年的 Spring Boot

2012年10月,Mike Youngstrom在Spring jira中创建了一个功能需求,要求在Spring框架中支持无容器Web应用程序体系结构。他建议通过main方法引导的Spring容器内配置Web容器服务。这一需求促成了2013年初开始的Spring Boot项目的开发。2014年4月,Spring Boot 1.0.0发布。从那以后,一些Spring Boot小版本开始出现。
  • Spring Boot 1.1(2014年6月):改进的模板支持,gemfire支持,elasticsearch和apache solr的自动配置
  • Spring boot 1.2(2015年3月):升级到servlet 3.1/tomcat 8/jetty 9和spring 4.1,支持banner/jms /SpringBoot Application注释
  • Spring boot 1.3(2016年12月):升级到spring4.2,新的spring-boot-devtools,缓存技术的自动配置(ehcache,hazelcast,redis,guava和infinispan)以及完全可执行的jar支持
  • Spring boot 1.4(2017年1月):升级到spring 4.3,couchbase/neo4j支持,启动失败分析和RestTemplateBuilder
  • Spring boot 1.5(2017年2月):支持kafka /ldap,第三方库升级,放弃对CRaSH支持和执行器日志终端用以动态修改应用程序日志级别
  • Spring boot的简便性使java开发人员能够快速大规模地应用于项目。 Spring boot可以说是Java中开发基于RESTful微服务Web应用的最快方法之一。它也非常适合docker容器部署和快速原型设计
  • Spring Boot 2.0.0,于2018年3月1日发布,新版本特点有:

基于 Java 8,支持 Java 9;支持 Quartz 调度程序;支持嵌入式 Netty,Tomcat, Undertow 和 Jetty 均已支持 HTTP/2;执行器架构重构,支持 Spring MVC, WebFlux 和 Jersey;对响应式编程提供最大支持;引入对 Kotlin 1.2.x 的支持,并提供了一个 runApplication 函数,用Kotlin 通用的方式启动 Spring Boot 应用程序。

一直到 Spring Cloud,第一批选型它的大公司很早就构建出了完整微服务生态,很多解決方案开放源码,很多坑点已被踩完相当稳定。
对于很多想要使用微服务架构的中小公司,绝对是最佳进场时机,直接使用 Spring Cloud 全家桶,绝对是稳定而正确的选择。

但当引入了 k8s 后,仿佛就变天了。

k8s 和 Spring Cloud 的激烈冲突

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

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

Spring Cloud 官方提供的解决方案

  • 为解决该问题,官方在 Github 上提供了开源方案,说明如何以 Spring Cloud 整合 Kubernetes 生态下的元件,主要讨论从原本组件架构过度并一直到 Kubernetes 原生环境后的处理方法

https://github.com/spring-cloud/spring-cloud-kubernetes

该解決方案重点如下:

服务发现 (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 原生环境的实现,但相关链接已消失,应该是放弃了。
所以推荐避免使用客户端的负载均衡和熔断器。

Spring Cloud V.S k8s 重叠方案

我们当然也能完全不理會 k8s 原生组件,完全采用 Spring Boot 和 Spring Cloud 的解決方案,只把 k8s 当做部署应用的工具和平台。但显然在未來,Service Mesh 及其通用的 Cloud Native 技术发展,就会和Spring Cloud脱轨,无法再和我们的应用深度整合。

相比于 Spring Cloud 生态都只能使用 Java , k8s 生态的发展和设计更为通用且广泛,一些 Spring Cloud 內的元件功能,在 Kubernetes 除了包含支援以外,甚至有更多的整合和考量及延伸的功能。
由于 CNCF 的推波助澜及更多国际大厂投入,新工具、运维方法、整合能力层出不穷。因此,在选型微服务架构时,k8s 的各种原生解決方案,都需要被放入评估考量中。
目前网络上很多 Spring Boot 和 Spring Cloud 的很多已经过时,而且都没整合 k8s,与当下主流的基础设施环境有落差,学习时都要自己斟酌考量。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云数字新基建系列:云原生操作系统Kubernetes-第1章(4)
阿里云数字新基建系列包括5本书,题材涉及Kubernetes、混合云架构、云数据库、CDN原理与流媒体技术、云服务器运维(Windows),囊括了领先的云技术知识与阿里云技术团队独到的实践经验,是国内IT技术图书中又一套重磅作品! 本书是阿里云容器服务产品线上实践的技术沉淀,主要包括理论篇和实践篇两部分内容。理论篇注重理论介绍,核心是Kubernetes on Cloud,即着重介绍Kubernetes和阿里云产品的结合。实践篇是疑难问题的诊断案例,希望通过案例来和读者分享Kubernetes深度问题诊断......
33 0
【活动回顾】Edge X Kubernetes,探索云原生新边界
2021 年 6 月 26 日, 由阿里云、VMware、Intel 联合主办的 “Edge X Kubernetes”主题活动在杭州举办,本次活动以 OpenYurt 社区和 EdgeX Foundry 社区协同推动的“云原生边缘计算技术”为核心,12 位来自不同行业和场景的贡献者,和两个开源项目的核心成员一起,共同探讨云原生在边缘的实践与应用。
6059 0
云原生容器实战(三)-Kubernetes工作负载资源PodReplicaSet
云原生容器实战(三)-Kubernetes工作负载资源PodReplicaSet
21 0
【玩转云原生】第四章:学习kubernetes需要掌握的基础知识
Kubernetes是一个非常流行的开源容器编排平台,可以用来自动化部署、扩展和管理容器化的工作负载。在本章中,我们将发现Kubernetes集群的基本架构及其组件。要学习更多的Kubernetes基础知识,
13 0
云原生容器实战(二)-Kubernetes调度单位Pod
云原生容器实战(二)-Kubernetes调度单位Pod
31 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
7618 0
【直播预告】「EDGE X Kubernetes · 云原生在边缘的实践与应用」
6 月 26 日(本周六)下午 13:00-18:00 ,由阿里云联合 VMware、Intel 举办的「KubeMeet|EDGE X Kubernetes」专场沙龙将在杭州举办,12 位来自不同行业和应用场景的社区贡献者将和 OpenYurt、EdgeX-Foundry 社区核心成员,共同分享云原生在边缘的实践与应用。
3242 0
阿里云 OpenYurt 成为 CNCF 沙箱项目,加速原生 Kubernetes 边缘场景全覆盖
2020 年 9 月 9 号,经 CNCF 技术监督委员会投票一致同意,阿里巴巴云原生边缘计算平台 OpenYurt 正式成为 CNCF 沙箱级别项目(Sandbox Level Project),标志着 OpenYurt 在边缘计算场景中构建云原生基础设施的能力受到了行业的广泛认可。
835 0
云原生容器实战(四)-Kubernetes工作负载资源之Deployment
云原生容器实战(四)-Kubernetes工作负载资源之Deployment
37 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13666 0
+关注
javaedge
关注公众号:JavaEdge,后台回复面试,领取更多大厂求职资源。曾在百度、携程、华为等大厂搬砖,专注Java生态各种中间件原理、框架源码、微服务、中台等架构设计及落地实战,只生产硬核干货!
2303
文章
1
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载


http://www.vxiaotou.com