Spring Cloud + Kubernetes 微服务框架原理和实践

早在半年前,公司开始推行容器化部署方案 AppOS,虽然发布界面过于极客,十分晦涩,不过仔细研究起来真的觉得十分强大,容器化推行后,计算资源(CPU、内存)的利用率可以极大提高,降低服务器数量,从而节约技术成本。

恰巧,若干个朋友所在创业公司最近也在尝试做微服务、容器化。架构上摒弃 SOA 的 dubbo,加入Spring Cloud阵营;部署方案上从过去的云服务器直接部署,升级到基于Kubernetes集群的容器化部署。

Spring Cloud

微服务这个概念从开发者的视角理解和SOA的差异不大,按照业务领域细粒度的拆分系统为若干服务,服务仅访问对应的数据库,按照项目组,服务独立开发,部署和迭代。服务之间的调用,通过RPC完成。

用几张图,直观、简明扼要的阐述一下在Spring Cloud中相关的概念~

上图中,展示了一个简单的系统,该系统有几个组件。

  1. 服务提供方,Demo Service,从开发者的视角看,它是一个独立的项目(或者是子项目),它只提供接口声明给外部,它运行起来是一个独立的进程,好像一个 Web Server一样,在此等候远端的调用。图中画了三个一摸一样的用来描述它的部署情况,三个服务进程分别位于三台主机上,高可用(一个挂了,不影响所有),可伸缩(可以增加到十台),它访问自己对应的数据库。
  2. 服务消费方,Demo Consumer,为了简化只画了一个实例,和服务提供方一样,它也可以高可用,可伸缩。因为服务提供方和消费方,部署在不同的主机上,所以他们之间的调用使用RPC(远程服务调用)
  3. 注册中心,Eureka-Server,既然有服务提供者和服务消费者,而他们都是运行在不同主机上,那如何让服务消费者发现,并按照相应的协议调用服务提供者呢,这就引入了注册中心的概念。如果读者有dubbo使用经验,很容易想到 zookeeper 集群对吧,他们提供的功能是类似的。
    当然它的部署也是支持高可用的(多个实例注册组成集群),三个核心组件已经浮出水面了,
  4. 路由,Zuul,在图的最上侧。也是整体架构开发在外网的入口。通过 url 规则配置,可以把请求转发到合适的服务,例如请求 GET api.dummy.com/demo_consumer/user/1 通过Zuul,可以把请求转发到 demo-consumer:GET /user/1。当然Zuul还可以支持更多,包括通用的鉴权,过滤器等。

核心组件中涉及到服务消费方和服务提供方是通过RPC调用实现的,通过注册中心,服务消费方发现服务提供方,顺其自然就引入了客户端负载均衡和熔断相关的概念。消费方手持若干个提供方的实例,最简单的方式就是轮流调用,这就是客户端负载均衡了;如果一个服务提供方在过去一段时间内,故障比例达到阈值,那么可以暂时设置它为不可用,这就是熔断了。在Spring Cloud里提供了相关的内置组件,Ribbon和Hystrix。

当然一切都不绝对,Spring Cloud的一个优势就是社区里有很多兼容性良好的备选方案,在 musical.ly 的Spring Cloud架构实践中提到:团队对框架本身做了较多的改造,替换了更友好的注册中心 Consul,采用了 gRPC 作为远程调用框架,用 Protobuf 作为序列化框架,替换了熔断和限流方案,集成了故障诊断和追踪功能等等,这些改造对业务是透明的。

微服务的部署

采用Spring Cloud后,不同业务可以拆分成不同的项目,都可以单独部署。可以使用Jenkins搭建一套简单的持续集成和持续交付方案。开发人员推代码到Git仓库后,会触发Jenkins的构建动作,进一步的还可以用Jenkins执行不同环境下的发布脚本,当然脚本还可以执行备份,以及回滚的动作。

执行到这里,该体系方案就可以支持一个公司走很远了,那Kubernetes又有什么勇武之地。

假设公司进一步发展,流量和业务都极具增多,会出现两个比较常见的问题

  1. 扩容动作依然有些麻烦,可以通过预先准备好的操作系统镜像(包括各种线上运行环境),把新的实例快速准备好,但是依然需要更新发布脚本。当然如果有强大的运维团队,是可以做到几乎自动化的。
  2. 大量的资源浪费,因为有很多服务,访问量很小,大量的机器可能CPU使用率不足5%这样的case时有发生(来自腾讯的同事分享说,他们的优化目标是CPU利用率平均30%),造成技术成本巨高不下。

