微服务生态体系建设之 三个火枪手(2) 容器技术
现在我来尝试回答这个问题 :“微服务为什么这几年才火起来?”
要回答这个问题,先要知道云原生这个概念。国际上有个组织叫CNCF,即Cloud Native Computing Foundation,这个基金组织对云原生的定义如下:Cloud-native computing uses an open source software stack to deploy applications as microservices, packaging each part into its own container, and dynamically orchestrating those containers to optimize resource utilization.
中文我就不翻译了,核心内容是说用开源软件的应用,这个应用满足如下特征
- 微服务
- 容器化封装
- 自动化动态编排
进而,CNCF又提出了云原生应用的12-factor,
通过对以上的解读,你就知道微服务这几年火起来,是跟容器技术和DevOps的成熟紧密相关的。
本文重点讲一下容器这个概念。
虚机技术大家已经不陌生,容器技术和虚机技术的区别在哪里?请看下图。其实虚机是台完整的虚拟服务器,而docker容器是服务器操作系统下的一个进程。
再看下图,如何将应用部署到容器里
先读一下Dockerfile中的内容,有了注释,相信大家还是能读懂的:
[email protected]:~$ cat dockerfile
#基于哪个基础镜像
FROM frolvlad/alpine-oraclejdk8:slim
#将本地文件夹挂载到当前容器
VOLUME /tmp
#拷贝文件到容器
ADD eurekaserver-0.0.1-SNAPSHOT.jar app.jar
#配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
#开放8761端口
EXPOSE 8761
通过容器技术,我们把应用需要的运行环境、缓存环境、数据库环境等等封装成docker registry中的一个个image,只要执行docker build操作,按照dockerfiler里写的脚本执行,就能生成新的镜像,以后就可以随时把这个镜像pull下来,然后docker run一下新的镜像,容器就能快速启起来提供服务(示例是微服务的注册服务器eureka server的制作脚本)。无需像在虚机环境下部署一样,一步步安装操作系统、数据库、中间件,然后再手工执行部署命令,把应用包部署上去,最后才能启动应用。所以容器化的服务就特别容易自动化快速部署和动态伸缩,甚至通过不同的部署策略完成不宕机部署。
由于微服务本身的体量小,又内嵌了tomcat的运行环境(拜springboot所赐),使得它特别轻巧,更加适合于容器化部署,所以说,微服务和容器就是绝配,微服务就是容器化的服务。
至于部署策略,像蓝绿部署、灰度发布、金丝雀发布等等概念,这里就不展开了。还有为什么容器前面加个docker?简单理解,docker是管理容器的工具集,在docker之上,我们又会有kubernetes (k8s),在k8s之上,我们又会有openshift。这些细节,请CII的大咖们来解释吧。
最后看一下,部署在容器下的微服务,在运行时是怎么样子的
记住这些方盒子,它们就是容器,里面装着微服务。
忘记主机吧,我们不用知道主机在哪里,只要知道有容器在跑就行,把微服务部署在多个容器里,“杀了夏明翰,还有后来人”。不用关心容器跑在哪里,只要知道它在超融合的云环境里就可以了。
到此为止,我们解释了微服务近几年才火的一个原因,就是容器技术的成熟;接下来的一篇,我会简单介绍“狭义的”DevOps技术,它也成熟了,它是微服务火的第二个原因,我们就用DevOps的姿势来开发微服务。