《大型分布式网站架构》学习笔记--01SOA
"学无长幼,达者为先",作者陈康贤通过3年左右时间就能写出如此著作确实令人钦佩,加油,熊二,早日成为一个合格的后端程序员。
基础概念
SOA(Service-Oriented Architecture):由于互联网场景下,应用越来越复杂,系统经历了三个阶段的变化单一应用架构->垂直应用架构->分布式应用架构
单一应用架构到垂直应用架构:通过业务划分,将流量分散到不同的子系统,但子系统见可能存在重叠业务,需要重复造轮子,且容易形成信息孤岛。
垂直应用架构到分布式应用架构:通过基于HTTP协议的RPC风格服务可以很好的解决应用间通信的问题。
服务风格:RPC(Remote Process Call)远程过程调用,通过方法名区分服务;Restful风格,通过GET,POST等Http请求方法区分服务。
协议基础:主要是TCP协议和Http协议,前者特点是由于处于网络协议的第四层,因此报文较小,网络开销小,性能高,但实现的代价高,不利于跨平台;而后者基于网络协议的第7层,可以支持JSON&XML格式数据传输,利于跨平台(不同终端)。
序列化形式:常见的包括Java内置序列化、(google)Protocal Buffers,Hessian, XML, Json等。此外,网上Json序列化性能比较非常多,最简明的请见FastJson、Gson和Jackson性能比较,结论推荐Jackson。
服务路由和负载均衡:在SOA架构中,服务消费者需要通过服务名称,第一步需要通过路由在众多服务中获取到可供调用的服务列表,第二步通过负载均衡算法在所选服务的集群地址列表中选择一台服务器用于服务调用。接下来通过一张dubbo的架构图来加深理解。

Tip:
传统的负载均衡还包括基于硬件的F5,基于软件的LVS和Nginx。
负载均衡算法:包括[加权]轮询(Round Robin)法、[加权]随机(Random)法、源地址Hash法、最小连接数(Least Connections)法等,还可以动态的设置规则,比如动态解析存放在ZooKeeper中的规则文件。需要注意的是,轮询由于涉及到使用锁,因此效率上有一些问题,接下来通过一段随机轮询法的代码加深理解。
public static void main(String[] args) throws Exception {
List<ServerInfo> list = Lists.newArrayList();
list.add(new ServerInfo("127.0.0.1", 1));
list.add(new ServerInfo("127.0.0.2", 2));
list.add(new ServerInfo("127.0.0.3", 3));
List<String> finalServerList = Lists.newArrayList();
for (ServerInfo item : list) {
for (int i = 0; i < item.getWeight(); i++)
finalServerList.add(item.getIp());
}
//int total = list.stream().mapToInt(i -> i.getWeight()).sum();
// AtomicInteger curCount = new AtomicInteger(0);
while (true) {
Random rand = new Random();
int opt = rand.nextInt(finalServerList.size());
System.out.println(finalServerList.get(opt));
}
}
ZooKeeper相关知识请见ZooKeeper入门学习,接下来请见一个模拟的Zookeeper树。此外,针对不同地域地域可以再添加一个层次,或者在节点数据中表明地域。

Http服务网关:之前提到通过SOA体系,各类类型的终端、第三方的ISV应用都可以发送服务请求,由于http协议所包含的信息基本都是未经加密的明文(请求参数、返回值、cookie、head等),外界可以很容易的进行监听并伪造变造请求,因此系统需要一个公共的网关统一处理这类问题。该gateway即可以很好的解决安全问题,也可以提供通过服务名称的路由和负载均衡服务。
参考资料
- 陈康贤. 大型分布式网站架构[M]. 北京:电子工业出版社, 2014.
《大型分布式网站架构》学习笔记--01SOA的更多相关文章
- 分布式网站架构后续:zookeeper技术浅析
Zookeeper是hadoop的一个子项目,虽然源自hadoop,但是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用 越来越多.今天我想谈谈zookeeper,本文不谈如何使用z ...
- <转>大型分布式网站术语浅析
夜半睡起看书,看到一篇关于分布式网站性能优化术语的文章,个人觉得不错,分享出来... 原文地址:大型分布式网站术语分析 一.I/O优化 1.增加缓存,减少磁盘的访问次数. 2.优化磁盘的管理系统,设计 ...
- .net 大型分布式电子商务架构说明
.net大型分布式电子商务架构说明 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便 ...
- net大型分布式电子商务架构
net大型分布式电子商务架构 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维 ...
- 优酷、YouTube、Twitter及JustinTV视频网站架构设计笔记
本文是整理的关于优酷.YouTube.Twitter及JustinTV几个视频网站的架构或笔记,对于不管是视频网站.门户网站或者其它的网站,在架构上都有一定的参考意义,毕竟成功者的背后总有值得学习的地 ...
- aws基础架构学习笔记
文章大纲 Aws 的优势 架构完善的框架(WAF) Aws 学习笔记 Aws架构中心 Aws 的优势 4.速度优势 5.全球优势 数分钟内实现全球部署 Aws全球基础设施 Aws 数据中心 来自多家O ...
- 大型视频网站YouTube架构学习笔记
http://www.kaiyuanba.cn/html/1/131/147/7540.htm这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错的系统并能应用在实践上. ...
- .net大型分布式电子商务架构说明(转载来自<头条>)
背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 架构演变 基础框架剥 ...
- Spring Cloud 微服务架构学习笔记与示例
本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...
随机推荐
- 2、SpringBoot接口Http协议开发实战8节课(1-6)
1.SpringBoot2.xHTTP请求配置讲解 简介:SpringBoot2.xHTTP请求注解讲解和简化注解配置技巧 1.@RestController and @RequestMapping是 ...
- caffe-win10-cifar10
因为是在win10下安装的GPU版caffe,所以不能直接运行linux里的shell脚本.但是win10自带bash,可以运行.sh文件,网上也有直接下Cygwin和git的.我是下载好git后才知 ...
- 深入解析内存原理:DRAM的基本原理
前面我们知道了在一个简单的SRAM 芯片中进行读写操作的步骤了,然后我们来了解一下普通的DRAM 芯片的工作情况.DRAM 相对于SRAM 来说更加复杂,因为在DRAM存储数据的过程中需要对于存储的信 ...
- Android数据存储:SDCard
Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ...
- PYTHON-基本数据类型-元祖类型,字典类型,集合类型
内容: 1. 元组 2. 字典 3. 集合=========================== 元祖类型什么是元组: 元组就是一个不可变的列表============================ ...
- php面向对象编程self和static的区别
在php的面向对象编程中,总会遇到 class test{ public static function test(){ self::func(); static::func(); } public ...
- Memcache简单使用
1:Memcache的下载https://pan.baidu.com/s/1dFnB3NV/08中 简单安装:直接点击文件夹中的memcached.exe文件即可.但是每次使用都需要双击,比较麻烦.所 ...
- 《剑指offer》-找到字符串中第一个只出现一个的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 安卓在代码中设置TextView的drawableLeft、drawableRight、drawableTop、drawableBottom
Drawable rightDrawable = getResources().getDrawable(R.drawable.icon_new); //调用setCompoundDrawables时, ...
- Windows系统下oracle数据库每天定时备份
第一步:建立备份脚本oraclebackup.bat 首先建立一个备份bat文件,在D盘下新建备份目录oraclebackup,将oracle安装目录下的EXP.EXE复制到此目录下,再新建一个文本文 ...