一、什么是SOA

SOA即面向服务的架构。分为三层结构:表示层(服务层)、中间业务逻辑层、数据访问层。

SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA可以看作是B/S模型、XML标准通用标记语言的子集)/Web Service技术之后的自然延伸。

它提供了构建系统的标准和方法,可以通过建立组合、复用等服务方法减少业务冗余并通过服务协同合作来加快项目开发的速度。

我们通过网络上的几个小例子来解释一下SOA:

第一个:

假设我要做几道菜:

1.麻婆豆腐

2.素炒小青菜

3.西红柿炒蛋

以前我的做法:
我要做麻婆豆腐,先洗豆腐,然后找到豆瓣酱,把豆瓣酱炸出香味,然后我想到还需要辣椒,我就去切辣椒,切完辣椒放进去后,我发现还需要姜蒜,我去切了姜蒜,然后和烧好的豆瓣酱一起煎出香味,倒入豆腐翻两圈开始焖。
焖好麻婆豆腐之后,我要素炒小青菜。
我立即去洗小青菜,然后烧好油后发现还少了姜蒜,我就去切姜蒜,一阵手忙脚乱,小青菜炒好了。
如此重复进行炒西红柿炒蛋。

有了SOA之后:
先剁好一小碗姜末;再剁好一小碗蒜末;切好青菜,找好豆瓣酱,洗好豆腐,切好西红柿

然后,我想要什么服务,直接取。(这里来说是一个人的SOA)
后来,我为了想提高效率,叫其他人来一起帮忙准备这些材料,后面,有10个朋友来我家,要做的菜式更多了,然后我叫几个朋友一起帮忙准备各种材料。

这里面的思想还可以发散。

我想了一下,再补充一下

对于第一种情况,假设我每种菜要做10份,那么再叫来9个人和我一起重复上面的事情(多个服务器部署同一套系统)
而后面有了SOA,我每一个人就只关注自己的具体逻辑,比如切青菜的专门切青菜,洗青菜的专门洗青菜等等,对于厨师(用户),想要做一份西红柿炒蛋,那他就去拿西红柿和打好的蛋就好了,分工明确,各司其职。

第二个:

统一文字,在秦始皇统一六国之前,各国的文字是不统一的,据说许多常用的文字有十几种写法和读音,妨碍了各国之间的文化交流,就象SOA之前,各种软件平台、各种开发工具和各种接口的组件之间,没有统一的标准,对软件系统之间的整合造成巨大的困难。

因此,伟大的始皇帝统一了六国文字,“书同文、车同轨”就是通过标准解决“复用”和“互操作”等问题。这也为大规模的印刷和文明发展提供了一个良好的基础,这种“统一封装”的文字,对文化交流起到了一个“互操作”的标准作用

二、为什么需要SOA三层架构

SOA的实施具有几个鲜明的基本特征:
粗粒度的服务接口分级,松散耦合,可重用的服务,服务接口设计管理,标准化的服务接口,支持各种消息模式,精确定义的服务契约等。

SOA可以使每个模块独立出来,用什么取什么。即使模块出现问题,也可以用备份模块代替即可。不影响系统的整个运行。每个人的分工也非常明确,各司其职。

三、SOA案例分析

苏宁易购商品详情设计:

商品详情系统介绍

基本介绍

商品详情系统是一个展示商品基本信息、参数等详情的系统,是商品购买的入口。它是电商平台中访问量最大的系统之一,苏宁易购大促期间PV量和UV量很大,这么大的访问量对系统的并发能力要求高。在业务上它与周边系统的关系是高耦合。依赖商品详情系统的的系统特别多,比如:促销系统、推荐系统、大聚惠、等众多营销系统、还有主数据系统、购物车、收藏夹等,业务复杂度高对系统设计提出更多的要求。

业务特点

重点在于数据展示

页面信息丰富,如:商品详情、商家列表、推荐、排行榜等

部分数据时效要求高,如:价格、库存等

业务上依赖的系统多

商品详情系统三要素

1. 展示

产品上需要设计好页面区分展示的内容

