转:微服务设计、拆分原则

转自: https://www.cnblogs.com/guanghe/p/10978349.html

 

一、AKF拆分原则

  业界对于可扩展系统架构设计有一个朴素的理念:通过加机器就可以解决容量和可用性问题。

  这一理念在云计算概念疯狂流行的今天,得到了广泛的认可,对于一个规模迅速增长的系统而言,容量和性能问题当然是首当其冲的。但随着时间的向前,系统规模的增长,除了面对性能与容量的问题外,还要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务的问题。

  然而许多系统在架构设计时为充分考虑这些问题,导致系统重构成为常态,而影响业务交付能力,还浪费人力财力。对此《可扩展艺术》一书提出了一个系统可扩展模型--AKF可扩展立方(Scalability Cube)。

1,Y轴(功能)关注应用中功能划分,基于不同的业务拆分

  Y轴扩展会将庞大的整体应用拆分为多个服务,每个服务实现一组相关的功能,如订单管理、客户管理等。在工程上常见的方案是服务化架构(SOA),比如对于一个电子商务平台,我们可以拆分成不同的服务,组成类似下面的架构:

  但通过上图可以发现,当服务数量增多时,服务调用关系变得复杂,为系统添加一个新功能,要调用的服务数变得不可控,由此引发了服务管理上的混乱,所以一般情况下,需要采用服务注册的机制形成服务网关来进行服务治理

2,X轴(水平扩展)关注水平扩展,也就是“加速器解决问题”

  X轴扩展与我们前面朴素理念是一致的,通过绝对平等的复制服务与数据,以解决容量与可用性的问题,其实就是将微服务运行多个实例,做集群加负载均衡的模式。

  为了提升单个服务的可用性与容量,对每一个服务进行X轴扩展划分。

3,Z轴(数据分区)关注服务与数据的优先级划分,如按地域划分

  Z轴扩展通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统相互隔离但又是完整的。以生产汽车的工厂来举例:福特公司为了发展在中国的业务,或者利用中国的廉价劳动力,在中国建立一个完整的子工厂,与美国工厂一样,负责完整的汽车生产。这就是一种Z 轴扩展。

工程领域常见的Z轴扩展有以下两种方案

1,单元化架构

  在分布式服务设计领域,一个单元Cell就是满足某个分区所有业务操作的自包含闭环。如上面我们说到的Y轴扩展的SOA架构。客户端对服务端节点的选择一般是随机的,但是,如果在此上加Z轴扩展,那服务节点的选择将不再是随机的,而是每个单元自成一体。

2,数据分区

  为了性能数据安全上的考虑,我们将一个完整的数据集按一定维度划分出不同的子集。一个分区(Shard),就是整体数据集的一个子集。比如用尾号来划分用户,那同样尾号的那部分用户就可以认为是同一个分区,数据分区一般包括以下几种数据划分形式:

  数据类型:如业务类型

  数据范围:如时间段、用户ID

  数据热度:如用户活跃度、商品热度

  按读写分:如商品描述、商品库存

二、前后端分离原则

  何为前后端分离?前后端本来不就是分离的吗?这要从jsp开始讲起。分工精细化从来都是蛋糕做大的原则,多个领域工程师最好在不需要接触其他领域知识的情况下合作,才能使效率越来越高,维护也会变得简单。jsp的模板技术融合了html和java代码,使得传统MVC开发中的前后端如胶似漆,前端做好页面,后端转成模板,发现问题再找前端,前端又看不懂java代码,前后端分离的目的就是打破这尴尬的局面,我们需要的是一个全能的团队,而不是一个个全能的人。

  前后端分离原则,简单的将就是前端和后端的代码分离,我们推荐的模式是最好采用物理分离的方式部署,进一步促使更彻底的分离。如果继续使用服务端模板技术,如jsp,把java、js、css、html都堆到一个页面里,稍微复杂一点的页面就无法维护了。

这种前后端分离有几个好处:

1,前后端技术分离,可以由各自的专家来对各自的领域进行优化,这样前端的用户体验会更好。

2,分离模式下,前后端交互界面更清晰,就剩下接口模型,后端接口简介明了,更易于维护。

3,前端多渠道继承场景更容易实现,后端服务无需变更,采用统一的数据和模型,可以支持多个前端,例如:微信h5前端、PC前端、安卓前端、IOS前端。

三、无状态服务

  对于无状态服务,首先说一下什么是状态:如果一个数据需要被多个服务共享,才能完成一笔交易,那么这个数据被称为状态。进而依赖这个状态的服务被称为有状态的服务,反之成为无状态服务。

  这个无状态服务原则并不是说在微服务架构里不允许存在状态,表达的真实意思就是要把有状态的业务服务改变为无状态的计算类服务,那么状态数据也就相应的迁移到对应的“有状态数据服务”中。

  场景说明:例如我们从前在本地内存中建立的数据缓存、Session缓存,到现在微服务架构中就应该把数据迁移到分布式缓存中存储,让业务服务变成一个无状态的计算节点。迁移后,就可以做到按需动态伸缩,微服务应用在运行时动态增删节点,就不再需要考虑缓存数据如何同步的问题。

四、RestFul通讯风格

  这里介绍一个“无状态通讯原则”-Restful通讯风格,它有许多优点:

1,无状态协议HTTP,具备先天优势,扩展能力强,例如安全加密有成熟的https。

2,JSON报文序列化,轻量简单,人与机均可读,学习成本低,搜索引擎友好。

