一個非常方便和強大的跨平臺RPC框架:pigeon
廢話少說,我們直接開門見山吧。假如你的公司后臺采用JAVA作為開發語言,同時又有iOS/Android平臺的APP,今天我為大家帶來一個非常方便和強大的跨平臺RPC框架。
說了這么多,到底怎么用?
1:明確需求;假如用戶下載了我們的APP(以Android為例),這個時候用戶需要注冊。那么我們的后臺需要有一個提供用戶注冊的方法或者叫API,我就一步到位吧。這個方法就長這樣子 User register(String username, String password) throws IOException; 相信大家一眼就能看出來,這是個接口上的抽象方法,因為它沒有方法體也沒有修飾符。
2:定義接口;為什么要接口?因為我們要讓Android/iOS客戶端調用的時候代碼書寫就像在調用本地方法一樣啊。例如在Android端使用的話就會變成 User user = api.register("葉良辰","我有一百種方法讓你在github混不下去"); 很簡單有沒有?很想EJB、WebService是不是?我會說差不多,但是比它們都更簡單更輕量級。
3:完整實現;這里我們注意到有一個User類,也應該有一個API接口同時也應該有一個API實現類。好吧,那我們就創建一個Maven多模塊項目將它們一一寫出來吧。 我們最好把項目分成幾個模塊,等下我們會知道為什么需要分模塊。
那就創建一個結構類似下面的Maven項目吧
/demo-parent
|
|--/demo-core
|
|--/demo-web
其中我們把 User類 和 API接口 放在 demo-core模塊中,讓demo-web依賴demo-core模塊,再把APIImpl這個接口實現類放在demo-web模塊中,這三個類的主要代碼如下
// 注意讓你的參與網絡傳輸的類型實現 Serializable 接口,輕松擁有可序列化功能。
public class User implements Serializable {
private static final long serialVersionUID = 5991214707724188798L;
private String username;
private String password;
// getter setter ...
}
public interface API {
// 注意這里的異常定義,框架明確要求開放方法必須定義IOException異常拋出,其實這大有用處,后面再說。
User register(String username, String password) throws IOException;
}
public class APIImpl implements API {
public User register(String username, String password) throws IOException {
User user = new User();
user.setUsername(username);
user.setPassword(password);
// 將user保存到數據庫...
return user;
}
} 4:框架上場;怎么地?這樣寫出來就可以用啦?嗯,差不多了,我們繼續看。 a.首先將框架從github里導入到你的eclipse中,地址:https://github.com/core-lib/pigeon.git 這是個maven項目,有幾個模塊,第一次編譯比較久因為需要下載一些第三方依賴。。。
b.假如你已經編譯完成沒有任何問題。
c.讓demo-core項目依賴你下載的pigeon框架的pigeon-core模塊,版本號看你下載的版本為準。
<dependency>
<groupId>payne.framework</groupId>
<artifactId>pigeon-core</artifactId>
<version>3.6.0-release</version>
</dependency>
d.我們把API接口加上一個框架提供的注解@Open,其他東西不用修改,然后它就變成了
@Open
public interface API {
User register(String username, String password) throws IOException;
}
e.下面我們寫一個單元測試類吧,功能總是需要測試的對吧。給demo-web模塊添加pigeon-server和pigeon-client依賴,如果沒有junit依賴也補上去。版本號以你下載的為準。。。
<dependency>
<groupId>payne.framework</groupId>
<artifactId>pigeon-server</artifactId>
<version>3.6.0-release</version>
</dependency>
<dependency>
<groupId>payne.framework</groupId>
<artifactId>pigeon-client</artifactId>
<version>3.6.0-release</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
</dependency>
public class APITests {
private InvocationContext context;
private API api;
public static void main(String[] args) throws Exception {
InvocationContext context = new BlockingInvocationContext();
context.bind(10086);
context.register(new APIImpl());
context.startup();
}
@Before
public void setup() throws Exception {
// 啟動服務端
context = new BlockingInvocationContext();
context.bind(10086); // 開放端口,根據自己喜好
context.register(new APIImpl());
context.startup();
// 模擬客戶端
Client client = new Client("localhost", 10086);
api = client.create("HTTP", "application/x-java-serialized-object", "/APIImpl", API.class);
}
@Test
public void testRegister() throws Exception{
User user = api.register("葉良辰","我有一百種方法讓你在github混不下去");
System.out.println("返回結果" + user.getUsername() + ":" + user.getPassword());
}
@After
public void destroy() throws Exception {
context.shutdown();
}
}
運行 testRegister 方法。。。 5.客戶端使用API;到這里我們就會明白為什么我說項目要分模塊。因為我們需要把這個模塊打包給Android使用,或者生成對應的模型和接口給iOS使用。所以我們打包的時候不可能把實現類也打包給客戶端吧?因為實現類我們放在了demo-web,所以客戶端也就只知道接口而且,面向接口編程也是pigeon框架所提倡的。
a.假設你已經打好包了,把demo-core的jar包放到Android中,并且將我們之前打包好的pigeon-core、pigeon-introspection和pigeon-client三個jar包放入Android項目中。
b.構造客戶端,記得改IP地址和端口,指向到你后臺的IP地址和端口。
Client client = new Client("server.ip", 10086);
api = client.create("HTTP", "application/x-java-serialized-object", "/APIImpl", API.class);
c.通過 APITests 的main方法啟動后臺,后臺一旦啟動就會在等待請求的狀態
d.調用后臺,在適當的地方使用代碼調用后臺服務,例如在用戶點了注冊的確定按鈕。注意!注意!這里雖然看上去是在調用本地代碼,但是實際上是網絡交互,所以不要放在主線程!!!用AsyncTask吧。
User user = api.register("葉良辰","我有一百種方法讓你在github混不下去");
System.out.println("返回結果" + user.getUsername() + ":" + user.getPassword());
e.當你寫完一個AsyncTaks時,你會發現,似乎還是很麻煩的樣子。不用擔心,框架有更好的方案。讓你直接在主線程寫代碼,框架實現異步調用和回調主線程代碼。 6.其實上述只是pigeon框架的冰山一角,框架提供session,序列化,編碼,壓縮,校驗,加密,簽名,參數校驗。。。每種數據轉換都有接口和原生的幾個實現,可以直接使用也可以自定義拓展,所有這些數據轉換功能都是無需編寫代碼,只需要在開放接口或方法上標注對應注解即可輕松擁有。
網絡協議 HTTP HTTP/1.0 HTTP/1.1
加密 RSA AES DES DESede
簽名 MD2WithRSA MD5WithRSA SHA1WithRSA SHA256WithRSA
編碼 base64 base32 hex
壓縮 flat GZIP LZ4 snappy
序列化 application/url application/json application/xml application/yaml application/smile application/cbor application/avro application/x-www-form-urlencoded application/x-java-serialized-object application/hessian application/hessian2 application/burlap
校驗 MD2 MD5 SHA-1 SHA-256
7.框架輕松跟市面上流行的技術進行集成,例如Spring,Hibernate,web服務器(tomcat。。。)更好的整合在你已有的項目和拓展你的項目。在保證不修改你現有的開放服務的實現類代碼前提下,可以通過抽象出一個接口就能通過pigeon框架的形式去開放遠程接口方式的調用。
8.更詳細的使用教程,更強大的功能使用請下載pigeon-sample工程。地址:https://github.com/core-lib/pigeon-sample.git
9.如何使用session?如何生成objective-c客戶端?如何生成異步API?如何拓展框架?框架的運行原理?請下載pigeon-sample工程。地址:https://github.com/core-lib/pigeon-sample.git
10.有任何問題,隨時隨地可以加我QQ:646742615(我的昵稱是Payne) 或發郵件到我QQ郵箱:646742615@qq.com。你也可以微信我:change1921。