微服务实战(一) 理解springboot 、springcloud、docker、k8s

时间:2024-04-02 17:02:46

本篇主要阐述微服务的个人理解

现如今,随着互联网的发展,对于系统性能,架构均有了更高的要求。以前传统的ssh单体应用的模式已显力不从心,而微服务架构应运而生,并且形成了越来越成熟的方案。

传统的单体应用模式(比如ssh时代的惯用架构)

优点是开发和部署都非常方便,只需要考虑到单体应用如何实现业务逻辑,对于性能的扩展只需要复制部署到多个tomcat形成集群,用Nginx进行负载均衡,即可完成一个简单的分布式方案。缺点就是比较简单粗暴,不管三七二十一,直接把整个应用复制部署,没有细化到单个功能的性能管控,并且在性能上瓶颈也很明显,负载服务器,数据库,都是各个瓶颈点。

微服务实战(一) 理解springboot 、springcloud、docker、k8s

 

微服务架构(spring全家桶:springboot+springcloud)

首先讲一下什么是springboot,它实际上和springmvc框架解决的是同一件事,就是如何对外提供服务(api),并且在使用层面,代码注解也是是很相似的。

本质的区别在于,springmvc可以看成是servlet的封装,首先需要建立一个java web项目,通过web.xml的配置接入springmvc入口,并且最终要将java web项目部署到容器中(比如tomcat); 而springboot则可以直接看成是一个tomcat和java web应用的集装箱,你只需要按照约定配置好 核心配置文件(比如application.yml),写好你的控制器(controller),然后再加上一个main方法,就可以直接启动 tomcat+你的应用,部署后,也是直接用jar命令来启动一个Jar包这样的形式。

意义就在于,springboot非常适合 部署大量独立服务,细品一下。 一个springboot的jar包就是一个完整的tomcat+应用,指定不同的端口号,一个jar命令,就启动了应用。其实呢,在这儿有个架构上的思想转变,之所以要说微服务,就是因为整个应用从架构上就拆分成了各个小应用,比如说 电商系统,拆分成了订单微服务,用户微服务等等,每个微服务都使用各自独立的数据库,微服务之间使用RPC等方式进行交互,每个微服务都是可以独立运行,并且只解决某一类业务。这样整体架构就由大单体应用的模式转变为 微单体应用群+独立数据独立运行+服务间调用 这样的模式,整个架构的容错率,可扩展性,高可用性 就变得更强了。

 

微服务架构的核心组件包含:

  1. 服务网关
  2. 服务注册发现
  3. 服务配置中心
  4. 限流熔断和流聚合
  5. ......(springcloud有非常多的组件   https://www.springcloud.cc

微服务实战(一) 理解springboot 、springcloud、docker、k8s

docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

其实简单来说,就是一种打包术,比如在上面的图中,实际每个微服务的运行都需要有一系列的程序来支撑,那么docker的作用就是将 下面红框内的 jdk,mysql,springboot等打包成一个单独的docker包,然后运行起来,对外映射出springboot的服务端口,提供服务。这样方便在不同操作系统或者环境中迁移和部署,只需要简单的几个docker命令,就可以一键搭建好一套微服务。而不需要从安装各种基础软件开始。

微服务实战(一) 理解springboot 、springcloud、docker、k8s

 

K8S (Kubernetes)

 

k8s是一个docker集群的管理工具,它的核心功能:

自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。


弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。


滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

 

 

先写这么多,接下来准备写完 springboot+springcloud+docker+k8s 的实战系列