浅谈SOA
概念
wiki对于SOA定义如下:
A service-oriented architecture (SOA) is a design pattern in which application components provide services to other components via a communications protocol, typically over a network. The principles of service-orientation are independent of any vendor, product or technology
从定义上看,可以总结出SOA软件架构模式的几个特点:
- 面向服务划分系统--将庞大的业务系统拆分成高内聚的服务单元,每个单元对外提供服务服务能力,服务与服务之间通过相互协作共同实现业务价值
- 松耦合---SOA框架中可以应用多种技术,服务消费方不依赖于服务提供者的技术实现(比如Java服务提供方,Python服务消费者)。双方可以通过thrift, proto-buffer或者消息队列等框架来实现消息的互通。
- 系统的可靠性依赖外部网络特质---传统的单进程系统拆分成多进程系统之间的相互协作,进程之间通过RPC进行通信,增加了网络开销。
SOA系统中,最基础的单元是服务,那么什么是服务呢?
Service Is a logical representation of a repeatable business activity that has a specified outcome (e.g., check customer credit, provide weather data, consolidate drilling reports). 从定义上看,服务是对业务活动的逻辑表达。服务能力通常使用API接口来进行抽象,形成所谓的"契约",外部模块通过遵循契约来获得相应的能力。
概念说完了,那么来聊聊如何去构建一个SOA框架。构建SOA框架需要考虑下面几个要点
- 服务注册/发现
- 负载均衡:使用合理的框架或是算法实现流量均匀的负载到集群节点上
- Heatbeat
- 服务监控(Metric, 熔断机制(比如: 过去一分钟,http调用失败率超过60%,判定服务不可用,移出或打标签))
- RPC框架
服务注册/发现
服务注册/发现是实现SOA的重中之重,负载均衡、Heatbeat都是基于这一基础实现的。我们可以通过使用zookeeper来实现服务的注册和发现。zookeeper wiki给出的定义如下:
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.
从定义上看zookeeper能够:
- 作为配置信息的存储服务器
- 命名服务
- 分布式的协调服务
除此之外zookeeper具有其他一些特点:
- 奇数个服务节点(和leader选举算法有关)
- 提供多种语言的API
- 技术比较成熟
- 使用linux文件存储结构,树状组织
- 使用watch机制push数据节点变更消息
主要使用zookeeper的命名服务去实现服务中心的功能,服务注册/发现的架构如下所示:
在此架构中有三种角色: 服务提供者,服务注册中心,服务消费者:
- 服务提供者注册自己的服务,注册信息包含系统信息,服务名称,服务的ip和端口号,服务请求的url, 服务的权重等
- 注册中心提供注册服务的中心存储,和向服务消费者push服务变更通知
- 服务消费者在启动时获取所需服务注册信息(根据系统名称+服务名称),将服务注册信息缓存在本地,监听服务信息的变更,更新本地的缓存。服务消费者根据本地缓存的服务提供者信息负载,来转发请求。对服务提供方提供心跳检测。
心跳检测
心跳是检验服务是否可用必不可少的服务,如果出现问题,将该服务提供者从该服务的提供者列表中移除;反之,则加入到服务的提供者列表中。Heatbeat实现原理比较简单,启动后台线程定期的向provier发送http请求,多次连续失败将Provider从调度列表中移出。
负载均衡
负载可以通过两种方式实现,一种是通过硬件分流,简单方便,不过成本较高;
另一种方式是采用软负载,软负载的两种方式:
a,中心控制-软负载服务器。全局视角,可以得出全局最优解。但是有单点问题存在。方式
b,客户端控制—客户端自己选择特定的service的provider,通过收集provider相关的信息,按照可选的一系列选择算法,进行工作。好处是更加贴近consumer,能够做出针对于本机的个性化选择;问题是,每个选择都是针对一个consumer进行的,consumer之间互相不知情,容易导致选择冲突(eg,两个provider a和b,如果在某一特定时刻,所有的consumer都指定了a,导致a的服务质量较差,所有的consumer感知到这一情况,按照一般算法都会将下一次的请求发给b,此时,所有的请求都积压在b端,导致b的服务质量较差;然后,下一次又会同时指向a。造成了网络的震荡和服务资源的浪费)
下面介绍一种简单的轮询算法,JAVA实现如下所示:
ServiceInstanceManager---维护ServiceInstance实例类
private final AtomicInteger counter = new AtomicInteger(0);
public String getUrl(){
List list = this.manager.getAvailableProviders();
if(list != null && !list.isEmpty()) {
int tmpCount = this.counter.getAndIncrement();
int index = tmpCount % list.size();
index = index >= 0 ? index:index + list.size();
String url = (String)list.get(index);
logger.debug("Service({}), invoke counter({}), url({})!", new Object[]{this.service, Integer.valueOf(tmpCount), url});
return url;
} else {
throw new LoadBalanceException(String.format("Service(%s) has no available provider!", new Object[]{this.service}));
}
}
RPC
RPC—Remote Procedure Call Protocol,是应用实现进程间调用的一种常用手段。通过指定服务对外的IP地址和端口id,本地计算机能够访问到远端机器的资源。常用的RPC框架包括Java RMI, thrift, Google protobuf等。用户在选择不同的RPC框架可以从序列化,性能,语言支持几个方面去考虑,比如Java RMI只能在java生态圈中使用,无法对接其他语言提供的RPC服务,而thrift在语言支持方面就相当全面,通过编写thrift描述接口文档,可以实现不同程序之间的调用。
浅谈SOA的更多相关文章
- 浅谈SOA与RPC
一.SOA 英文名称:Service Oriented Ambiguity 中文名称:面向服务架构 SOA是一种思想,目的是提供一种设计项目的思路,让开发时更有效率. 例如原来的分布式项目中,在每个项 ...
- 浅谈SOA面向服务化编程架构(dubbo)
dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...
- 浅谈soa之RESTful
今晚打算花点时间整理一下面向服务的架构oap.1传统中小型项目架构一般是这样的:(java)html+servlet+jdbc.和(.net)html+handler+ado.net都是在一台应用来. ...
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice
浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...
- 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招
朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
随机推荐
- SQL Server2014 SP2新增的数据库克隆功能
SQL Server2014 SP2新增的数据库克隆功能 创建测试库 --创建测试数据库 create database testtest use testtest go --创建表 )) --插入数 ...
- Git Bash的一些命令和配置
查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...
- Spark踩坑记——初试
[TOC] Spark简介 整体认识 Apache Spark是一个围绕速度.易用性和复杂分析构建的大数据处理框架.最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apach ...
- 拼图小游戏之计算后样式与CSS动画的冲突
先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...
- Android 工具-adb
Android 工具-adb 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 开发中, adb 是开发者经常使用的工具,是 Android 开发者必须掌握的. Android D ...
- C++的内存泄漏检测【转载】
原文地址: http://www.cnblogs.com/jily/p/6239514.html
- isEmpty和isNull()区别
isEmpty和isNull()区别一个NULL字符串一定是一个空串,一个空串未必是一个NULL字符串例如:QString().isNull(): //结果为trueQString().isEm ...
- HotApp小程序服务范围资质查询器
微信小程序提交审核需要选择资质服务范围,如果服务范围不对,审核会不通过, 开发小程序之前,最好先查询所开发小程序的资质范围,否则无法通过微信审核. 小程序的资质范围查询地址,数据同步微信官方 ht ...
- git init和git init -bare区别
1 Git init 和 git init –bare 的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作.但别的用户在将更新push上来的 ...
- 【一起学OpenFOAM】03 OpenFOAM基本使用流程
OpenFOAM初学者常常对于软件的使用流程感到很迷惑,与其他的具有GUI的CFD软件不同,OpenFOAM的所有操作均为基于文本操作,譬如说里面各种计算模型.计算参数.流程控制参数等,均为通过修改对 ...