基于Kubernetes的微服务架构

基于Kubernetes的微服务架构

当项目转向基于 Spring Cloud 的微服务架构时,确实在很多方面带来了显著的改进,如易于扩展(横向扩容和缩容)、独立部署、更好的运维和管理支持等,从而能够更好地满足复杂的业务需求。然而,这种架构转变同时也带来了一系列的挑战:

学习曲线陡峭:对于团队成员来说,微服务架构引入了许多新的技术和概念,如配置中心(Config),服务发现(Eureka),API网关(Zuul),断路器(Hystrix),负载均衡(Ribbon,Feign)等。对于新手来说,这些内容需要相当的时间来学习和掌握。

代码容量增加:从产品的角度来看,Spring Cloud 的各种技术套件成为了产品编译后代码的大部分,这可能导致了更大的资源占用和可能的性能开销。

基于应用层面解决分布式问题:在微服务架构中,选择在应用层面而不是基础设施层面解决分布式问题,这主要是因为传统的硬件基础设施无法提供足够的灵活性来支持快速变化的软件服务需求。

然而,Kubernetes 的出现为微服务架构提供了一个新的基础设施层面的解决方案。Kubernetes 作为一个容器编排管理系统,统一了容器管理的方式,使得部署、扩展和管理容器化应用变得更加简单和高效。这为微服务架构带来了以下两个主要的升级目标:

目标一:尽可能缩减非业务功能代码的比例


通过采用Kubernetes,项目成功地将许多纯技术性的组件和功能(如配置中心、服务注册中心、网关等)转移到了基础设施层面,利用Kubernetes平台的服务发现、配置管理、负载均衡等内建特性来实现。这种做法有几个明显的好处:

降低复杂度:将这些非业务逻辑功能移出代码库,简化了每个微服务项目的结构,使得开发团队能够更加专注于业务逻辑的实现。

提高灵活性:通过声明性的资源描述文件(如YAML文件),可以更灵活地管理和部署这些基础设施服务,同时也便于版本控制和持续集成/持续部署(CI/CD)流程的实现。

增强可维护性:减少了项目中非业务逻辑代码的比例,有助于提高代码的可读性和可维护性,降低长期维护成本。

目标二:尽可能在不影响原有代码的前提下完成迁移


利用Spring Framework 4引入的Conditional Bean等声明式特性,以及声明式编程的理念,Fenix’s Bookstore项目的升级过程几乎不需要修改任何现有的Java代码。这种方式的优势包括:

无缝迁移:项目可以平滑过渡到新的架构上,而无需进行大规模的重写或重构,极大地降低了迁移风险和成本。

声明式编程:通过声明式编程,开发者可以从更高的抽象层次描述他们的编程意图,这样做不仅减少了与底层技术实现的耦合,也使得在未来需要更换技术栈或者组件时变得更加容易和灵活。

技术透明性:虽然在Kubernetes实现版本中,移除了如Eureka、Ribbon、Config等组件的依赖,但是从功能角度看,这些被基础设施层的服务所替代,保证了原有业务逻辑不受影响,实现了技术细节的透明化。

基于Kubernetes的微服务架构

技术组件

环境感知

当使用Spring Cloud Kubernetes集成Kubernetes环境时,确实可能会遇到库版本不匹配的问题,尤其是当Kubernetes环境升级到新版本,而依赖的客户端库(如Fabric8 Kubernetes Client)未同步更新时。这种情况下,旧版本的客户端库可能无法兼容新版本的Kubernetes API,从而导致一些功能不可用或者出现错误。

配置中心

采用Kubernetes的ConfigMap来管理配置,并通过Spring Cloud Kubernetes Config自动将ConfigMap的内容注入到Spring配置文件中,是一种高效管理微服务配置的方法。

服务发现

采用 Kubernetes 的 Service 来管理,通过Spring Cloud Kubernetes Discovery自动将 HTTP 访问中的服务转换为FQDN。

负载均衡

Kubernetes Service是一种定义一组pod访问规则的抽象方式,它支持几种类型,包括ClusterIP、NodePort、LoadBalancer等。当应用通过服务名访问某个服务时,Kubernetes内部的DNS服务会解析这个服务名到一个虚拟的IP地址,这个IP地址背后实际上对应着一组Pod实例。Kubernetes通过轮询等策略实现负载均衡,将请求分发到不同的Pod实例上。

随着Spring Cloud Kubernetes项目的发展,对于旧版负载均衡工具Ribbon的支持被移除,表明了Spring Cloud生态系统正在适应Kubernetes平台的能力,减少了对第三方客户端负载均衡工具的依赖。虽然Spring Cloud Kubernetes 1.1.2版本暂时没有提供对Spring Cloud LoadBalancer的适配,但这并不影响利用Kubernetes Service实现负载均衡的能力。

服务网关

保留了Zuul作为网关,而没有选用Kubernetes的Ingress,主要出于两个方面的考量。首先,尽管Ingress Controller提供了丰富的选择(包括KONG、Nginx、Haproxy等),它并不是Kubernetes内置的组件,而是需要单独安装的。这意味着,为了保持演示项目的环境尽可能简单,避免了Ingress的使用。其次,前端资源是托管在网关服务内的,去除Zuul并不会减少项目中的服务数量,因此移除Zuul的需求并不强烈。

服务熔断

这里仍然采用 Hystrix,Kubernetes 本身无法做到精细化的服务治理,包括熔断、流控、监视,等等,我们将在基于 Istio 的服务网格架构中解决这个问题。

认证授权

保留了 Spring Security OAuth 2.0 主要是因为 Kubernetes 的 RBAC 机制虽能处理服务间的访问控制,但 Spring Security OAuth 2.0 涵盖了更广泛的认证和授权需求,尤其是对终端用户的。这部分功能既涉及技术层面也关联到业务需求,因此是不可或缺的。简而言之,虽然 Kubernetes 提供了强大的后端服务访问控制能力,但面向前端用户的认证与授权,仍然依赖于 Spring Security OAuth 2.0 来实现,以确保应用的安全性及用户权限的精确管理。

原文始发于微信公众号(二进制跳动):基于Kubernetes的微服务架构

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/246404.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!