技术上主要是页面缓存设计、前端页面模版和JAVA程序的解耦

2. 数据处理

数据全部来源于其它系统,在数据上分为:

基本数据,外部系统传过来直接就可以使用的数据

聚合数据,需要加工才能使用的数据

3. 服务依赖

通过MQ解耦,异构数据

解决好以上三个问题就解决了此系统核心问题。

系统逻辑架构

商品详情系统在设计上分成前、中、后三层结构

前台负责展示,做为VIEW层不处理业务逻辑,负责渲染。

中台负责业务逻辑处理,提供数据给前台,同时还会对外部系统提供服务

后台负责主数据管理,做为数据管理层处理商品主数据、参数、品牌、供应商等,同时部分内容开放给运营进行维护、管理和异常处理等。

前台设计

页面设计:

1. 动静分离

JavaScript、CSS统一放到公共的静态服务器上,完全独立的子域名,防止脏Cookie问题和动态域名中无用Cookie问题,通过文件版本号解决系统新版和旧版本之间冲突问题。

所有图片由独立的分布式图片系统管理,对原图进行不同规格的无损裁减和压缩。

2. 异步加载和懒加载

商品价格、营销活动信息、库存等动态数据通过异步加载

非首屏数据做懒加载处理,提高首屏加载时间,比如评价、商品详情等内容

3. 多级缓存策略

a. 浏览器本地缓存

协商缓存,对于某些时效要求较高的资源通过Last-modified控制数据。做到StatusCode=304

强缓存,JS、CSS等静态资源或者一些页面碎片伪静态数据通过Expires、Cache-Control(http1.1支持)设置做到强缓存,在不强制刷新的情况下可以做到200(from cache)

b. CDN缓存

CDN分两条线有自营CDN和合作商的CDN,图片、静态资源与伪静态数据分

别放在不到的CDN上

c. Varnish缓存

Varnish在设计上负载使用轮询方式,不使用URL HASH策略,用空间换时间的策略, 从而避免热数据问题,也支持横向扩展。

Varnish 缓存和CDN缓存在失效时间错开,从而避免同时失效回源压力过大。

d. 精准缓存

精准缓存失效用于促销活动准时展示的场景,基于Varnish缓存,通过精准控制缓存有效期实现缓存精准失效保证促销活动准时切换。

组件逻辑设计:

商品详情系统中的购买按钮和加入购物车会因商品不同走不同的流程。如:大聚惠商品、定金团商品、预售商品等因促销方式不同,走不同的业务处理流程。促销模式变化多端,可能每个月都会有变化,通常的面向接口编程和加上工厂方法或者依赖管理框架Spring也很难做到真正的解耦,虽然这样做已经符合开闭原则。我们通过观察者模式很好的解决了这个问题。让前端的页面模版和JAVA应用程序之间真正的解耦。

后台设计

商品数据统一处理设计

商品详情系统商品主数据通过MQ消息来源于外部系统,比如:商品基本信息、参数、参数模版、品牌、品类等。我们设计时把共性抽出来分成三部分:

接受MQ消息并持久化通过Listener

解析报文

业务处理上简化为add、update、delete三个动作

异常组件以观察者模式实现,记录处理失败的MQ消息并对消息进行截取,并供下次再反向执行(一条MQ消息中会有一到多条参数、品牌,所以这里用截取)

