SSL加密與分散式IM系統-InChat1.1.3版本試用說明

Java貓說發表於2019-01-15

本文首發於本部落格 貓叔的部落格,轉載請申明出處

2019年1月15號-InChat釋出V1.1.3版本

Image text

InChat

一個輕量級、高效率的支援多端(應用與硬體Iot)的非同步網路應用通訊框架

v1.1.3版本使用說明

v1.1.0-alpha版本使用說明 InChatV1.1.2版本使用說明

歷史更新說明

1.1.2版本

  • 捕獲未註冊連結斷開異常,完善異常處理
  • 修改專案啟動流程,仿Selector啟動模式
  • 新增HTTP介面三個:傳送通知訊息,獲取線上使用者數,獲取線上使用者列表,暫不支援使用者自定義HTTP介面(對於傳統web API我們希望使用者用自己的框架與流程)
  • 服務端傳送通知介面改為enum處理

1.1.3版本

  • 新增SSL加密,實現https與wss功能
  • 接受使用者自定義證照(瀏覽器信任與不信任均可以訪問)
  • InChat配置可改為分散式或著單機版
  • 引入Redis,處理叢集資訊與訊息互通
  • 如果有生產需要或者個別需求,發現BUG,歡迎留言,專案會更新新的API

關於InChat的Maven依賴

  • fastjson 》 1.2.53
  • gson 》 2.8.5
  • netty 》 4.1.32.Final
  • commons-lang 》 3.5
  • slf4j-log4j12 》 1.7.25
  • jedis 》 3.0.1

建立專案

建立一個空的Maven專案,並引入InChatMaven包,(注意,請不要使用與本專案相同的包目錄)。

可能你只需要這樣的Maven依賴即可

<dependencies>
    <dependency>
        <groupId>com.github.UncleCatMySelf</groupId>
        <artifactId>InChat</artifactId>
        <version>1.1.3</version>
    </dependency>
</dependencies>
複製程式碼

對接InChat的介面與實現

InChat啟動引數可以自配置

你只需要繼承InChat的預設配置類InitNetty即可,如下

public class MyInit extends InitNetty {
    /** 自定義啟動監聽埠 */
    @Override
    public int getWebport() {
        return 8090;
    }
    /** 是否啟動分散式 true-啟動、false-不啟動 */
    @Override
    public Boolean getDistributed() {
        return true;
    }
    /** 是否啟動加密功能 */
    @Override
    public boolean isSsl() {
        return true;
    }
}
複製程式碼

請注意,分散式為測試版,所以暫不支援SSL加密,如果啟動分散式請關閉SSL加密功能

如何自定義證照?

#keytool -genkey -keysize 2048 -validity 365 -keyalg RSA -dnam e "CN=in-chat.cn" -keypass 123456 -storepass 123456 -keystore inchat.jks

keytool為JDK提供的生成證照工具

  • keysize 2048 金鑰長度2048位(這個長度的金鑰目前可認為無法被暴力破解)
  • validity 365 證照有效期365天
  • keyalg RSA 使用RSA非對稱加密演算法
  • dname "CN=gornix.com" 設定Common Name為gornix.com,這是我的域名
  • keypass 654321 金鑰的訪問密碼為123456
  • storepass 123456 金鑰庫的訪問密碼為123456(其實這兩個密碼也可以設定一樣,通常都設定一樣,方便記)
  • keystore gornix.jks 指定生成的金鑰庫檔案為inchat.jks

如果你試著自己建立了自己的證照,那麼你需要去重寫InitNetty中的幾個資訊:jksFile,jksStorePassword,jksCertificatePassword。 你的jks檔案只需要放到resources目錄下就好,兩個密碼就是你之前設定相同的密碼。 本專案已經提供了預設的inchat.jks,請使用者在Maven包中複製並貼上到自己的專案中的resources資料夾中即可。

獲取聊天訊息資料

此介面與原先一樣,僅修改了方法名

public class DataBaseServiceImpl implements InChatToDataBaseService {

    @Override
    public Boolean writeMessage(InChatMessage message) {
        System.out.println(message.toString());
        return true;
    }
}
複製程式碼

登入校驗與群聊訊息

此介面沒有做過多的修改

public class VerifyServiceImpl implements InChatVerifyService {

