輕量化的分布式服務框架 Hasor-RSF 盤點
介紹:
一個輕量化的分布式服務框架,相信這類框架已經不是什么新鮮事物,可用的替代方案有很多這里就不多說了,說一下RSF解決的問題把。
1.分布式
這個是基本功能之一,消費者會自動輪詢本地可用IP地址表以減少對單一服務提供者的訪問壓力。
2.接口泛化
服務提供者和服務消費者,之間不需要明確的接口定義。說白了就是提供和消費兩個程序各自使用各自的接口,無需搞出一個接口jar做統一約束。RSF會自動根據方法簽名來匹配調用。
3.自定義序列化
支持自定義序列化。內置Hessian、Java兩種序列化方案,默認配置 Hessian 版本為4.0。如需更換其它版本直接引入相關Jar包即可,內置的Hessian包名已經經過處理不會產生沖突。
4.同步 or 異步
基于接口包裝的服務調用是同步處理的,因為異步的話無法及時獲取返回值。基于RsfClient接口調用遠端服務的話,可以同步也可以異步。異步的話有CallBack也有Future。
5.熱裝載/熱卸載
RSF上的服務都是動態的,服務可以隨時發布隨時卸載。
6.多版本
定位一個RSF服務采用Group,Name,Version三個屬性。一臺服務器可以同時發布同一個服務的不同版本。
7.服務攔截器
雖說用處可能不是很大,但是對于某些想管理所有遠程調用的需求來說還是必要的。比方說:服務的使用授權、還有調用統計以及本地服務調用優先等。
接下來需要解決的問題:
1.服務自動發現
RSF不同于 dubbo 的是它沒有一個服務注冊中心。取而代之的是自動發現。
2.服務網關
面對外網的RSF調用,需要一個RSF服務網關來代為轉發。
3.服務監控
可以全面實現服務的調用流程監控。等等,甚至可以操縱服務上下限。設置服務限流等策略。
1.RSF服務在調用遠端服務時如果出現遠端拒絕,客戶端會進行重試ChooseOther響應信息(尚未支持這一功能)
1.分布式
這個是基本功能之一,消費者會自動輪詢本地可用IP地址表以減少對單一服務提供者的訪問壓力。
2.接口泛化
服務提供者和服務消費者,之間不需要明確的接口定義。說白了就是提供和消費兩個程序各自使用各自的接口,無需搞出一個接口jar做統一約束。RSF會自動根據方法簽名來匹配調用。
3.自定義序列化
支持自定義序列化。內置Hessian、Java兩種序列化方案,默認配置 Hessian 版本為4.0。如需更換其它版本直接引入相關Jar包即可,內置的Hessian包名已經經過處理不會產生沖突。
4.同步 or 異步
基于接口包裝的服務調用是同步處理的,因為異步的話無法及時獲取返回值。基于RsfClient接口調用遠端服務的話,可以同步也可以異步。異步的話有CallBack也有Future。
5.熱裝載/熱卸載
RSF上的服務都是動態的,服務可以隨時發布隨時卸載。
6.多版本
定位一個RSF服務采用Group,Name,Version三個屬性。一臺服務器可以同時發布同一個服務的不同版本。
7.服務攔截器
雖說用處可能不是很大,但是對于某些想管理所有遠程調用的需求來說還是必要的。比方說:服務的使用授權、還有調用統計以及本地服務調用優先等。
接下來需要解決的問題:
1.服務自動發現
RSF不同于 dubbo 的是它沒有一個服務注冊中心。取而代之的是自動發現。
2.服務網關
面對外網的RSF調用,需要一個RSF服務網關來代為轉發。
3.服務監控
可以全面實現服務的調用流程監控。等等,甚至可以操縱服務上下限。設置服務限流等策略。
目前RSF存在的問題:
1.RSF服務在調用遠端服務時如果出現遠端拒絕,客戶端會進行重試ChooseOther響應信息(尚未支持這一功能)
2.不支持多語言客戶端。這個是體力活,如果去支持的話RSF是可以做到的。因為RSF傳輸協議是自有的傳輸協議,多語言要解決的只有序列化的問題。
例子:
Server端:
RsfBootstrap bootstrap = new RsfBootstrap(); bootstrap.doBinder(new RsfStart() { public void onBind(RsfBinder rsfBinder) throws Throwable { rsfBinder.rsfService(EchoService.class, new EchoServiceImpl()).register(); } }).socketBind(8001); RsfContext rsfContext = bootstrap.sync();
客戶端:
//1.使用 RSF 引導程序創建 RSF。 RsfBootstrap bootstrap = new RsfBootstrap(); bootstrap.doBinder(new RsfStart() { public void onBind(RsfBinder rsfBinder) throws Throwable { String hostAddress = InetAddress.getLocalHost().getHostAddress(); rsfBinder.bindAddress(hostAddress, 8001);//分布式的遠程服務提供者:1 rsfBinder.bindAddress(hostAddress, 8002);//分布式的遠程服務提供者:2 rsfBinder.rsfService(EchoService.class).register(); } }); RsfContext rsfContext = bootstrap.sync(); // //2.獲取遠程服務的包裝類 EchoService myService = rsfContext.getRsfClient().wrapper("RSF", EchoService.class.getName(), "1.0.0", EchoService.class); //3.發起調用 for (int i = 0; i < 1000000; i++) { String echoMsg = myService.echo("你好.."); }
接口和實現類:
public interface EchoService { public String echo(String sayMessage); } public class EchoServiceImpl implements EchoService { public String echo(String sayMessage) { return "RE : " + sayMessage; } }
源碼位置:
http://git.oschina.net/zycgit/hasor/tree/master/project-rsf 下的(project-rsf)項目
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!