一. 初识微服务
1.1 什么是微服务
微服务(Microservice)是一种架构风格,一个或多个微服务组成一个大型的复杂软件应用。在这个应用中各个微服务都可以被独立部署,微服务之间的耦合度是非常低的。每个微服务仅仅关注一件任务并保证能很好的完成该任务。
1.2 微服务架构与单体架构
1.2.1 单体架构
单体架构在设计中通常使用经典的三层模型,既表现层,业务逻辑层和访问层。虽然在软件设计中划分了三层模型,但是对业务场景并没有划分。一个典型的单体应用就是将所有的业务场景的表现层,业务逻辑层和数据访问层放在一个工程中,最终经过编译、打包,部署在一台服务器上。例如典型的J2EE工程,它是将表示层的JSP、业务逻辑层的Service、Controller和数据访问层的Dao,打成war包,部署在Tomcat、Jetty或者其他Servlet容器中运行。
1.2.2 微服务架构
微服务架构的系统是一个分布式系统,按业务领域划分为独立的服务单元。简而言之,微服务架构的风格,就是将单一程序开发成一个微服务,每个微服务运行在自己的进程中,并使用轻量级机制通信,通常是 HTTP RESTFUL API。这些服务围绕业务能力来划分构建的,并通过完全自动化部署机制来独立部署。这些服务可以使用不同的编程语言,以及不同数据存储技术,以保证最低限度的集中式管理。
1.3 微服务的出现
单体架构所有的业务子模块都集成在一个很重的JVM进程当中,这种模式的好处是便于管理,所有代码都在同一个项目当中。但是产品规模越来越大,其坏处也很明显:一.项目过于臃肿,当大大小小的功能模块都集中在同一个项目的时候,整个项目必然会变得臃肿,让开发这难以维护;二.资源无法隔离,整个单体系统的各个功能模块都依赖于同样的数据库、内存等资源,一旦某个功能模块对资源使用不当,整个系统都会被拖垮。三.无法灵活扩展,当系统访问量越来越大的时候,单体系统固然可以进行水平扩展,部署在多台机器上组成集群,但是这种扩展并非灵活的扩展。比如我们现在的性能瓶颈是支付模块,希望只针对支付模块做水平扩展,这一点在单体系统上是做不到的。
伴随着互联网技术的飞速发展,目前全球超过一半的人口在使用互联网,人们的生活随着互联网的发展,发生了翻天覆地的变化。各行各业都在应用互联网,国家政策也在大力支持互联网的发展。随着越来越多的用户参与,业务场景越来越复杂,传统的单体架构已经很难满足互联网技术的发展要求。所以,改变单体应用架构已经势在必行。另外,随着云计算、大数据、人工智能的飞速发展,对系统架构也提出了越来越高的要求。至此微服务应运而生,微服务这个概念是2012年出现的,作为加快Web和移动应用程序开发进程的一种方法,2014年开始受到各方的关注,而2015年,可以说是微服务的元年;越来越多的论坛、社区、blog以及互联网行业巨头开始对微服务进行讨论、实践,可以说这样更近一步推动了微服务的发展和创新。
1.4 微服务架构方案
常用的微服务架构方案有ZeroC IceGrid、Spring Cloud、基于消息队列与Docker Swarm等。本文主要讨论Spring Cloud,以下转自于Spring Cloud简介。
1.4.1 什么是Spring Cloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.4.2 Spring Cloud常用组件
2.1 Spring Cloud Config
服务配置中心,将所有的服务的配置文件放到本地仓库或者远程仓库,配置中心负责读取仓库的配置文件,其他服务向配置中心读取配置。Spring Cloud Config使得服务的配置统一管理,并可以在不人为重启服务的情况下进行配置文件的刷新。
2.2 Spring Cloud Netflix
它是通过包装了Netflix公司的微服务组件实现的,也是Spring Cloud核心组件,包括Eureka,Hystrix,Zuul,Archaius。
2.3 Eureka
服务注册和发现组件
2.4 Hystrix
熔断器组件。它通过控制服务的API接口的熔断来转移故障,防止微服务系统发生雪崩效应。另外Hystrix能够起到服务限流和服务降级的作用。使用Hystrix Dashboard组件监控单个服务的熔断状态,使用Hystrix Turbine组件可以监控多个服务的熔断器的状态。
2.5 Zuul
智能路由网关组件。能够起到智能路由和请求过滤的作用,内部服务API接口通过Zuul网关统一对外暴露,防止内部服务敏感信息对外暴露。也可以实现安全验证,权限控制。
2.6 Feign
声明式远程调度组件。
2.7 Ribbon
负载均衡组件
2.8 Archaius
配置管理API组件,一个基于Java的配置管理库,主要用于多配置的动态获取。
2.9 Spring Cloud Bus
消息总线组件,常和Spring Cloud Config配合使用,用于动态刷新服务的配置。
2.10 Spring Cloud Sleuth
服务链路追踪组件,封装了Dapper,Zipkin,Kibina等组件,可以实时监控服务链路调用状况。
2.11 Spring Cloud Data Flow
大数据操作组件,它是Spring XD的替代品,也是一个混合计算模型,可以通过命令行的方式操作数据流
2.12 Spring Cloud Consul
该组件是Spring Cloud对Consul的封装,和Eureka类似,它是一个服务注册和发现组件。
2.13 Spring Cloud Zookeeper
该组件是Spring Cloud对Zookeeper的封装,也是用于服务注册和发现
2.14 Spring Cloud Stream
数据流操作组件,可以封装 Redis,RabbitMQ,Kafka等组件,实现消息的接受和发送。
2.15 Spring Cloud CLI
该组件是对Spring Boot CLI的封装,可以让用户以命令行方式快速搭建和运行容器。
2.16 Spring Cloud Task
该组件基于Spring Tsak,提供任务调度和任务管理的功能。
1.4.3Spring Cloud 和 Dubbo比较
Spring Cloud拥有很多的项目模块,包含微服务的方方面面,Dubbo是个十分优秀的服务治理和服务调用框架,但缺少了很多的功能模块,例如网关,链路追踪等。
开发风格上,Dubbo倾向于xml配置方式,而Spring Cloud基于Spring Boot,它采用基于注解和JavaBean配置方式的敏捷开发。
通信方式上Spring Cloud大多数基于HTTP Restful风格,服务与服务间完全耦合,因此服务无关乎语言和平台。Dubbo采用远程调用方式,对接口平台和编程语言有强依赖性。
Dubbo和Spring Cloud各有优缺点,Dubbo更易上手,也非常成熟和稳定,Spring Cloud服务框架严格准守者 Martin Fowler 提出的微服务规范,社区活跃,未来很可能成为微服务架构的标准。