《轻量级微服务架构》读书笔记【转】

陈晓猛

2016-12-07

【注】原文发表于开源中国:https://my.oschina.net/lujianing/blog/800412
作者:蛙牛

摘要: 浓缩的都是精华

微服务架构要求:

  • 根据业务模块划分服务种类
  • 每个服务可独立部署且互相隔离
  • 通过轻量级API调用服务
  • 服务需保证良好的高可用

微服务技术选型:

  • 使用Spring Boot开发服务
  • 使用Node.js作为服务网关反向代理调用服务
  • 使用Zookeeper注册发现服务
  • 使用Docker封装/部署/隔离服务
  • 使用Jenkins构建发布服务

架构技术选型

Spring Boot

Spring4.0推荐使用Java代码和注解方式作为配置(去xml),Spring Boot遵循相关理念且采用4.0相关特性和技术,集成了主流组件,可创建一个内嵌Servlet容器的jar独立运行,且提供生产级特性(服务治理)。

Node.js

Node.js是基于ChromeV8引擎的Javascript运行环境,它使用“事件驱动”且“异步非I/O”的模型使其轻量且高效,Node.js的包管理器NPM是全球最大的开源库生态系统。

Node.js是运行环境,而非Javascript类库和框架,NPM与Java的Maven异曲同工,事件驱动把事件加入队列中轮训。Node.js采用单线程模型,适用于I/O密集型应用(高并发网站)。

Node.js内置HTTP服务器(模块),性能和稳定性与Nginx不分伯仲。且模块体系强大,比如Web框架Express,Web Socket服务Scocket.IO,命令行工具Commander.js,Http代理服务器node-http-proxy Node.js性能不亚于Nginx,但扩展性高于Nginx,可以动态指定被代理的目标地址,并执行反向代理操作,调用微服务REST API。

微服务网关提供反向代理与服务发现,还应具备安全认证,性能监控,数据缓存,请求分片,静态相应等特性。

Zookeeper

提供分布式环境下的协调服务,分布式应用可基于它实现数据发布与订阅,负载均衡,命名服务,分布式协调与通知,集群管理,领导选举,分布式锁,分布式队列等。

Zookeeper包含五个特性:

  • 顺序性:从同一个客户端发送的请求,严格按照发送顺序
  • 原子性:如同事务的原子性,集群中所有机器要么都处理或者都不处理
  • 单一性:客户端无论连到哪个服务器,看到的数据据模型都一致。Zookeeper服务器之间可高效进行数据同步
  • 可靠性:服务端数据发生变化会立即存储,除非另一请求修改数据,否则数据一定可靠
  • 实时性:当请求被成功处理后,客户端会立刻获取服务端的最新数据
  • Zookeeper内部拥有一个树状的内存模型,类似于文件系统,有若干目录,目录下有若干文件,统称为ZNode。ZNode可由Zookeeper客户端创建,客户端与服务端建立连接后,服务端为客户端创建一个Session,客户端对ZNode的操作均在这个Session中。

ZNode有四类节点:

ZNode类型 说明

Zookeeper参考了经典的分布式一致性协议Paxos协议,设计了更轻量级的协议Zab(Zookeeper Atomic Broadcat,Zookeeper原子广播协议)。

Zab分为两个阶段:Leader Election(领导选举)与Atomic Boardcast(原子广播)。

启动时会选举出一个Leader,其他节点Follower,当Leader节点处故障,则自动选举出新的Leader,并让所有节点恢复到一个正常状态。然后通过原子广播,同步Leader和Follower数据。 所有写操作都发送到Leader节点,并通过广播同步到Follower节点。 Zookeeper集群中各个节点会互相通信,确保存活,超过半数节点就可以正常对外提供服务,因此一般提供奇数个节点。客户端可连接任意节点,且与某节点断开后,会自动连接到其他节点。

启动Spring Boot服务并注册到Zookeeper中,依次判断并创建节点 根节点(持久节点)-服务节点(持久节点)-地址节点(临时顺序节点)。

Node.js通过node-zookeeper-client连接Zookeeper,获取服务地址,执行反向代理。

服务注册表示例

Docker

Docker引擎(Docker Engine):可理解为一个运行在服务器上的后台进程,本质上是一个服务,启动后,我们可以通过发送Docker命令与之通信

Docker客户端(Docker Client):分为Docker命令客户端和Rest API客户端

Docker镜像(Docker Images):如同光盘刻录数据后,放入光驱中读取数据。我们将程序打包到镜像中,将其载入到Docker引擎中运行

Docker容器(Docker Containers):运行Docker镜像,会启动一个Docker容器,该容器中运行镜像中封装的程序。如果将镜像理解为Java类,容器相当于Java实例。同一个镜像理论上可运行无数个Docker容器

Docker镜像注册中心(Docker Registry):官方提供了Docker Hub的镜像注册中心,用于存放公开和私有的Docker镜像仓库(Docker Repository)。我们可以用Docker Hub中下载镜像和上传镜像。

Docker的四大特点:

  • 快速运行:启动虚拟机需要几分钟,启动Docker容器仅需几秒
  • 节省资源:Docker容器运行在Docker引擎上,可利用宿主机硬件资源,无需占用过多系统开销
  • 便于交付:传统软件交付的程序,Docker时代交付的是镜像,镜像不仅封装了程序,也包含了程序运行的环境
  • 容易管理:可通过Docker客户端直接操作Docker引擎,方便管理Docker镜像与容器。
  • Docker提供了Dockerfile的脚本文件,通过一些指令,可快速编写镜像的构建脚本,从而让构建进行做到自动化。

在Spring Boot项目中,可以添加Dockerfile文件,并通过docker-maven-plugin插件,构建Docker镜像并Push到仓库。

mvn docker:build 可在target目录下生成docker目录,包含classes目录所有文件,打包jar,Dockerfile。docker-maven-plgin插件在这个目录下执行docker bulid命令来构建镜像。

Jenkins

是一款持续集成软件,可连接代码仓库,从中获取源码并执行自动构建,构建完毕后还可执行后续任务,比如:生成单元测试报告,归档程序包,部署程序包到Maven仓库,发送邮件通知等。Jenkins支持一主多从,构建任务可并行在多台Slave机器上。

Jenkins可配置构建触发器,并允许我们在“构建前”或“构建后”添加执行的Shell脚本。

开发人员将源码推送至Gitlib,随后触发Jenkins构建任务
Jenkins调用Maven进行构建,编译生成jar包
根据构建过程,生成一个Docker镜像,并推送至局域网的Docker Registry中
根据生成的镜像,运行一个Docker容器
除此之外,微服务架构还涉及:微服务日志,微服务安全,服务监控,微服务测试,微服务通信,微服务治理等。

© 著作权归作者所有

读者评论

相关博文

  • 程序员要不要坚持写技术博客?

    管理员账号 2016-10-25

    程序员如何积累、总结经验?是否要坚持写技术博客?如何才能写好技术博客?写技术文章是否对出版图书有帮助?相信这些问题,是很多入门的程序员甚至是资深程序员都会考虑的问题。 极客邦近期采访了特赞公司的CTO、《轻量级微服务架构(上册)》作...

    管理员账号 2016-10-25
    2040 0 0 0