理想的状况下,如果把运维手里的机器,都通过一个入口、统一管理起来,统一掌握集群的资源使用,需要对集群扩容或缩容的情况,只要增加或者回收服务器;需要对某个服务扩容缩容,只要简单的设置一下 replicas 数量。那该多好。(当然Kubernetes远远比这个功能多的多)

Kubernetes(K8S)

如果有过Docker的使用经验,就很容易理解K8S,最初使用docker的用途可能仅仅是用它搭建CI/CD,一条命令启动Gitlab,再一条命令启动一个Jenkins,一切超级简单。很多教程里,都会把若干微服务,放在一台服务器中的docker里运行,你会发现服务注册,服务发现都很简单。

但是,当容器运行在不同的服务器上的时候,问题就来了,你甚至发现跨主机都容器之间都不能通信。

K8S来源于谷歌,高富帅的出身,决定了刚出道就自带各种光环。市场占有率已经超过70%,已经成为了容器管理的主流工具。在实践中,因为大量的资料实践的背景都是GPE上的K8S集群,网络、存储等基础设施都由平台提供,一切都觉得好简单,但是一旦尝试自建私有的K8S集群,却发现世界却充满敌意,甚至基本的网络插件都需要自己安装。

谷歌虽好,并且提供 $300 的代金券和一年试用期很厚道,但是谷歌不是你想访问就可以访问。幸好阿里云也提供了Kubernetes集群服务,虽然价格比买ECS贵,不过相比一个运维团队的开销和各种不断踩坑感觉也是划算的。

本文先介绍一些基础概念,然后介绍如果在阿里云的K8S集群上,部署Spring Cloud的微服务的实践。

集群

集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台。下图展示这样的集群。注意该图为了强调核心概念有所简化。这里可以看到一个典型的Kubernetes架构图。

Pod

K8S中最基础的调度单位是Pod,它有网络,有存储。Pod里面运行着一个或者若干个docker容器。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。可以理解成Pod就是一台主机,docker容器是运行在主机上的进程。

Replication Controller

我们一般不会手动自己创建Pod,这样很难管理。利用Replication Controller,可以定义Pod运行内容,副本的个数等信息,它的升级版本是 ReplicaSet。现在已经创建了Pod的一些副本,那么在这些副本上如何均衡负载呢?我们需要的是Service。

Service

可以把一组Pod组成服务 Service,Service有一个虚拟的ClusterIP,服务访问可以通过ClusterIP作为统一请求入口,因为一个 Service 对应一组Pod,所以可以做到负载均衡。服务可以通过 NodePort,LoadBalancer的方式暴露对外服务。注意 type = LoadBalancer需要云服务平台提供基础的服务,自建的K8S集群默认是没有这个东西的。如果在阿里云上定义服务 type = LoadBalancer 后,你会发现,在管理后台的负载均衡页面,会增加一个负载均衡器

kubectl get service 执行结果,注意External-IP

自动创建负载均衡器对外提供统一入口,backend对应容器Pod

实践

为了降低成本,笔者从阿里云采购了最低配置的K8S集群,包含 3个Master节点,还有2个Node节点。基本都是最低配置,每天成本30块钱。预先准备好了一份手脚架代码,包括几个基本项目

  • demo-service 服务提供方
  • demo-provider 服务消费方
  • eureka-server 注册中心
  • api-gateway 网关

需要首先部署注册中心 eureka-server, 然后部署服务提供方 demo-service 和 消费方demo-provider,最后部署 api-gateway。

那么手里是代码,对面是K8S集群,怎么部署上去呢,答案是 镜像服务。
阿里的镜像服务是一个选择,当然也可以选择其它的,可以通过CI/CD方案,自动把构建后的镜像,Tag后,推到镜像服务提供的Registry中,然后就可以使用了。

例如在镜像仓库中,有如下镜像:http://registry.cn-beijing.aliyuncs.com/tianming/demo-service:latest,通过书写YAML文件,定义RC

apiVersion: v1
kind: ReplicationController
metadata:
 name: demo-service
spec:
 replicas: 2
 selector:
  app: demo-service
 template:
  metadata:
   labels:
    app: demo-service
  spec:
   containers:
    - name: demo-service
      image: registry.cn-beijing.aliyuncs.com/tianming/demo-service:latest
      ports:
      - containerPort: 8081

黑色字体部分,将要发布服务的镜像了,这里设置了副本数是 2,通过执行下面的bash命令就可以创建 RC了

