Venus 是一個簡單的、高性能、高併發能力的java 開源Remoting框架

Venus 是一個簡單的、高性能、高併發能力的java 開源Remoting框架 
wiki地址:http://wiki.hexnova.com/display/Venus/HOMEjava

性能測試:http://wiki.hexnova.com/pages/viewpage.action?pageId=1507358程序員

產品發佈日誌: http://wiki.hexnova.com/pages/viewrecentblogposts.action?key=Venusweb


1. 如何服務化 
採用接口與實現分離,服務接口是一種契約,他與咱們開發web Service相似。 

java開發語言:採用對程序員友好的接口申明形式,開發人員不須要關心客戶端與服務端之間的傳輸協議。 
其餘語言:能夠經過該框架提供自定義協議進行交互 
2. 服務接口定製 
定義服務接口 
接口參數命名 
定義參數校驗規則 
Java語言服務接口儘可能不要依賴其餘項目. 接口層面只須要接口相關的參數對象類與服務類 
異常定義 
3. 接口參數校驗 
4. 提供3種交互方式 
請求應答模式:普通的request、response,通常用於接口有返回值 
異步請求模式:一般用於接口無返回值,客戶端並不關心服務器的處理結果,也不用關心服務器處理多少時間 
異步回調模式:接口無返回值,處理一般消化大量時間,須要服務端通知處理結果的業務接口 

下面是一個例子: 

一、簡單的接口例子:HelloService.javaspring

Java代碼   收藏代碼
  1. package com.meidusa.venus.hello.api;  
  2.   
  3. import com.meidusa.venus.annotations.Endpoint;  
  4. import com.meidusa.venus.annotations.Param;  
  5. import com.meidusa.venus.annotations.Service;  
  6. import com.meidusa.venus.notify.InvocationListener;  
  7.   
  8. /** 
  9.  * Service framework的 HelloService 接口例子.</p> 
  10.  * 支持3種調用方式:</p> 
  11.  * <li> 請求應答模式:普通的request、response,通常用於接口有返回值</li> 
  12.  * <li> 異步請求模式:一般用於接口無返回值,客戶端並不關心服務器的處理結果,也不用關心服務器處理多少時間</li> 
  13.  * <li> 異步回調模式:接口無返回值,處理一般消化大量時間,須要服務端通知處理結果的業務接口</li> 
  14.  * 
  15.  * @author Struct 
  16.  * 
  17.  */  
  18. @Service(name="HelloService",version=1)  
  19. public interface HelloService {  
  20.   
  21.     /** 
  22.      * 無返回結果的服務調用,支持回調方式,該服務在通信層面上爲異步調用 
  23.      * @param name 
  24.      * @param invocationListener 客戶端的回調接口 
  25.      */  
  26.     @Endpoint(name="sayHelloWithCallbak")  
  27.     public abstract void sayHello(@Param(name="name") String name,  
  28.                       @Param(name="callback") InvocationListener<Hello> invocationListener);  
  29.     /** 
  30.      * 無返回結果的服務調用,支持同步或者異步調用, 
  31.      * 該接口申明:同步,而且接口申明異常 
  32.      * @param name 
  33.      */  
  34.     @Endpoint(name="sayHello",async=false)  
  35.     public abstract void sayHello(@Param(name="name") String name) throws HelloNotFoundException;  
  36.   
  37.     /** 
  38.      * 無返回結果的服務調用,支持同步或者異步調用,無異常申明 
  39.      * @param name 
  40.      */  
  41.     @Endpoint(name="sayAsyncHello",async=true)  
  42.     public abstract void sayAsyncHello(@Param(name="name") String name);  
  43.   
  44.   
  45.     /** 
  46.      * 有返回結果的服務調用,該接口只能支持同步調用 
  47.      * @param name 
  48.      * @return 
  49.      */  
  50.     @Endpoint(name="getHello")  
  51.     public abstract Hello getHello(@Param(name="name") String name);  
  52. }  



二、客戶端TestCase編寫api

