1.是什么是架构?
1)是对业务场景抽象后的得出的支持骨架
2)机构为业务场景所剩,为业务场景所弃
3)架构没有最好,只有最合适。一般考虑人员技术研发能力、业务复杂度、数据规模大小、时间成本、运维能力。
4)最合适的架构都是各方面折中的结果。
5)场景驱动架构增长
2.架构分类
1、单体架构 (All in One)
A、MVC架构
B、前后端分离架构
缺陷:
1)复杂性高:所以的模块在一个process内处理非常的庞大。整个项目包含的模块非常多、模块的边界模糊、 依赖关系不清晰、 代码质量参差不齐、混乱地堆砌在一起。可想而知整个项目非常复杂。 每次修改代码都心惊胆战,甚至添加一个简单的功能, 或者修改一个Bug都会带来隐含的缺陷。
2)技术债务: 随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务, 并且越积 越多。“ 不坏不修”, 这在软件开发中非常常见, 在单体应用中这种思想更甚。 已使用的系统设计或代码难以被修改,因为应用程序中的其他模块可能会以意料之外的方式使用它。
3)部署频率低: 随着代码的增多,构建和部署的时间也会增加。而在单体应用中, 每次功能的变更或缺陷的修复都会导致需要重新部署整个应用。全量部署的方式耗时长、 影响范围大、 风险高, 这使得单体应用项目上线部署的频率较低。 而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错率比较高。
4)可靠性差: 某个应用Bug,例如死循环、内存溢出等, 可能会导致整个应用的崩溃。
5)扩展能力受限: 单体应用只能作为一个整体进行扩展,无法根据业务模块的需要进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU; 有的模块则是IO密集型的,需要更大的内存。 由于这些模块部署在一起,不得不在硬件的选择上做出妥协。
垂直架构阶段
为了解决单体系架构的问题,我们怎么办?核心思想就是拆。将集中在一起的多个模块,按照功能单独进行拆开成一个一个独立的业务模块。各业务模块分别部署在不同的服务器上,各个业务模块之间通过接口进行数据交互。数据库也大量采用分布式数据库然后部署在不同的机器上。由于独立部署,前端进行访问的时候,不可避免遇到跨域问题,此时一般可以在前面添加nginx进行反向代理。
优点:该架构相对于单体架构来说,这种架构提供了负载均衡的能力,大大提高了系统负载能力,解决了网站高并发的需求。
1)降低了耦合度:把模块拆分,使用接口通信,降低模块之间的耦合度。
2)责任清晰:把项目拆分成若干个子项目,不同的团队负责不同的子项目。
3)扩展方便:增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
4)部署方便:可以灵活的进行分布式部署。
5)提高代码的复用性:比如service层,如果不采用分布式rest服务方式架构就会在
微服务架构
1)业务进行垂直拆分、功能的水平拆分
2)业务是什么?订单业务、商品业务、用户业务
3)功能是什么?数据访问层、业务逻辑层、对外接口网关层
特点:
1)服务层按业务拆分为一个一个的微服务。
2)微服务的职责单一。
3)微服务之间采用RESTful、RPC等轻量级协议传输。
4)有利于采用前后端分离架构。
优点:
1)服务拆分粒度更细,有利于资源重复利用,提高开发效率。
2)可以更加精准的制定每个服务的优化方案,按需伸缩。
3)适用于互联网时代,产品迭代周期更短。
缺点:
1)开发的复杂性增加,因为一个业务流程需要多个微服务通过网络交互来完成。
2)微服务过多,服务治理成本高,不利于系统维护。
3.架构高可用的手段
A、什么是高可用?
就是任何时候都提供正常的读写服务。微服务架构必须解决的三大问题:高可用、高并发、高流量问题。
B、架构高可用设计时的手段
1)设计无状态化 后台无状态
2)子系统冗余(集群) (就是一个挂掉,后面要跟上)
3)幂等性设计 (根据业务设计 就是点多次的操作算一次操作)
4)异步调用,避免一个服务失败导致整个服务失败(消息中间件) (要保证消息传递)
5)超时机制(熔断) (数据太大 我觉得机器受不了 就把它熔断掉)
6)分级管理
7)服务降级
4.高可用普适微服务架构
提示:注册网易云账号,阅读架构发展史
https://sq.163yun.com/blog/article/155776878871519232
其实我们可以看一个简化的版本,如下图:
5.Spring Cloud简介
Spring Cloud 是一个基于 SpringBoot实现的云应用开发工具,是分布式微服务架构的一站式解决方案,是多种微服务架构的集合体,我们通常称为微服务全家桶。它为开发中的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。
Spring cloud以2020年2月份为标志,分为2代。第1代是以美国的一个视频网站公司NetFlix提供的组件为主。第2代以中国的阿里巴巴提供的组件为主。
为什么要学习spring cloud alibaba微服务解决方案,而不是NetFlix公司的微服务解决方案,原因如下:
header 1 | Spring Cloud 第一代 | Spring Cloud 第二代 |
---|---|---|
网关 | Spring Cloud Zuul | Spring Cloud Gateway |
注册中心 | Eureka,Consul,ZooKeeper | 阿里 Nacos,拍拍贷 Radar 等可选 |
配置中心 | Spring Cloud Config | 阿里 Nacos,携程 Apollo,随行付 Config Keeper |
客户端负载均衡 | Ribbon | spring-cloud-commons的 Spring Cloud Load Balancer |
熔断器 | Hystrix | Resilience4J、阿里 Sentinel |
服务调用 | Netflix Feign | Open Feign |
基于社区的问题,最终Spring Cloud最终教学内容选型
6、Spring Cloud Alibaba简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
官网地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md
1)主要功能
A、服务限流降级
B、服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
C、分布式配置管理
D、消息驱动能力
E、分布式事务
F、阿里云对象存储
G、分布式任务调度
H、阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
2)组件介绍
A、Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
B、Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
C、RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
D、Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。
E、Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
F、Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。
G、Alibaba Cloud SchedulerX:
阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。
3)阿里spring cloud aliba的组件如下图所示。
7.高并发的解决思路
一、什么是高并发
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
1)响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
2)吞吐量:单位时间内处理的请求数量。
3)QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
4)并发用户数:同时承载正常使用系统功能的用户数量。例如一个即时通讯系统,同时在线量一定程度上代表了系统的并发用户数。
** 二、如何提升系统的并发能力**
互联网分布式架构设计,提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。
**A、垂直扩展:**提升单机处理能力。垂直扩展的方式又有两种:
(1)增强单机硬件性能,例如:增加CPU核数如32核,升级更好的网卡如万兆,升级更好的硬盘如SSD,扩充硬盘容量如2T,扩充系统内存如128G;
(2)提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间;
在互联网业务发展非常迅猛的早期,如果预算不是问题,强烈建议使用“增强单机硬件性能”的方式提升系统并发能力,因为这个阶段,公司的战略往往是发展业务抢时间,而“增强单机硬件性能”往往是最快的方法。
不管是提升单机硬件性能,还是提升单机架构性能,都有一个致命的不足:单机性能总是有极限的。所以互联网分布式架构设计高并发终极解决方案还是水平扩展。
**B、水平扩展:**只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,以及互联网公司架构各层常见的水平扩展实践,是本文重点讨论的内容。
三、常见的互联网分层架构
常见互联网分布式架构如上,分为:
(1)客户端层:典型调用方是浏览器browser或者手机应用APP
(2)反向代理层:系统入口,反向代理
(3)站点应用层:实现核心应用逻辑,返回html或者json
(4)服务层:如果实现了服务化,就有这一层
(5)数据-缓存层:缓存加速访问存储
(6)数据-数据库层:数据库固化数据存储
整个系统各层次的水平扩展,又分别是如何实施的呢?
四、分层水平扩展架构实践
1)反向代理层的水平扩展
反向代理层的水平扩展,是通过“DNS轮询”实现的:dns-server对于一个域名配置了多个解析ip,每次DNS解析请求来访问dns-server,会轮询返回这些ip。
当nginx成为瓶颈的时候,只要增加服务器数量,新增nginx服务的部署,增加一个外网ip,就能扩展反向代理层的性能,做到理论上的无限高并发。
2)站点层的水平扩展
站点层的水平扩展,是通过“nginx”实现的。通过修改nginx.conf,可以设置多个web后端。
当web后端成为瓶颈的时候,只要增加服务器数量,新增web服务的部署,在nginx配置中配置上新的web后端,就能扩展站点层的性能,做到理论上的无限高并发。
3)服务层的水平扩展
服务层的水平扩展,是通过“服务连接池”实现的。
站点层通过RPC-client调用下游的服务层RPC-server时,RPC-client中的连接池会建立与下游服务多个连接,当服务成为瓶颈的时候,只要增加服务器数量,新增服务部署,在RPC-client处建立新的下游服务连接,就能扩展服务层性能,做到理论上的无限高并发。如果需要优雅的进行服务层自动扩容,这里可能需要配置中心里服务自动发现功能的支持。
4)数据层的水平扩展
在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,以达到扩充系统性能的目的。
互联网数据层常见的水平拆分方式有这么几种,以数据库为例:
A、按照范围水平拆分
每一个数据服务,存储一定范围的数据,上图为例:
user0库,存储uid范围1-1kw
user1库,存储uid范围1kw-2kw
这个方案的好处是:
(1)规则简单,service只需判断一下uid范围就能路由到对应的存储服务;
(2)数据均衡性较好;
(3)比较容易扩展,可以随时加一个uid[2kw,3kw]的数据服务;
不足是:
(1) 请求的负载不一定均衡,一般来说,新注册的用户会比老用户更活跃,大range的服务请求压力会更大;
B、按照哈希水平拆分
每一个数据库,存储某个key值hash后的部分数据,上图为例:
user0库,存储偶数uid数据
user1库,存储奇数uid数据
这个方案的好处是:
(1)规则简单,service只需对uid进行hash能路由到对应的存储服务;
(2)数据均衡性较好;
(3)请求均匀性较好;
不足是:
(1)不容易扩展,扩展一个数据服务,hash方法改变时候,可能需要进行数据迁移;
这里需要注意的是,通过水平拆分来扩充系统性能,与主从同步读写分离来扩充数据库性能的方式有本质的不同。
通过水平拆分扩展数据库性能:
(1)每个服务器上存储的数据量是总量的1/n,所以单机的性能也会有提升
;
(2)n个服务器上的数据没有交集,那个服务器上数据的并集是数据的全集;
(3)数据水平拆分到了n个服务器上,理论上读性能扩充了n倍,写性能也扩充了n倍(其实远不止n倍,因为单机的数据量变为了原来的1/n);
通过主从同步读写分离扩展数据库性能:
(1)每个服务器上存储的数据量是和总量相同;
(2)n个服务器上的数据都一样,都是全集;
(3)理论上读性能扩充了n倍,写仍然是单点,写性能不变;
缓存层的水平拆分和数据库层的水平拆分类似,也是以范围拆分和哈希拆分的方式居多,就不再展开。
五、高并发问题小结
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
提高系统并发能力的方式,方法论上主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。前者垂直扩展可以通过提升单机硬件性能,或者提升单机架构性能,来提高并发性,但单机性能总是有极限的,互联网分布式架构设计高并发终极解决方案还是后者:水平扩展。
互联网分层架构中,各层次水平扩展的实践又有所不同:
(1)反向代理层可以通过“DNS轮询”的方式来进行水平扩展;
(2)站点层可以通过nginx来进行水平扩展;
(3)服务层可以通过服务连接池来进行水平扩展;
(4)数据库可以按照数据范围,或者数据哈希的方式来进行水平扩展;
各层实施水平扩展后,能够通过增加服务器数量的方式来提升系统的性能,做到理论上的性能无限.
8、Spring Boot和Spring Cloud的版本适配
A、检查方法
https://start.spring.io/actuator/info
B、最终选择
1)Spring cloud选择Hoxton.SR3
2)Spring boot 2.2.7 release
3)Spring cloud alibaba 2.2.0 release
4)mybatis 2.1.2以上版本