当垂直应用越来越多,应用与应用之间的交互不可避免,这时需要将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务,使前端应用能更快速的响应多变的市场需求。
优点:
每个服务足够内聚,足够小,代码容易理解、开发效率提高。
微服务能够被小团队单独开发。
微服务是松耦合的,是有功能意义的服务,无论在开发阶段或部署阶段都是独立的;
每个服务可以各自进行扩展,而且,每个服务可以根据自己的需要部署到合适的硬件服务器上。
容错性提高,一个服务的内存泄露并不会让整个系统瘫痪。
微服务能使用不同的语言开发,并且系统不会被长期限制在某个技术栈上。
缺点:
微服务把原有的项目拆成多个独立工程,增加了开发和测试的复杂度。
微服务架构需要保证不同服务之间的数据一致性,引入了分布式事务和异步补偿机制,为设计和开
发带来一定挑战。
当服务数量增加,管理复杂性增加。
微服务虽然带来了架构上的优势,但同时也引入了复杂性,我们需要使用一些组件来解决技术复杂性提
高之后带来的问题:
1、服务注册中心:每个服务实例在启动时,需要想注册中心注册自己的IP地址等信息。服务在调用别的服务接口时,就可以通过注册中心,查询到其他服务的实例,向实例发起请求。
2、负载均衡:由于服务可以有多个实例,所以不管是来自外部客户端的请求,还是微服务系统内部服务之间发起的请求,都需要引入负载均衡的机制,来发挥多实例集群的作用。负载均衡有两种:服务器端负载均衡和客户端负载均衡,各自具有代表性意义的实现分别是Nginx和Ribbon。
3、服务网关:服务网关是服务调用的唯一入口,可以在这个组件是实现用户鉴权、动态路由、灰度发布、A/B测试、负载限流等功能。根据公司流量规模的大小网关可以是一个,也可以是多个。
4、配置中心:将本地化的配置信息(Properties、XML、YAML等)注册到配置中心,实现程序包在开发、
测试、生产环境的无差别性,方便程序包的迁移。配置部分可以单独使用高可用的分布式配置中心,确保一个配置服务出现问题时,其他服务也能够提供配置服务。
5、API 管理:以方便的形式编写及更新API文档,并以方便的形式供调用者查看和测试。通常需要加入版本控制的概念,以确保服务的不同版本在升级过程中都能够提供服务。
6、集成框架:微服务组件都以职责单一的程序包对外提供服务,集成框架以配置的形式将所有微服务组件集成到统一的界面框架下,让用户能够在统一的界面中使用系统。
7、分布式事务:对于重要的业务,需要通过分布式事务技术(TCC、高可用消息服务)保证数据的一致性。根据业务的不同,适当地牺牲一些数据的一致性要求,确保数据的最终一致性。
8、调用链:记录完成一个业务逻辑时调用到的微服务,并将这种串行或并行的调用关系展示出来。在系统出错时,可以方便地找到出错点。同时统计各个服务的调用次数,确保比较热的服务能够被分配更多的资源。
9、支撑平台:系统微服务化后,系统变得更加碎片化,系统的部署、运维、监控等都比单体架构更加复杂,那么就需要将大部分的工作自动化。这时,需要合适的支撑平台或工具来中和这些微服务架构带来的弊端。
Spring Cloud 由 Spring 官方开发维护,基于 Spring Boot 开发,提供了一整套完整的微服务解决方案。Spring Cloud 的技术选型是中立的,目前大多数的组件都来源于 Netflix 公司的开源产品,包括服务中心 Eureka ,服务网关 Zuul 、负载均衡组件 Ribbon 等等。并且这些组件都可以随需扩展和替换。
在早些年,国内互联网公司盛行采用阿里巴巴公司在 Github 开源的 Dubbo 组件来架构系统应用。但是,Dubbo 在未来的定位并不是要成为一个微服务的整体解决方案,而是专注于 RPC 领域,成为微服务一个重要的组件。以致于微服务衍生出的服务治理的需求,阿里巴巴再次启动开源项目予以支持,比如最近宣布开源的 Spring Cloud Alibaba ,其中 Dubbo 可以做为组件使用 Nacos 作为服务中心整合进入 Spring Cloud 的生态。
从技术选型的角度上来讲,两相比较, Dubbo 和 Spring Cloud ,如果只是图方便和快捷,完全可以使用 Spring Cloud 全家桶来构建微服务,但是, Spring Cloud 服务之间的调用是通过 RESTful 来进行通信,这种调用协议从效率上讲是比较低下的,当然, Dubbo 服务之间的调用是通过 RPC 来进行的,相比较 RESTful 这种形式,性能肯定会超出很多,但是 Dubbo 的生态却又有些令人担心,如果其余的技术栈都需要重新选型,那么无疑将耗费大量的人力。不过无需担心,前段时间刚刚从 Apache 毕业的Spring Cloud Alibaba 开源项目已经为我们完美的解决了这个问题,其中的一个组件 Dubbo SpringCloud 就是为了使 Dubbo 无缝接入 Spring Cloud 。
中间件:是一类能够为一种或多种应用程序合作互通、资源共享提,同时还能够为该应用程序提供相关的服务的软件
中间件是一类软件的总称,不是单独的一个软件。是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。
也就是说,关于中间件,我们可以理解为:是一类能够为一种或多种应用程序合作互通、资源共享提,同时还能够为该应用程序提供相关的服务的软件。中间件的本质可以归为技术架构,常见的中间件有服务治理中间件、配置中心、全链路监控、分布式事务、分布是定时任务、消息中间件、API网关、分布式缓存、数据库中间体等。
Spring Cloud从字面理解,就是致力于分布式系统、云服务的框架。Spring Cloud是整个Spring家族中新的成员,是最近云服务火爆的必然产物。
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,领导选举,分布式会话,集群状态)。使用Spring Cloud开发人员可以快速站起来实现这些模式的服务和应用程序。它们适用于任何分布式环境,包括开发人员自己的笔记本电脑,裸机数据中心和Cloud Foundry等托管平台。
1.Eureka
作用:云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
简介:Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。有两个组件构成:Eureka服务端和Eureka客户端。Eureka服务端用作服务注册中心,支持集群部署;Eureka客户端是一个java客户端,用来处理服务注册与发现。 在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。
2.Feign
作用:使得编写java http客户端变得更容易。
简介:Feign是Netflix开发的声明式、模板化的HTTP客户端,在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求。
3.Ribbon
作用:提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。
简介:Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。
4.Hystrix
作用:熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。
简介:为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
5.Zuul
作用:Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。
简介:为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。
6.Spring Cloud Sleuth
作用:日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。
7.Spring Cloud Config
作用:配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。
简介:SpringCloud Config提供服务器端和客户端。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。这个还是静态的,得配合SpringCloud Bus实现动态的配置更新。
8.Spring Cloud Gateway
作用:Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等用。
简介:Spring Cloud Gateway 作为 Spring Cloud 生态系中的网关,旨在为微服务架构提供一种简单而有效的统一的 API 路由管理方式,统一访问接口,基于 Filter 链的方式提供了网关基本的功能。
目标1:了解智慧餐饮需求设计&系统架构设计
目标2:了解Spring Cloud Alibaba整体技术栈组成
目标3:掌握nacos对于注册中心&配置中心的使用
目标4:了解Lombok的使用
目标5:掌握Mybatis-plus的使用
目标6:掌握Spring Cloud Alibaba与dubbo和Mybatis-plus整合
目标7:掌握swagger的使用
目标8:掌握统一异常处理
近年,不断地有企业提出中台的概念。很多的大型公司由于公司项目的不断发展,造成项目已经非常庞
大,导致系统越来越不可维护,开发与改造的难度大且效率低,也有很多新业务不得不重复造轮子。
中台的出现就是为了解决上述问题。所谓的业务中台就是:通过制定标准和机制,把不确定的业务规则和流程通过工业化和市场化的手段确定下来,以减少人与人之间的沟通成本,同时还能最大程度地提升协作效率。
中台的目标:减少沟通成本,提升协作效率。 中台的实现手段:制定标准和规范。 原则:集中管控,分布式执行。
Spring Cloud Alibaba 项目是阿里巴巴基于 Spring Cloud结合自身微服务实践开源的微服务全家桶框架。
Spring Cloud Alibaba 于 2018年7月 在 Spring Cloud 孵化器仓库提交第一次代码,到 2019年8月 ,Spring Cloud Alibaba 完成了从 Spring Cloud 中默默无闻的项目到 Spring Cloud 最火项目的蜕变,并且已经毕业,成为Apache的顶级项目!
github地址
Spring Cloud Alibaba GitHub
1、Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
2、Nacos:(注册中心)一个更易于构件云原生应用的动态服务发现、配置管理和服务管理平台。3、RabbitMQ(重量级)、RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
4、Dubbo:Apache Dubbo是一款高性能Java RPC框架。
4.1 RPC组件:(进程间通信方式)能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景。
5、Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
6、Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。
7、Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海
量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类
型的数据。
8、Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可
靠、高可用的定时(基于 Cron 表达式)任务调度服务。
9、Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
、、
注意:分布式任务调度SchedulerX,RocketMQ一些高级功能,需要额外购买相关商业版本,开源版本会存在功能阉割,所以我们系统会用其他方案开源替换,例如分布式调度用xxl-job,消息中间用rabbitmq。
其他博客Nacos详细介绍,查看请点击这里
什么是nacos?
Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。
官方介绍是这样的:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
RPC介绍与原理,点击跳转
RPC(Remote Procedure Call)是一种进程间通信方式。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景。说起 RPC 大家并不陌生,业界有很多开源的优秀 RPC 框架,例如 Dubbo、Thrift、gRPC、Hprose 等等。
1、简单的来说一个RPC 框架包含4个组件
1 客户端:服务的调用者
2 客户端存根:存放服务端地址信息,将客户端的请求参数打包成网络信息,再通过网络发送给服务方法
3 服务端存根:接受客户端发过来的消息并解包,再调用本地服务
4 服务端:服务提供者
{客户端发送服务器端的信息,必须实现序列化接口}
2、RPC 调用
服务调用方(Client),以本地调用方式调用服务;
客户端存根接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(在Java中就是序
列化的过程)
客户端存根找到服务器地址,并将消息通过网络发送到服务器端
服务器端存根接收到消息以后,进行解包,在java中就是反序列化的过程
服务器端存根根据解码的结果调用本地服务
本地服务执行处理逻辑
本地服务最终将结果返回给服务器端存根
服务端存根将结果打包成消息,java里的序列化
服务端负责将打包的消息通过网络发送至客户端
客户端存根接收消息,并进行解码,java里面的反序列化
客户端得到最终的结果
Apache Dubbo是一款高性能的Java RPC框架,其前身是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架,可以和spring框架无缝集成。
Dubbo官网:https://dubbo.apache.org
Dubbo提供了三大核心能力:
1、面向接口的远程方法调用。
2、智能容错和负载均衡。
3、服务自动注册和发现。
调用关系说明:
1、什么是网关:
网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能
>API Gateway,是系统的唯一对外入口,介于客户端和服务器端之间的中间层,
处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。>统一接入1.智能路由2.负载均衡,容灾处理3.日志记录>流量监控1.限流处理2.服务降级>安全防护1.鉴权处理2.监控3.及其网络隔离
2、主流网关
>zuul:是奈非开源的微服务网关,和Eureka、Hysitr等组件配合使用、依赖组件较多,性能较差,现在闭源
>kong:基于Nginx得到API Gatewey
>Nginx+lua:是一个高性能的HTTP和反向代理服务器,lua是脚本语言,让Nginx执行lua脚本,并且高并发,非阻塞的处理各种请求。
>springcloud gateweg:spring公司专门开发的网关,代替zuul
注意:AlibabaSpringCloud全家桶没有对应的网关组件,我们就用SproingCloud官方推荐的gatewey。
1 消息队列概述
1.1 消息队列MQ
MQ全称为:Message Queue,消息队列是应用程序和应用程序之间的通信方法。
为什么使用MQ?
在项目中,可将一些无需及时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大节省了服务器的请求响应时间,从而提高了服务器的吞吐量。
开发中消息队列通常有如下应用场景:
1、任务异步处理:将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理,提高了应用程序的响应时间。
2、应用程序解耦合:MQ相当于一个中介,生成方通过MQ与消费方交互,它将应用程序进行解耦合。
1.2 AMQP和JMS
MQ是消息通信的模型:实现MQ大致有两种主流方式:AMQP和JMS
1.2.1 AMQP
AMQP高级消息队列协议,是一个进程间传递异步消息的网络协议,更准确的说是一种链接协议,这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。
1.2.2 JMS
JMS即Java Message Service Java消息服务应用程序接口,是一个Java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
1.2.3 AMQP与JMS区别
JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式。
JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
JMS规定了两种消息模式;而AMQP的消息模式更加丰富
JMS两种消息模式:订阅模式、点对点消息模式。
1.3 消息队列产品
市场上常见的消息队列如下:
目前市场上成熟主流的MQ有:Kafka、RocketMQ、RabbitMQ;
1.4 RabbitMQ
RabbitMQ是由erlang语言开发,基于AMQP协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
RabbitMQ官方地址:https://www.rabbitmq.com/
RabbitMQ提供了6中模式:简单模式、work模式、Publish/Subscible发布与订阅模式、Routing路由模式、Topics主题模式、PRC远程调用模式(不太算MQ)
docker用于部署系统 解决环境问题的这么一个容器技术。
Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。