kubectl create -f demo-service-rc.yaml

然后可以执行

kubectl get pods

查看容器是否被正确创建,如果pod有状态异常,例如 Error 等可以通过describe命令查看创建失败的原因,这个命令很有用,可以帮我们搞定很多问题。

kubectl describe pod demo-service-xxx

当然这还不够,我们还需要定义服务,以及服务暴露的接口:

apiVersion: v1
kind: Service
metadata:
 name: demo-service
spec:
 type: LoadBalancer
 ports:
  - port: 8081
 selector:
  app: demo-service

这样服务就建立好,因为设置了 LoadBalancer,所以可以通过 external ip 在外部网络访问到。在 Prod 环境中,我们不会这样做,一般只有 api-gateway 项目才会对外暴露访问端口。

按照这样的方式,依次部署其它服务,如果有一套可行的 CI/CD 方案,那么后续的发布,扩容缩容,都将易如反掌。

碎碎念

如果你是一个初创公司的CTO,没什么人手搭建集群,自己也没有精力学习K8S。在架构选型上,可以只用Spring Cloud的微服务组件,然后在云主机上部署;如果你有能力学习K8S,但是没有精力和人力搭建自建K8S集群,可以购买云厂商的集群服务,有了这套东西,至少再也不用担心未来扩容的痛苦了,并且作为架构的发展的相对终极形态,短期内也不会有重构的需求,等未来有人力财力,再迁回自建的K8S集群,也是易如反掌。

总体来讲,文章还是有些浅了,实践中的坑和优化的选项,还是要远远大于此文的。

转至:https://zhuanlan.zhihu.com/p/31670782

