第1章
微服务是在面向服务架构SOA的基础上进一步发展而来的,它比SOA做得更加彻底,其单体服务被更加彻底地划分,最大限度地实现了服务的单一职责。
1.1.2互联网
即计算机网络,连接了世界上数以万计的计算机设备(可联网设备),这些计算设备包括桌面计算机、Linux服务器(工作站)以及其他新兴的计算设备(如智能手机、智能手表、平板电脑等)。
1.1.3 网络应用架构
互联网环境下,诞生了新的应用软件架构,即基于B/S和C/S架构的应用,这两种应用的共同点是均需要网络通过向远程服务端发送请求获取数据以及相互通信。
C/S架构的软件需要在宿主机上安装才能使用,而B/S架构的软件只需宿主机接入互联网且拥有浏览器即可使用。
1.2SOA与微服务
SOA(面向服务架构)是一种软件架构、一种软件设计方法。SOA软件系统中包含了多个服务,并且服务与服务之间通过相互依赖最终提供一系列功能,一个服务通常以独立的形式存在于操作系统进程中,各个服务之间通过远程调用进行通信。
微服务架构和SOA架构类似,是在SOA基础上进行了改进,微服务架构的核心是业务需要彻底组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的服务,这些服务可以持续开发、持续集成、并完成自动化部署。
1.3 远程过程调用
微服务中单体服务间的通信是通过远程过程调用RPC实现。
基于HTTP的远程过程调用传输的数据类型可分为两类:即XML格式数据和JSON格式数据。
TCP是一种可靠长连接
HTTP是短连接,连接一次,发送一个数据包,然后断开连接。
客户端向服务端发起的请求携带4部分数据,即请求行、请求头、空行和请求体。
第2章 Spring及Spring Could
目前微服务方案应用最广的架构即Spring体系,Spring体系包含了构建微服务所需的所有组件,如Spring Cloud、Sring Boot。
2.1Spring
Spring是基于Java编程语言的框架。Spring旨在使Java编程更加快捷、易用、安全,Spring正是由于聚焦速度、简单和效率,成为世界上应用最广的Java框架。
2.1.1 为什么选择Spring
Spring是Java后台开发人员的福音,有了Spring框架,对现代开发者而言应该是有了SpringBoot后,可以快速迭代,满足业务需求。
1.开发者的信赖
Spring发展至今备受开发者信赖。互联网发展至今,阿里巴巴、谷歌、微软等著名公司对Spring均有贡献,开发者众多,发展非常迅速且稳定。对于消费者,他们虽然并不知道自己用的服务是由Spring体系提供的,但是他们享受到了Spring在线上购物、流媒体电视等领域带来的良好的体验与服务,反观这些良好的效果,开发者更加信赖Spring,正如“滚雪球”一样,Spring的受众越来越多。
2.灵活
Spring具有多种可插拔的组件及第三方库,使其具有足够的灵活性,通过组合不同的组件(包括第三方库),开发者可以构建任何可以想得到的应用,如构建安全的Web应用,响应式Web应用或微服务Web应用。Spring框架的核心功能:控制反转(IoC)和依赖注入(DI)为Spring的功能实现提供了基础,保证了Spring的灵活性。
3.高效
Spring项目SpringBoot的出现,改变了开发者进行Java编程的方式。从根本上简化了开发流程,减少了代码量,提高了开发效率。SpringBoot集成必要的组件,如应用上下文、自动配置的嵌入Web服务器,使微服务开发如同编写输出Hello World的程序一样简单。在SpringBoot中集成SpringCloud等相关组件,独立的Spring Boot项目即可构成微服务体系,显著提高微服务开发效率。
4.安全
Spring在处理安全问题方面响应迅速且非常负责,这保证了Spring具有更高的安全性,互联网安全室非常重要的一个领域,而Spring在安全方面做得非常出色,Spring Security是一个开箱即用的安全组件,提供了工业标准的安全集成方案。
5.良好的生态
Spring社区是一个庞大的、全球性和多样化的社区,涵盖了从初学者到经验丰富的专业人士等不同开发阶段的开发人群,无论在哪个学习阶段,均可从社区获取帮助以及相应的学习资源。
2.1.2 Spring的功能
1.微服务
微服务是一种现代软件开发方法,微服务中的应用代码分片管理、独立交付、即微服务中的应用是彼此独立的模块,可以单独运行,是弱依赖,如果服务之间没有相互调用关系,则服务是独立进行开发和交付的,相互不影响,保证了项目的独立快速交付,这也是现代互联网所追求的高内聚、低耦合架构的实现。
2.响应式编程
响应式编程是一种范式,开发者可以构建非阻塞、异步的应用程序处理背压(流控)。Spring Framework 5.0引入的Web Flux即响应式编程组件。响应式编程并不会提高服务的响应速度,但是可以在有限资源的情况下提高系统的吞吐量和伸缩性。响应式编程对超时、容错、失败重试进行了优化、用户体验更好。
背压是一种应用运行时状态,当生产者生产数据的速度大于消费者消费的速度时,会导致消费者缓存溢出,即形成背压。阻塞和非阻塞是针对线程而言的,引入非阻塞机制,线程不会阻塞,保证系统资源的利用率;异步和同步是针对消息传递而言的,引入异步消息传递,保证系统的流畅性。
3. Spring Cloud组件化
分布式系统服务间的通信成为开发者面临的重大挑战之一,系统的复杂度由应用层向网络转移,这意味着云原生需要处理诸如外部配置、无状态、日志记录和连接到备用服务等问题,而Spring的原生项目Spring Cloud提供的组件足够处理这些问题。使用Spring Cloud可以“一站式”开发、部署、维护分布式服务(微服务集群)。
4.快速构建Web应用
Spring的单体项目SpringBoot是一个约定大于配置的Java Web框架,该框架移除了众多配置文件,是一种现代化的Web编程模型,简化了服务搭建流程,并且Spring Boot的启动和停止都非常简便,通过内置的Tomcat、Netty等服务器即可完成服务的启停,提高开发和交付效率。
5.功能即服务
无服务器工作负载是事件驱动的工作负载,与服务器基础设施无关。运行多少个实例、使用哪种操作系统这类问题统一由服务平台管理,对于开发者而言,功能及服务FaaS,开发者可以更加专注于业务开发。
6.事件驱动
事件驱动即消息的发布-订阅,Spring提供基于事件驱动的组件,可以很好地与Apache Kafka、RabbitMQ、Azure Event Hub等消息中间件协作,保证应用服务与业务之间的消息互通,当业务方产生数据时,及时将数据传输至消息队列,应用服务从订阅的队列中获取数据并及时处理,保证业务的顺畅进行。
7.批处理
批处理是指不需要以外部交互或中断的方式处理有限的数据。批处理技术可以有效处理大量数据,基于SLA的排序能力可以充分利用资源,在JVM中构建稳定的批处理任务,保证系统的安全稳定与运行。
2.1.3 Spring框架功能体系
Spring架构即Spring Framework,这并不是Spring的组成架构,而是Spring的功能架构,即Spring包含的主要功能,这些功能按模块进行划分,Spring架构中共有大约20个模块,按照各自的职能分为Core Container、Data Access/Integration、Web、AOP、Instrumentation、Messaging和Test,Spring分层架构如图:
1.Core Container
Core Container核心容器包括spring-core、spring-beans、spring-context、spring-context-support和spring-expression(Spring Expression Language,SpEL)这5个模块。spring-core和spring-beans模块提供框架最基础、最核心的功能,如IoC和DI,BeanFactory是工厂模式的复杂实现,解除了对单例的依赖,同时将配置从程序中解耦。
Context上下文模块(spring-context)是在Core和Beans模块的基础上构建的,Context模块从Beans模块继承并且增加了对国际化、事件广播、资源载入和通过Servlet容器创建上下文的支持。
Context模块同样支持J2EE,如EJB、JMX等,ApplicationContext接口是Context模块的关键切入点,spring-context-support提供第三方库接入Spring应用上下文的支持,如缓存、邮件、任务、以及模版引擎。
spring-expression模块为运行时查询和操作对象提供强大的表达式语言。SpEL是统一表达式语言的扩展,该语言支持setting和getting属性值、属性赋值、方法引用、获取数组、集合内容等。
2. AOP和Instrumentation
spring-aop模块提供面向切面编程的功能,开发者可以使用AOP自定义切面,将功能实现与业务逻辑解耦,功能实现即通过切面操作某部分逻辑的执行过程,如统计部分业务逻辑的耗时、日志等,业务逻辑即实际的需求。
独立的spring-aspects模块提供了与AspectJ的集成。spring-instrument模块使用java.lang.instrument(容器类)作为动态的instrumentation(执行容器),开发者可以构建独立于应用程序的代理程序监测和协助运行在JVM中的程序,甚至替换和修改类的定义,同时提供了类加载器实现功能。spring-instrument-tomcat模块包含Spring对Tomcat的动态执行容器代理。
3.Messaging
Messaging为集成Message API和消息协议提供支持。Spring框架从4.0开始引入Spring messaging模块,该模块的核心理念借鉴了Spring Integration,如Message、Message Channel、Message Handler,该模块同时包含了一系列类似于Spring MVC注解编程风格的消息方法注解。
4.Data Access/Integration
Data Access/Integration层包括JDBC、ORM、OXM、JMS和Transactions(事务模块)。
5.Web
Web层包括spring-web、springwebmvc、spring-websocket和spring-webmvc-portlet模块。其中,spring-web模块提供最基础的Web功能,如文件上传、使用Servlet监听器初始化IoC容器以及Web应用上下文功能,同时包含HTTP客户端远程调用功能。
6.Test
spring-test模块支持Spring组件的Junit和TestNG的单元测试和集成测试,spring-test模块提供加载Spring应用上下文并缓存上下文的功能,并且可以通过模拟对象进行隔离测试。
2.1.4Spring项目体系
就项目层级而言,Spring是一个位于顶层的抽象项目,Spring包含了从配置到安全、Web应用到大数据等功能的所有组件或独立项目,帮助开发者实现功能,其中独立的项目有SpringBoot、微服务组件SpringCloud、持久层组件SpringData JDBC层。
Spring架构体系共包含了24个项目类,每个项目都是独立的组件,而Spring Framework则是对Spring 功能的抽象,不具备独立的功能,职责单一。微服务中最常用的有Spring Boot和Spring Cloud,Spring Boot是独立运行的单体项目,而Spring Cloud是微服务聚合项目,包含了微服务所需的组件。
2.2 Spring Cloud
Spring Cloud项目是由多个独立项目集合而成的,每个项目都是独立的,但是Spring Cloud本身并不能独立运行,需要集成到Spring Boot中实现相应的功能。Spring Cloud中的项目各自进行迭代和版本发布,因此Spring Cloud使用版本名称进行版本管理,而不是通过版本号,避免Spring Cloud的版本号与子项目版本号发生冲突。Spring Cloud以英国伦敦地铁站名命名,以字母排序,最初的项目发行版本为Angel,每当Spring Cloud解决严重Bug或更新较多功能时,会发布一个Service Release版本,简称SR,版本号即该大版本下的第一次发布。
2.2.1Spring Cloud与Spring Boot
Spring Cloud提供的工具可以帮助开发者在分布式系统中快速构建一些通用功能,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举和分布式会话等,开发人员可以使用Spring Cloud在分布式系统中快速启动相同模式的服务和应用,在各自的分布环境中独立运行,包括开发者的计算机设备、裸机数据中心和云计算等托管平台,Spring Cloud专注于提供更好的开箱即用的服务。
Spring Cloud是微服务的核心组件之一,为微服务的正常运行提供了重要支持,Spring Cloud是多个独立项目的集合,并且有自己的版本管理机制,当SpringBoot单体服务构建微服务时,需要对应版本的Spring Cloud支持,否则会因为版本不兼容无法启动应用。
Spring Cloud是多个项目的组合项目,主要的项目有23个
2.2.2Spring Cloud五大组件
分别为注册中心、客户端负载均衡器、断路器、网关和配置中心。
1.注册中心
注册中心在微服务体系中提供单体服务的注册与发现,注册即单体服务将服务信息(如IP地址)存储到注册中心,注册中心生成该服务的唯一实例;发现即向注册中心注册的服务之间可以相互寻址并进行通信。
2.客户端负载均衡器
客户端负载均衡器是客户端之间调用的负载均衡器,Spring Cloud Ribbon是基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现,通过Spring Cloud封装在Eureka注册中心组件中,可以轻松地将服务的REST模版请求自动转换成客户端负载均衡的服务调用。
3.断路器
断路器保护系统,控制故障范围,保证服务高可用。断路器用于解决服务的“雪崩”效应,所谓服务“雪崩”效应,即微服务体系中某个单体服务出现问题无法正常响应时,调用这个服务会出现线程阻塞,若此时有大量的请求进入该故障的服务,Servlet容器中的线程耗尽时,导致服务瘫痪,故障会在微服务相互依赖的单体服务中传播,最终导致整个微服务系统瘫痪。
当服务A不可用,且不可用次数达到阈值(Hystrix为5s 20次)时断路器生效,此时请求服务A会通过fallback方法直接返回一个固定值,避免故障“感染”,切断故障点。
4.网关
服务网关(Zuul)通过反向代理统一管理微服务中所有的服务接口,实现微服务体系中所有服务的接口均通过网关进行转发,即所有的请求向网关发起,然后由网关将请求进行转发。
5.配置中心
Spring Cloud Config是解决分布式系统配置的方案,包含客户端和服务端两部分,服务端提供配置文件的存储服务,以接口的形式提供配置参数,客户端通过接口获取配置数据初始化项目。