    @Override
    public boolean verifyToken(String token) {
        return true;
    }

    @Override
    public JSONArray getArrayByGroupId(String groupId) {
        JSONArray jsonArray = JSONArray.parseArray("[\"1111\",\"2222\",\"3333\"]");
        return jsonArray;
    }
}
複製程式碼

服務端傳送通知訊息列舉類

此介面具有Demo模板,使用者需要繼承InChat框架的FromServerService介面,同時該介面註釋也有例項demo,我們需要實現一個自定義的列舉,你可以這樣寫:

public enum  FromServerServiceImpl implements FromServerService {

    //你可以自定義自己的系統訊息,請以Integer-String的形式
    TYPE1(1,"【系統通知】您的賬號存在異常,請注意安全保密資訊。"),
    TYPE2(2,"【系統通知】恭喜您連續登入超過5天,獎勵5積分。");

    private Integer code;

    private String message;

    FromServerServiceImpl(Integer code, String message){
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    //實現介面的方法,遍歷本列舉的code,獲取對應的訊息,作為系統訊息傳送
    public String findByCode(Object code) {
        Integer codes = (Integer)code;
        for (FromServerServiceImpl item: FromServerServiceImpl.values()) {
            if (item.code == codes){
                return item.message;
            }
        }
        return null;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }


}
複製程式碼

啟動專案

1.1.3版本的啟動專案變得異常的簡單,你只需要配置啟動的配置工廠即可。但是如果我們啟動了分散式的話,我們還需要配置redis資訊。

public class application {

    public static void main(String[] args) {
        //配置你的自定義配置
        ConfigFactory.initNetty = new MyInit();
        //配置校驗類
        ConfigFactory.inChatVerifyService = new VerifyServiceImpl();
        //配置訊息接收處理類
        ConfigFactory.inChatToDataBaseService = new DataBaseServiceImpl();
        //配置服務端系統訊息列舉,這裡的值無所謂 TYPE1或者TYPE2或者TYPEN均可以
        ConfigFactory.fromServerService = FromServerServiceImpl.TYPE1;
        //配置分散式Redis地址,埠目前預設的,下一版可以支援修改。
        ConfigFactory.RedisIP = "192.168.192.132";
        //啟動InChat
        InitServer.open();
    }

}
複製程式碼

專案效果

啟動成功

DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
 INFO - 服務端啟動成功【192.168.56.1:8090】
 INFO - [RedisConfig.getJedis]:連線成功,測試連線PING->PONG
複製程式碼

如果你開通了分散式,那麼你可以試著啟動兩個應用程式。

DEBUG - -Dio.netty.threadLocalDirectBufferSize: 0
DEBUG - -Dio.netty.maxThreadLocalCharBufferSize: 16384
 INFO - 服務端啟動成功【192.168.56.1:8070】
 INFO - [RedisConfig.getJedis]:連線成功,測試連線PING->PONG
複製程式碼

讀者可以到專案中使用原來的兩個前端頁面

分別登入兩個使用者在兩個應用程式,並進行互相通訊即可。啟動分散式請關閉SSL,分散式為測試版,暫不支援SSL

目前,分散式版本接通了點對點與群聊的功能,大家可以試試。下一版本會新增一個分散式的元件用來統一資料與介面功能。

關於加密的,請提前讓電腦認同信任證照

加密

關於分散式的操作效果

分散式

關於HTTP介面的,目前與分散式無關

原先的自我傳送,點對點傳送,群聊異常處理,HTTP介面均與原來一樣

原先的介面說明可以看上一版本: InChatV1.1.2版本使用說明

send

result

前端相關

這裡你可以來到InChat的Front-End-Testing文件夾中的chat.html。

你可以直接使用,你進需要修改對應的對接IP即可。

如果你開了SSL加密,你的IP開頭記得改為:wss://192.168.1.121:8090/ws !!!

前端可以看原來的版本: InChatV1.1.2版本使用說明

關於資料庫設計

當前一版不會固定大家的資料庫設計,大家可以自己自由設計,同時搭上自己的專案,構建一個附帶IM的自專案。

公眾號:Java貓說

現架構設計(碼農)兼創業技術顧問,不羈平庸,熱愛開源,雜談程式人生與不定期乾貨。

Image Text

相關文章