Java代碼   收藏代碼
  1. package com.meidusa.venus.hello.client;  
  2.   
  3. import java.util.concurrent.CountDownLatch;  
  4.   
  5. import org.junit.Test;  
  6. import org.junit.runner.RunWith;  
  7. import org.springframework.beans.factory.annotation.Autowired;  
  8. import org.springframework.test.context.ContextConfiguration;  
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  10.   
  11. import com.meidusa.venus.exception.CodedException;  
  12. import com.meidusa.venus.hello.api.Hello;  
  13. import com.meidusa.venus.hello.api.HelloNotFoundException;  
  14. import com.meidusa.venus.hello.api.HelloService;  
  15. import com.meidusa.venus.notify.InvocationListener;  
  16.   
  17. @RunWith(SpringJUnit4ClassRunner.class)  
  18. @ContextConfiguration(locations="classpath:/applicationContext-helloworld-client.xml")  
  19. public class TestHelloService {  
  20.   
  21.     @Autowired  
  22.     private HelloService helloService;  
  23.   
  24.     @Test  
  25.     public void saySync(){  
  26.         System.out.println(helloService.getHello("jack"));  
  27.     }  
  28.   
  29.     @Test  
  30.     public void testSyncWithException(){  
  31.         try {  
  32.             helloService.sayHello("jack");  
  33.         } catch (HelloNotFoundException e) {  
  34.             System.out.println("throw an user defined HelloNotFoundException");  
  35.         }  
  36.     }  
  37.   
  38.     @Test  
  39.     public void testAsync(){  
  40.         helloService.sayAsyncHello("jack");  
  41.     }  
  42.   
  43.     @Test  
  44.     public void testCallback() throws Exception{  
  45.         //爲了讓回調完成,採用countDownLatch計數器方式,避免testcase主線程運行完成而回調未結束的問題  
  46.         final CountDownLatch latch = new CountDownLatch(1);  
  47.   
  48.                   //在正常的使用的代碼中這個類須要單實例,避免過多的callback listener致使內存問題  
  49.                       InvocationListener<Hello> listener = new InvocationListener<Hello>() {  
  50.             public void callback(Hello myobject) {  
  51.                 System.out.println(" async call back result="+myobject);  
  52.                 latch.countDown();  
  53.             }  
  54.   
  55.             @Override  
  56.             public void onException(Exception e) {  
  57.                 if(e instanceof CodedException){  
  58.                     CodedException exception = (CodedException) e;  
  59.                     System.out.println(" async call back error:"+exception.getErrorCode()+",message="+exception.getMessage());  
  60.                 }else{  
  61.                     System.out.println(" async call back message="+e.getMessage());  
  62.                 }  
  63.                 latch.countDown();  
  64.   
  65.             }  
  66.         };  
  67.   
  68.         helloService.sayHello("jack",listener);  
  69.         latch.await();  
  70.     }  
  71.   
  72. }  



三、服務端的實現服務器

Java代碼   收藏代碼
    1. package com.meidusa.venus.hello.impl;  
    2.   
    3. import java.math.BigDecimal;  
    4. import java.util.HashMap;  
    5. import java.util.Map;  
    6.   
    7. import com.meidusa.venus.hello.api.Hello;  
    8. import com.meidusa.venus.hello.api.HelloNotFoundException;  
    9. import com.meidusa.venus.hello.api.HelloService;  
    10. import com.meidusa.venus.notify.InvocationListener;  
    11.   
    12. public class DefaultHelloService implements HelloService {  
    13.     private String greeting;  
    14.     public String getGreeting() {  
    15.         return greeting;  
    16.     }  
    17.   
    18.     public void setGreeting(String greeting) {  
    19.         this.greeting = greeting;  
    20.     }  
    21.     public Hello getHello(String name) {  
    22.         Hello hello = new Hello();  
    23.         hello.setName(name);  
    24.         hello.setGreeting(greeting);  
    25.         Map<String,Object> map = new HashMap<String,Object>();  
    26.         hello.setMap(map);  
    27.         map.put("1"1);  
    28.         map.put("2"new Long(2));  
    29.         map.put("3"new Integer(3));  
    30.         hello.setBigDecimal(new BigDecimal("1.341241233412"));  
    31.         return hello;  
    32.     }  
    33.   
    34.     public void sayHello(String name)  throws HelloNotFoundException {  
    35.         throw new HelloNotFoundException(name +" not found");  
    36.     }  
    37.   
    38.     @Override  
    39.     public void sayAsyncHello(String name) {  
    40.         System.out.println("method sayAsyncHello invoked");  
    41.     }  
    42.   
    43.     public void sayHello(String name,  
    44.             InvocationListener<Hello> invocationListener) {  
    45.         Hello hello = new Hello();  
    46.         hello.setName(name);  
    47.         hello.setGreeting(greeting);  
    48.         Map<String,Object> map = new HashMap<String,Object>();  
    49.         hello.setMap(map);  
    50.         map.put("1"1);  
    51.         map.put("2"new Long(2));  
    52.         map.put("3"new Integer(3));  
    53.   
    54.         if(invocationListener != null){  
    55.             invocationListener.callback(hello);  
    56.         }  
    57.   
    58.     }  
    59. }  
相關文章
相關標籤/搜索