微服务框架
我对微服务的理解
1. 什么微服务
微服务可以定义为是一种架构风格,他旨在将一个大型复杂服务应用分解为多个微服务组成。
我常喜欢使用LEGO玩具举例说明什么是微服务。不管你想要拼装出多少复杂的模型,组成它的都是结构简单、统一接口、大量重复相同的LEGO零件。
以往的应用服务开发中,服务程序都是单体的,大量的业务集于一身,代码动辄几万几十万行。随着业务的不断增长,开发迭代和性能瓶颈问题都随之增加从而不断提高开发难度。
而微服务就是为了解决这种大型复杂且不断变化的应用开发而生的。
2. 微服务的特点
2.1 微服务优点
- 每个微服务仅关注完成自己的任务并很好的完成任务,增加新业务只需要开发新的微服务,不用反复修改原有稳定的代码而产生不稳定几率。
- 微服务独立部署,各个微服务之间松耦合。当某个微服务成为瓶颈时更容易迭代快速解决问题,甚至就可重新开发以替换掉原有服务。
- 微服务可复用性,这项则需要优秀的架构师的加成。就像上面我所比喻的LEGO玩具一样,它使用的大量零件都是一样的重复的,虽然可能使用了成百上千颗零件,但实现计设生产的零件种类只有几种几十种。
- 微服务需要统一的接口标准,就像LEGO的凸点和凹槽都是标准一至的,可实现灵活组合。
2.2 从管理角度讲
- 每个微服务的功能少了开发简单了,也就可交由初、中级程序员开发,以节省开发成本。
- 开发语言和框架选择上的灵活性,团队建设的灵活高效组合。
- 可围绕业务功能来组织团队,不同的产品团队只关注于自己的业务开发。
- 智能端点和傻瓜式管道
- 去中心化技术治理
- 去中心化数据管理
- 基础设施自动化
2.3 微服务要解决的问题
单从开发的角度讲,微服务化的目的很好理解,优势也行明显。但当你开发出来大量微服务,就像下面这一地的LEGO零件摆在你面前时是否还高兴得起来呢!
你先在一定在想图纸在哪里。
这里你就需要求助一个人,那就是贵公司的架构师。它会提供你图纸并告诉你每个微服务应如何部署。
- 这就是要首先解决的微服务部署问题
接下来你可能会发现我上面举例的LEGO和微服务并不太一样,LEGO模型大多是静态的,而服务是不停运转的动态应用。
服务在运行中会遇到工作疲劳(内存碎片太多、无用数据未释放),体力耗尽(空闲内存耗尽、磁盘空间耗尽、IO资源耗尽),自然不可抗力(机房停电、火灾、通讯光纤被挖断、设备损坏)等问题。
而且是这么多的微服务,他们每一个都有可能在任何时间发生故障,且只是其中的一个或几个发生故障。这好像是个很严重的问题,甚至可能威胁到你对微服务的信心,而选择忽略上面讲的那所有的微服务优点。
- 如何监控微服务的运行状态
- 如果快速补救出现问题的微服务
- 能不能让微服务变得健壮
3. 微服务框架
微服务框架可以理解为帮助你解决上面部分复杂棘手、且具有普遍性的问题实现。
3.1 微服务框架Spring Cloud
Spring Cloud是侵入式的微服务框架,它使用Eruka Server作为服务注册中心,在微服务单元上配置使用Eureka Client向注册中心进行注册。
SpringCloud的基础功能:
- 服务治理: Spring Cloud Eureka
- 客户端负载均衡: Spring Cloud Ribbon
- 服务容错保护: Spring Cloud Hystrix
- 声明式服务调用: Spring Cloud Feign
- API网关服务:Spring Cloud Zuul
- 分布式配置中心: Spring Cloud Config
SpringCloud的高级功能:
- 消息总线: Spring Cloud Bus
- 消息驱动的微服务: Spring Cloud Stream
- 分布式服务跟踪: Spring Cloud Sleuth
- Spring Boot用于快速开发单个微服务。
3.2 Dubbo框架
Dubbo是一个阿里巴巴开源出来的一个分布式服务框架,它也是侵入式的。
- 远程通讯:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
- 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
- 自动发现:基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
3.3 Istio
Istio是一个Service Mesh开源项目,是Google继Kubernetes之后的又一力作,属于非侵入式。
3.4 Kubernetes和Docker
k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化。
可以用kubernetes去管理Docker集群,即可以将Docker看成Kubernetes内部使用的低级别组件。另外,kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。