一個非常方便和強大的跨平臺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。