一個非常方便和強大的跨平臺RPC框架:pigeon

jopen 9年前發布 | 73K 次閱讀 pigeon WEB服務/RPC/SOA

跨平臺遠程方法接口調用框架, 致力于改善iOS/Android移動端與服務端API調用的各種繁瑣問題, 屏蔽所有網絡交互的技術細節, 讓開發者只關心業務而不擔心技術上得問題, 跨平臺接口智能生成, 讓你的API調用代碼流暢一如書寫本地方法調用. 提供目前網絡數據傳輸的所有轉換的接口和實現, 其中包括 序列化, 編碼, 壓縮, 校驗, 加密, 簽名 ...

廢話少說,我們直接開門見山吧。假如你的公司后臺采用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。

項目主頁:http://www.baiduhome.net/lib/view/home/1451285675042

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!