SOA架构及其架构分析的更多相关文章

  1. Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战

    Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...

  2. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

  3. SOA面向服务架构

    SOA面向服务架构 风尘浪子 只要肯努力,梦想总有一天会实现 随笔分类 - SOA面向服务架构 结合领域驱动设计的SOA分布式软件架构 摘要: 领域驱动设计DDD的总体结构,Repository层使用 ...

  4. 基于SOA的银行系统架构

    Part-1  [简述] 1.通过引入面向服务架构(SOA),企业服务总线(ESB),适配器(Adapter)及面向构件等技术,尝试打造一个统一业务流程服务平台,实现面向流程的服务集成. 2.传统银行 ...

  5. .Net微服务架构之运行日志分析系统

    一.引言 .Net技术栈目前还没有像spring cloud相对完整一整微服务架构栈,随着业务发展系统架构演进,自行构建.Net技术体系的微服务架构,配套相关核心组件.因平台基于微服务架构方式研发,每 ...

  6. SOA(面向服务架构)——踩坑后反思:这样值得吗?

    SOA(面向服务架构)——踩坑后反思:这样值得吗?

  7. react及flux架构范例Todomvc分析

    react及flux架构范例Todomvc分析 通过分析flux-todomvc源码,学习如何通过react构建web程序,了解编写react应用程序的一般步骤,同时掌握Flux的单向数据流动架构思想 ...

  8. Java之架构(0) - 架构之路

    软件架构作为一个概念,体现在技术和业务两个方面. 从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术和一些基本原则的基础之上. 先说一些基本原则: 分层原则:分层是为了降低 ...

  9. 看阿里P9架构师如何向你定义架构及架构师

    架构的定义 先来看看软件架构的普遍定义吧. 一个程序和计算系统软件体系结构是指系统的一个或多个结构.结构中包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 体系结构并非可运行软件.确切的说, ...

  10. 大型网站技术架构(四)--核心架构要素 开启mac上印象笔记的代码块 大型网站技术架构(三)--架构模式 JDK8 stream toMap() java.lang.IllegalStateException: Duplicate key异常解决(key重复)

    大型网站技术架构(四)--核心架构要素   作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载.此篇已收录至<大型网站技 ...

随机推荐

  1. activiti随笔记录

    核心组件介绍 关键对象 1.      Deployment:流程部署对象,部署一个流程时创建. 2.      ProcessDefinitions:流程定义,部署成功后自动创建. 3.       ...

  2. Egret入门学习日记 --- 第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容)

    第二篇 (书籍的选择 && 书籍目录 && 书中 3.3 节 内容) 既然选好了Egret,那我就要想想怎么学了. 开始第一步,先加个Q群先,这不,拿到了一本<E ...

  3. 实验仓 #779.【CSP2019模拟 Day 1】A题

    题目传送门 考场上面做了一个暴力的做法,然后,然后他$WA$了. emmm...($T$就算了吧,$WA$了算什么事啊) 好吧,这道题,其实好像...是一道思维题来着. 如果出现了这样两个打X的格子上 ...

  4. 简述Object(ActiveX)控件遮挡Dialog、select下拉框的解决办法

    1.背景 最近在做项目的过程中,我们使用了Object控件,但是同时在上面写了一个select下拉框,因此每次点击下拉框的时候我们会发现,下拉框的部分内容被Object控件给遮挡了,调查研究后发现,我 ...

  5. Redhat7 CentOS7安装阿里云的yum源

    先说CentOS的 1.备份 [root@harry ~]# cd /etc/yum.repos.d/ [root@harry yum.repos.d]# mkdir repo_bak [root@b ...

  6. CentOS7之ssh-Xshell密钥认证登陆

    操作系统版本:CentOS Linux release 7.2.1511 (Core)   SSH版本:OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 1.打开Xshell工 ...

  7. Axios 的基本使用

    Axios 是一个基于 promise 的HTTP 库, 可以用在浏览器和 node.js 中. 1. 从浏览器创建 XMLHttpRequests 2. 从node.js 创建 http 请求 3. ...

  8. java tomcate 启动后cmd 出现乱码

    今天windows 启动tomcat 后,出现cmd 乱码 尝试改cmd编码为UTF-8后无效,修改tomcat 注册表CodePage ,cmd 依然乱码, 后来把Conf 目录下的logging. ...

  9. mybatis映射文件mapper详解

    mapper.xml映射文件主要是用来编写sql语句的,以及一些结果集的映射关系的编写,还有就是缓存的一些配置等等. 1.<select>元素 <select>元素就是sql查 ...

  10. vue报错 Missing required prop: "value"-----(v-model 与 :model的区别)

    找不到value值 原因:这个错是因为自己绑定值得问题,将v-model 写成了:model . v-model: 是vue内置的双向数据绑定,父子组件的双向绑定,通常用于input数据的双向绑定,用 ...