概念

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软件架构模式的几个特点:

  1. 面向服务划分系统--将庞大的业务系统拆分成高内聚的服务单元,每个单元对外提供服务服务能力,服务与服务之间通过相互协作共同实现业务价值
  2. 松耦合---SOA框架中可以应用多种技术,服务消费方不依赖于服务提供者的技术实现(比如Java服务提供方,Python服务消费者)。双方可以通过thrift, proto-buffer或者消息队列等框架来实现消息的互通。
  3. 系统的可靠性依赖外部网络特质---传统的单进程系统拆分成多进程系统之间的相互协作,进程之间通过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框架需要考虑下面几个要点

  1. 服务注册/发现
  2. 负载均衡:使用合理的框架或是算法实现流量均匀的负载到集群节点上
  3. Heatbeat
  4. 服务监控(Metric, 熔断机制(比如: 过去一分钟,http调用失败率超过60%,判定服务不可用,移出或打标签))
  5. RPC框架

服务注册/发现

服务注册/发现是实现SOA的重中之重,负载均衡、Heatbeat都是基于这一基础实现的。我们可以通过使用zookeeper来实现服务的注册和发现。zookeeper wiki给出的定义如下:

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services.

从定义上看zookeeper能够:

  1. 作为配置信息的存储服务器
  2. 命名服务
  3. 分布式的协调服务

除此之外zookeeper具有其他一些特点:

  1. 奇数个服务节点(和leader选举算法有关)
  2. 提供多种语言的API
  3. 技术比较成熟
  4. 使用linux文件存储结构,树状组织
  5. 使用watch机制push数据节点变更消息

主要使用zookeeper的命名服务去实现服务中心的功能,服务注册/发现的架构如下所示:

在此架构中有三种角色: 服务提供者,服务注册中心,服务消费者:

  1. 服务提供者注册自己的服务,注册信息包含系统信息,服务名称,服务的ip和端口号,服务请求的url, 服务的权重等
  2. 注册中心提供注册服务的中心存储,和向服务消费者push服务变更通知
  3. 服务消费者在启动时获取所需服务注册信息(根据系统名称+服务名称),将服务注册信息缓存在本地,监听服务信息的变更,更新本地的缓存。服务消费者根据本地缓存的服务提供者信息负载,来转发请求。对服务提供方提供心跳检测。

心跳检测

心跳是检验服务是否可用必不可少的服务,如果出现问题,将该服务提供者从该服务的提供者列表中移除;反之,则加入到服务的提供者列表中。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的更多相关文章

  1. 浅谈SOA与RPC

    一.SOA 英文名称:Service Oriented Ambiguity 中文名称:面向服务架构 SOA是一种思想,目的是提供一种设计项目的思路,让开发时更有效率. 例如原来的分布式项目中,在每个项 ...

  2. 浅谈SOA面向服务化编程架构(dubbo)

      dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...

  3. 浅谈soa之RESTful

    今晚打算花点时间整理一下面向服务的架构oap.1传统中小型项目架构一般是这样的:(java)html+servlet+jdbc.和(.net)html+handler+ado.net都是在一台应用来. ...

  4. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  5. Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice

    浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...

  6. 【ASP.NET MVC系列】浅谈ASP.NET MVC运行过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  7. 朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招

    朱晔的互联网架构实践心得S2E6:浅谈高并发架构设计的16招 概览 标题中的高并发架构设计是指设计一套比较合适的架构来应对请求.并发量很大的系统,使系统的稳定性.响应时间符合预期并且能在极端的情况下自 ...

  8. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  9. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

随机推荐

  1. 【WCF】自定义错误处理(IErrorHandler接口的用法)

    当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...

  2. Node-Webkit打包

    1.node-webkit是什么? NW.js is an app runtime based on Chromium and node.js. You can write native apps i ...

  3. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  4. 通过VMware的PowerCLI配置集群内指定主机的vMotion功能

    PowerCLI是VMware开发的基于微软(MSFT)的PowerShell的命令行管理vSphere的实现,因此在批量化操作方面CLI会减轻很多GUI环境下的繁琐重复劳作. 现有场景中有大量的物理 ...

  5. redis成长之路——(一)

    为什么使用redis Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就 ...

  6. 基于注解的bean配置

    基于注解的bean配置,主要是进行applicationContext.xml配置.DAO层类注解.Service层类注解. 1.在applicationContext.xml文件中配置信息如下 &l ...

  7. Oracle第一步

    Oracle 启动数据库 Startup [NOMOUNT|MOUNT|OPEN|FORCE] [restrict] [pfile=filename] 启动实例,加载数据库,启动数据库 oRACLE关 ...

  8. HttpPost过程中使用的URLEncoder.encode(something, encode)

    URLEncoder.encode("刘美美", "utf-8").toString()       =     %E5%88%98%E7%BE%8E%E7%B ...

  9. Android中Activity处理返回结果的实现方式

    大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界 ...

  10. CocoaPods的安装、使用、以及遇到的问题

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...