微服务是什么?微服务是用于构建应用程序的架构风格,一个大的系统可由一个或者多个微服务组成,微服务架构可将应用拆分成多个核心功能,每个功能都被称为一项服务,可以单独构建和部署,这意味着各项服务在工作和出现故障的时候不会相互影响。为什么要用微服务?单体架构下的所有代码模块都耦合在一起,代码量大,维护困难,想要更新一个模块的代码,也可能会影响其他模块,不能很好的定制化代码。微服务中可以有java编写、有Python编写的,他们都是靠restful架构风格统一成一个系统的,所以微服务本身与具体技术无关、扩展性强。大型电商平台微服务功能图为什么要将SpringCloud项目部署到k8s平台?SpringCloud只能用在SpringBoot的java环境中,而kubernetes可以适用于任何开发语言,只要能被放进docker的应用,都可以在kubernetes上运行,而且更轻量,更简单。SpringCloud很多功能都跟kubernetes重合,比如服务发现,负载均衡,配置管理,所以如果把SpringCloud部署到k8s,那么很多功能可以直接使用k8s原生的,减少复杂度。Kubernetes作为成熟的容器编排工具,在国内外很多公司、世界500强等企业已经落地使用,很多中小型公司也开始把业务迁移到kubernetes中。kubernetes已经成为互联网行业急需的人才,很多企业都开始引进kubernetes技术人员,实现其内部的自动化容器云平台的建设。对于开发、测试、运维、架构师等技术人员来说k8s已经成为的一项重要的技能,下面列举了国内外在生产环境使用kubernetes的公司: 国内在用k8s的公司:阿里巴巴、百度、腾讯、京东、360、新浪、头条、知乎、华为、小米、富士康、移动、银行、电网、阿里云、青云、时速云、腾讯、优酷、抖音、快手、美团等国外在用k8s的公司:谷歌、IBM、丰田、iphone、微软、redhat等整个K8S体系涉及到的技术众多,包括存储、网络、安全、监控、日志、DevOps、微服务等,很多刚接触K8S的初学者,都会感到无从下手,为了能让大家系统地学习,克服这些技术难点,推出了这套K8S架构师课程。Kubernetes的发展前景 kubernetes作为炙手可热的技术,已经成为云计算领域获取高薪要掌握的重要技能,在招聘网站搜索k8s,薪资水平也非常可观,为了让大家能够了解k8s目前的薪资分布情况,下面列举一些K8S的招聘截图: 讲师介绍:  先超容器云架构师、IT技术架构师、DevOps工程师,曾就职于世界500强上市公司,拥有多年一线运维经验,主导过上亿流量的pv项目的架构设计和运维工作;具有丰富的在线教育经验,对课程一直在改进和提高、不断的更新和完善、开发更多的企业实战项目。所教学员遍布京东、阿里、百度、电网等大型企业和上市公司。课程学习计划 学习方式:视频录播+视频回放+全套源码笔记 教学服务:模拟面试、就业指导、岗位内推、一对一答疑、远程指导 VIP终身服务:一次购买,终身学习课程亮点:1. 学习方式灵活,不占用工作时间:可在电脑、手机观看,随时可以学习,不占用上班时间2.老师答疑及时:老师24小时在线答疑3. 知识点覆盖全、课程质量高4. 精益求精、不断改进根据学员要求、随时更新课程内容5. 适合范围广,不管你是0基础,还是拥有工作经验均可学习:0基础1-3年工作经验3-5年工作经验5年以上工作经验运维、开发、测试、产品、前端、架构师其他行业转行做技术人员均可学习课程部分项目截图   课程大纲 k8s+SpringCloud全栈技术:基于世界500强的企业实战课程-大纲第一章 开班仪式老师自我介绍、课程大纲介绍、行业背景、发展趋势、市场行情、课程优势、薪资水平、给大家的职业规划、课程学习计划、岗位内推第二章 kubernetes介绍Kubernetes简介kubernetes起源和发展kubernetes优点kubernetes功能kubernetes应用领域:在大数据、5G、区块链、DevOps、AI等领域的应用第三章  kubernetes中的资源对象最小调度单元Pod标签Label和标签选择器控制器Replicaset、Deployment、Statefulset、Daemonset等四层负载均衡器Service第四章 kubernetes架构和组件熟悉谷歌的Borg架构kubernetes单master节点架构kubernetes多master节点高可用架构kubernetes多层架构设计原理kubernetes API介绍master(控制)节点组件:apiserver、scheduler、controller-manager、etcdnode(工作)节点组件:kube-proxy、coredns、calico附加组件:prometheus、dashboard、metrics-server、efk、HPA、VPA、Descheduler、Flannel、cAdvisor、Ingress     Controller。第五章 部署多master节点的K8S高可用集群(kubeadm)第六章 带你体验kubernetes可视化界面dashboard在kubernetes中部署dashboard通过token令牌登陆dashboard通过kubeconfig登陆dashboard限制dashboard的用户权限在dashboard界面部署Web服务在dashboard界面部署redis服务第七章 资源清单YAML文件编写技巧编写YAML文件常用字段,YAML文件编写技巧,kubectl explain查看帮助命令,手把手教你创建一个Pod的YAML文件第八章 通过资源清单YAML文件部署tomcat站点编写tomcat的资源清单YAML文件、创建service发布应用、通过HTTP、HTTPS访问tomcat第九章  kubernetes Ingress发布服务Ingress和Ingress Controller概述Ingress和Servcie关系安装Nginx Ingress Controller安装Traefik Ingress Controller使用Ingress发布k8s服务Ingress代理HTTP/HTTPS服务Ingress实现应用的灰度发布-可按百分比、按流量分发第十章 私有镜像仓库Harbor安装和配置Harbor简介安装HarborHarbor UI界面使用上传镜像到Harbor仓库从Harbor仓库下载镜像第十一章 微服务概述什么是微服务?为什么要用微服务微服务的特性什么样的项目适合微服务?使用微服务需要考虑的问题常见的微服务框架常见的微服务框架对比分析第十二章 SpringCloud概述SpringCloud是什么?SpringCloudSpringBoot什么关系?SpringCloud微服务框架的优缺点SpringCloud项目部署到k8s的流程第十三章 SpringCloud组件介绍服务注册与发现组件Eureka客户端负载均衡组件Ribbon服务网关Zuul熔断器HystrixAPI网关SpringCloud Gateway配置中心SpringCloud Config第十四章 将SpringCloud项目部署到k8s平台的注意事项如何进行服务发现?如何进行配置管理?如何进行负载均衡?如何对外发布服务?k8s部署SpringCloud项目的整体流程第十五章 部署MySQL数据库MySQL简介MySQL特点安装部署MySQL在MySQL数据库导入数据对MySQL数据库授权第十六章 将SpringCLoud项目部署到k8s平台SpringCloud微服务电商框架安装openjdk和maven修改源代码、更改数据库连接地址通过Maven编译、构建、打包源代码在k8s中部署Eureka组件在k8s中部署Gateway组件在k8s中部署前端服务在k8s中部署订单服务在k8s中部署产品服务在k8s中部署库存服务第十七章 微服务的扩容和缩容第十八章 微服务的全链路监控什么是全链路监控?为什么要进行全链路监控?全链路监控能解决哪些问题?常见的全链路监控工具:zipkin、skywalking、pinpoint全链路监控工具对比分析第十九章 部署pinpoint服务部署pinpoint部署pinpoint agent在k8s中重新部署带pinpoint agent的产品服务在k8s中重新部署带pinpoint agent的订单服务在k8s中重新部署带pinpoint agent的库存服务在k8s中重新部署带pinpoint agent的前端服务在k8s中重新部署带pinpoint agent的网关和eureka服务Pinpoint UI界面使用第二十章 基于Jenkins+k8s+harbor等构建企业级DevOps平台第二十一章 基于Promethues+Alert+Grafana搭建企业级监控系统第二十二章 部署智能化日志收集系统EFK 
### 回答1: Spring Cloud Kubernetes 是一种将微服务进行容器化交付的解决方案。本文将介绍完整版的第11章内容,让我们一起来了解吧。 第11章主要涵盖以下三个内容,分别为监控与告警、日志与审计、压测。 在微服务架构中,监控与告警是非常重要的一环。Spring Cloud Kubernetes 提供了丰富的监控与告警功能,可帮助我们监控应用的运行状态和性能指标。我们可以使用 Prometheus 来收集应用的指标,并使用 Grafana 来进行可视化展示。此外,还介绍了如何设置监控的阈值,并通过 Alertmanager 发送告警通知。 日志与审计是另一个重要的方面。Spring Cloud Kubernetes 提供了集中式的日志管理和审计功能,可以将微服务的日志集中存储,并提供查询和分析的能力。我们可以使用 Elasticsearch 和 Kibana 来存储和展示日志数据,并使用 Filebeat 将应用的日志发送到 Elasticsearch 集群。 压测是测试微服务的性能和稳定性的一种方法。在本章中,我们介绍了如何使用 JMeter 进行压力测试。我们需要根据实际需求,编写合适的测试场景和脚本,并设置并发请求数量、持续时间等参数。通过压测,我们可以评估微服务的性能表现,并找出潜在的性能瓶颈。 综上所述,本章介绍了在使用 Spring Cloud Kubernetes 进行微服务容器化交付时,如何实现监控与告警、日志与审计、压测等功能。这些功能的引入可以帮助我们更好地了解和管理微服务的运行状态,提高应用的可靠性和稳定性。 ### 回答2: 【完整版11章】SpringCloud Kubernetes 微服务容器化交付实战是一本介绍在使用 SpringCloud 架构和 Kubernetes 容器化平台上进行微服务交付的实践指南。本书主要包括以下几个方面内容: 首先,本书介绍了 SpringCloudKubernetes 的基本概念和原理SpringCloud 是一套用于构建分布式系统的框架,它提供了诸如服务注册与发现、负载均衡、断路器等功能。Kubernetes 是一个开源的容器编排平台,它可以自动化地管理和调度容器。了解这些基本概念有助于我们在后续的实践中更好地理解和应用。 接着,本书详细介绍了如何将 SpringCloud 微服务容器化并交付到 Kubernetes 平台上。这包括了如何使用 Docker 将微服务打包成容器镜像,如何使用 Kubernetes 部署和管理容器,以及如何通过 Kubernetes 提供的功能实现服务注册与发现、负载均衡等。 在介绍容器化部署和管理微服务的基础上,本书还深入讨论了如何在 Kubernetes 上进行微服务的监控和日志管理。通过使用 Prometheus 和 Grafana 进行监控、使用 ELK(Elasticsearch、Logstash、Kibana)进行日志管理,我们可以及时发现和解决微服务中的问题。 此外,本书还介绍了如何使用 Jenkins 持续集成/持续交付来实现自动化的构建、测试和部署。通过结合 Jenkins 和 Kubernetes 提供的功能,可以实现微服务的全自动化交付,从而提高开发、测试和部署的效率。 最后,本书还对在实际项目中容器化微服务的一些实践经验进行了总结和分享。这包括如何进行容器镜像的管理和版本控制、如何优化容器化微服务的资源使用、如何进行持续集成和部署的自动化等。 总的来说,【完整版11章】SpringCloud Kubernetes 微服务容器化交付实战是一本介绍在 SpringCloudKubernetes 平台上进行微服务容器化交付的实践指南。它详细介绍了容器化部署和管理微服务的方法,并分享了一些实际项目中的实践经验。这本书对于想要在分布式系统开发中运用微服务和容器化技术的开发人员和系统架构师来说,是一本非常有价值的参考书。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值