Monthly Archives: April 2012

为什么说SOA环境下Service Registry很重要?

为什么说SOA环境下Service Registry很重要? 有了Service Registry,consumer不必通过IP找到provider,而只需通过服务名。但这又有什么好处呢? 个人观点:     开发人员和运维人员不必互相询问和通知了。开发人员不必向运维人员打听某服务器的IP,运维人员如果把某服务转移到了另一台机上,也不必通知开发人员。  也就是说,基于名字的耦合(connascence)会弱于基于网络地址的耦合 另一个好处是方便依赖关系的监控。Service Registry集中地保存了consumer/provider之间的逻辑依赖关系,以及consumer机器和provider机器之间的物理依赖关系。 如果有一个界面,就可以一目了然地监控这些依赖。

初识Http Push技术

以下基本抄自维基百科(词条:Push Technology) Push技术 从交互模型上来说是一种publisher/subscriber机制,两者通过事件通知来发生关系 Http Push HTTP server push (also known as HTTP streaming) is a mechanism for sending data from a web server to a web browser. HTTP server push can be achieved through several mechanisms. Http Push的几种实现 Generally the web server does not terminate a connection after response data has been served to […]

模块化及组件化的一些概念

模块化是什么:       In software design, modularity refers to a logical partitioning of the "software design" that allows complex software to be manageable for the purpose of implementation and maintenance. The logic of partitioning may be based on related functions, implementation considerations, data links, or other criteria.    模块化编程的好处:    Modular programming improve maintainability by enforcing […]

如何理解“每个组件只应提供单一的API调用入口”

每个组件只应提供单一的API调用入口,这句话的意思是什么? 我的看法: 1. 正解:组件中的每个操作都应该只有一个入口;应用层不能既调用BeanService.getBean(),又调用BeanDAO.getBean(). 原因可见这里。 2. 误解:每个模块只能使用一个类作为API. 像bean-biz.jar这种组件,可以同时提供BeanService作为CRUD、业务逻辑入口,以及BeanSearchService作为搜索查询入口;否则,如果把所有操作都丢给单一的BeanService,那 BeanService 这个类本身的内聚性就很差。 其实,关于“组件中的每个操作都应该只有一个入口”也可以有例外情况。 比如一个缓存客户端 cache-client.jar中,可以同时提供CommonCacheTemplate作为通用的、灵活性高的API,以及SimpleCacheOperations作为最常用的、极其易用(比如可以少传几个参数)的的API。不过,后者必须建立在前者基础上,只作为前者的易用版本来使用,不准附加任何与前者冲突的业务逻辑

为什么说二进制依赖一个组件时不准调用它的内部API?

为什么说二进制依赖一个组件时不准调用它的内部API? 比如说,对bean-biz.jar,应用层只准调用BeanService.getBean(),而不准调用BeanDAO.getBean()? 你会说这是为了“封装性”,以“避免不必要的耦合”。但直接耦合BeanDAO.getBean()和BeanDAO.deleteBean()有什么“具体”的坏处呢?  我的结论是:     1. 如果同时依赖BeanService.getBean()和BeanDAO.getBean(),就意味着对同一个操作形成了“调用上的冗余”; 当一个发生变化时,另一个也要跟着变,而且变得很尴尬。     2. 如果绕过BeanService直接调用BeanDAO.deleteBean(),就意味着依赖了组件的内部实现;而内部实现往往是不稳定的,当内部实现改变时,应用层也要发生改变,一种本可以避免的改变。 代码阐述: 1. 调用的冗余     //改变发生前 public class BeanService { public Bean getBean(Long id) { return beanDAO.getBean(id); } } public class WiseAction { public void showBeanDetail(){ Bean bean = beanService.getBean(id); } } public class RogueAction { public void showBeanDetail() { Bean bean = beanDAO.getBean(id); } } […]