求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
(MSOA)微型面向服务的架构的设计与实现
 

作者:teamlet,发布于:2012-11-28 ,来源:CSDN

 

设计目的:

  1. 系统按照功能或者业务逻辑层次划分服务,系统架构清晰、灵活;
  2. 提供服务自动注册;
  3. 服务调用简单,服务之间的调用可以通过getXXXService()直接获得;
  4. 服务统一管理;
  5. 服务可监控;

一、Service 接口

Service接口提供了一个自动注册的机制。实现了registe()方法来完成服务的注册。

public interface Service {
	public void registe();
}

二、AbstractService抽象类

AbstractService抽象类实现了一个registe(String,Object)的方法,通过ServiceManager完成服务的注册。

ServiceManager负责保存所有服务。同时提供服务的注册和获取服务,是服务注册和获取的唯一通道。

在AbstractService中调用了registe()无参数的方法,这是个在Service中定义,在AbstractService没有实现的方法。

要求继承AbstractService的子类实现并调用registe(String,Object)方法实现自身的注册。

public abstract class AbstractService implements Service {

	public AbstractService() {
		registe();
	}

	protected void registe(String serviceName, Object service) {
		ServiceManager.registe(serviceName, service);
	}

	public Object getService(String serviceName) {
		return ServiceManager.getService(serviceName);
	}
}

三、举例 UserService

UserService继承了AbstractServcie,由于AbstractServcie没有实现registe()方法,要求UserService实现

UserService实现 registe()方法,并在方法中调用 AbstractServcie提供的registe(String,Object)方法,传入当前服务的serviceName和this完成注册。

继承了AbstractServcie的子类可以直接通过getService(String serviceName)获得所需要的任何服务。

public abstract class AbstractService implements Service {

	public AbstractService() {
		registe();
	}

	protected void registe(String serviceName, Object service) {
		ServiceManager.registe(serviceName, service);
	}

	public Object getService(String serviceName) {
		return ServiceManager.getService(serviceName);
	}
} 

四、ServiceManager

用于保存service,提供注册和获取服务方法。同时还提供服务监控的机制。

ServiceManager也是所有服务调用的Facade 门面,是 Facade模式的应用。

public final class ServiceManager {

	private static Map<String, Object> services = new HashMap<String, Object>();
	private static ServiceMonitor serviceMonitor = null;

	/**
	 * serviceMonitor 可以管理 services 变量
	 * 
	 * @return
	 */
	public static ServiceMonitor getServiceMonitor() {
		if (serviceMonitor == null) {
			serviceMonitor = new ServiceMonitor(services);
		}
		return serviceMonitor;
	}

	/**
	 * 注册service到 serviceManager。
	 * 
	 * 此方法由 AbstractService类使用,AbstractService的子类需要实现registe()
	 * 方法并在方法中调用AbstractService的registe(String serviceName, Object service)方法。
	 * 
	 * 将子类注册到当前 ServiceManager 中。
	 * 
	 * @param serviceName
	 *            形如: ServiceManager.class.getName()
	 * @param service
	 */
	public static void registe(String serviceName, Object service) {
		services.put(serviceName, service);
	}

	/**
	 * 通过service名字获取 service,此方法由 AbstractService 类使用。
	 * 
	 * @param serviceName
	 *            形如: ServiceManager.class.getName()
	 * @return
	 */
	public static Object getService(String serviceName) {
		Object service = services.get(serviceName);
		if (service == null) {
			try {
				Class<?> serviceClass = Class.forName(serviceName);
				service = serviceClass.newInstance();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return service;
	}

}

五、ServiceMonitor

由于 ServiceManager中的services是私有变量,并且ServiceManager只负责服务的保存、注册和获取,因此提供ServiceMonitor对 services变量实现操作(监控)。

public class ServiceMonitor {

	private Map<String, Object> services = null;

	public ServiceMonitor(Map<String, Object> monitedServices) {
		this.services = monitedServices;
	}

	public int getServiceCount() {
		return this.services.size();
	}
} 

(MSOA)微型面向服务架构中服务管理者和服务提供者的松散关系

一、服务是平级的

图中是一些服务的提供者和服务的管理者。在这个图中所有的类都是平等的、独立的。除了实现的逻辑和处理问题的角度的不同,这些服务都是继承相同的类。

服务提供者不知道谁是服务管理者,同样服务管理者也不知道谁是服务的提供者。

二、服务管理者和服务提供者的划分

Service和AbstractService提供了服务提供者自动注入服务管理者的机制。

通过服务管理者能获得任何的服务提供者,而通过服务提供者可以获得其他的任何一个服务提供者,服务提供者之间是完全可见的。

从责任上分,服务管理者只负责提供服务的注册和存取。服务提供者可以获取任意的服务进行整合和调用,可以组合成粒度更大、功能更复杂逻辑的服务。

三、灵活性的体现

1、每个服务的提供者 Service的子类都是在有请求的时候才被创建;创建后的实例保存在ServiceManager中。

2、如果对某个服务进行修改,使其生效不需要重新启动系统。

比如,要对UserService进行修改,只要实现一个继承UserService的子类覆写或者增加一些方法,或者实现一个adpater的设计模式,然后用UserService的名字将新类的实例注入ServiceManager就可以了。极大的方便了系统的动态特性和可扩展性。

四、系统架构的服务层次划分

系统架构的层次分为接口服务层、业务服务层、基础服务层和物理服务层。

接口服务层对外提供访问接入服务;业务服务层提供业务逻辑服务;基础服务提供可高度复用的基础服务;物理服务层提供对数据库、系统配置、文件系统的访问。

由于系统内部服务之间都是可见的,为了安全起见,避免暴露不必要的服务,要求接口服务层的服务需要继承PublicService接口经过设置并检查后才能提供服务。


 
分享到
 
 


专家视角看IT与架构
软件架构设计
面向服务体系架构和业务组件
人人网移动开发架构
架构腐化之谜
谈平台即服务PaaS


面向应用的架构设计实践
单元测试+重构+设计模式
软件架构师—高级实践
软件架构设计方法、案例与实践
嵌入式软件架构设计—高级实践
SOA体系结构实践


锐安科技 软件架构设计方法
成都 嵌入式软件架构设计
上海汽车 嵌入式软件架构设计
北京 软件架构设计
上海 软件架构设计案例与实践
北京 架构设计方法案例与实践
深圳 架构设计方法案例与实践
嵌入式软件架构设计—高级实践
更多...