3,语言无关,各大热门语言都提供成熟的Restful API框架,相对一些其他RPC框架生态更加完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画:什么是中间人攻击

转载自 漫画:什么是中间人攻击故事发生在上世纪40年代......在解放战争初期,东北牡丹江一带,奶头山有一个土匪副官叫栾平。他计划将包含重要信息的先遣图,献给威虎山的土匪头子座山雕。而后栾平被共军抓获,侦查员杨子荣…

微信小程序的setData

1.setData()中修改为bool类型不要加" " 例:setData({"a":false}) 2.修改以变量作为索引值的数组时的语法为 this.setData({ [ judge[${current}] ]: true })

转:AKF 扩展立方体

转: https://www.cnblogs.com/fengyc/p/12286726.html AKF 扩展立方体(AKF Scale Cube)是一个描述从单体应用到可扩展架构的模型,见 (https://akfpartners.com/growth-blog/scale-cube)[https://akfpartners.com/growth-blog/scal…

漫画:三分钟了解敏捷开发

转载自 漫画:三分钟了解敏捷开发 什么是敏捷开发? 敏捷开发(Agile)是一种以人为核心、迭代、循序渐进的开发方法。 在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试&#xff0c…

微信小程序数组的坑

定义和用法 splice() 方法用于添加或删除数组中的元素。 注意:这种方法会改变原始数组。 返回值 如果仅删除一个元素,则返回一个元素的数组。 如果未删除任何元素,则返回空数组。 主要:array.splice(index,howmany&#xff09…

转: 理解RESTful架构

转自: http://www.ruanyifeng.com/blog/2011/09/restful.html 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式&a…

Git 12 岁了,送给你 12 个 Git 使用技巧

转载自 Git 12 岁了,送给你 12 个 Git 使用技巧Git,一个分布式版本控制系统,它已经成为了开源世界的源码控制默认工具,在4月7号12岁了。但是使用Git中更另人沮丧的是,你需要了解多少才能让你更有效的使用它。同时这也是…

转:Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比

转自: https://blog.csdn.net/yunfeng482/article/details/72856762 前言 在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。 概念 MQ简…

微信小程序定时器setInterval()的使用注意事项

setInterval(function(){}, number 时间间隔/ms) 注意在setInterval中定义的函数中使用 this 指向的是该计时器,若要用到页面数据应如下操作: let thatthis setInterval(function(){ that.data.a0; },number 时间间隔/ms) …

图解分布式架构的演进

转载自 图解分布式架构的演进一、什么是分布式架构分布式系统(distributed system) 是建立在网络之上的软件系统。内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性:是指每一个数据库分布节点…

转:微服务架构:BFF和网关是如何演化出来的?(这篇文章相当棒)

转自: https://juejin.im/entry/6844903806208049159 这篇文章写得非常棒,从服务,到bff, 到gateway 的一步步演化,描述的非常清晰易懂。 1、介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概…

微信小程序的坑

<input>组件后台接受到的是字符串类型&#xff0c;若要用数字类型应用Number()进行转化 微信小程序中许多API会是页面的 this 转向应注意用 let that this 来获取页面的指针&#xff01;

实现滚到div时淡入效果

首先实现淡入的动画 CSS代码如下&#xff1a; keyframes float { from { position: relative; margin-top:200px; opacity: 0; } to { position: relative; margin-top: 50px; opacity: 1; } } 接下来用JS判断当前滚动的位置并加入…

高级 Java 面试通关知识点整理

转载自 高级 Java 面试通关知识点整理1、常用设计模式单例模式&#xff1a;懒汉式、饿汉式、双重校验锁、静态加载&#xff0c;内部类加载、枚举类加载。保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。代理模式&#xff1a;动态代理和静态代理&#xff0c;…

windows查找端口占用并杀死端口进程

tasklist 查看进程netstat -ano|findstr "8080" 查找端口 8080 占用信息&#xff1b; tasklist|findstr 7176 查找进程id为 7176的进程信息&#xff1b; taskkill /F /PID 7176 杀死进程7176

Angular项目打包到nginx部署过程

Angular项目打包到nginx部署过程 一. 打包Angluar ng build,会在项目文件夹下生成dist文件&#xff0c;里面是打包后的文件 二. 部署nginx 在nginx官网中下载nginx 把dist文件夹下的打包文件拷贝到nginx/html下并重命名为myProj 修改conf/nginx.conf文件 location / {root…

SpringMVC表单验证器的使用

转载自 SpringMVC表单验证器的使用本章讲解SpringMVC中怎么通过注解对表单参数进行验证。 SpringBoot配置 使用springboot&#xff0c; spring-boot-starter-web会自动引入 hiberante-validator, validation-api依赖。 在 WebMvcConfigurerAdapter实现类里面添加验证器及国际化…

转-Kafka【第一篇】Kafka集群搭建

转自&#xff1a; https://www.cnblogs.com/luotianshuai/p/5206662.html Kafka【第一篇】Kafka集群搭建 Kafka初识 1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候&#xff0c;是否会遇到这样的一些问题&#xff1a; 我们想分析下用户行为&#xf…

Angular 应用解决跨域访问的问题

设置反向代理 原理是设置反向代理服务器&#xff0c;让 Angular 应用都访问自己的服务器中的API&#xff0c;而这类API都会被反向代理服务器转发到 Java 服务API中&#xff0c;而这个过程对于 Angular 应用是无感知的。 业界经常是采用 NGINX 服务来承担反向代理的职责。而在 …

57张PPT彻底搞清楚区块链技术。。

转载自 57张PPT彻底搞清楚区块链技术。。