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

本文首發於本博客 貓叔的博客,轉載請申明出處

2019年1月15號-InChat發佈V1.1.3版本

Image text

InChathtml

一個輕量級、高效率的支持多端(應用與硬件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依賴便可java

<dependencies>
    <dependency>
        <groupId>com.github.UncleCatMySelf</groupId>
        <artifactId>InChat</artifactId>
        <version>1.1.3</version>
    </dependency>
</dependencies>

對接InChat的接口與實現

InChat啓動參數能夠自配置

你只須要繼承InChat的默認配置類InitNetty便可,以下git

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加密功能github

如何自定義證書?

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

keytool爲JDK提供的生成證書工具redis

  • 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,咱們須要實現一個自定義的枚舉,你能夠這樣寫:json

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

相關文章
相關標籤/搜索