# CIMSS 介紹 ###### [Github](https://github.com/tairitsu86/Cross-instant-messaging-software-service-project) [Docker hub](https://hub.docker.com/repository/docker/tairitsu86/cross-instant-messaging-software-service/general) ## 專案介紹 CIMSS全稱Cross-Instant Messaging Software Service 這是一個即時通訊軟體串接微服務 目的是讓不同即時通訊軟體也能在一個大群組中互相溝通 也可以用於訊息訂閱,這樣訂閱開發商就不需要為了每個軟體都開一個專案 使用Apache Maven開發工具,Spring framework 3.0.4,JDK 17 ###### 目前版本:1.0.1-ALPHA版本(更新中) ## 專案目標 目前目標先定於建立功能完整之微服務 能部屬於kubernetes之上 且實作足夠且全面之Open API供其他開發者使用 並建立swagger API文件讓其他開發者能快速了解如何使用 ## Workflow ### When user send a message ![](https://i.imgur.com/FbXfCxv.jpg) ## 如何開始? 這裡會介紹如何將此容器部屬到你的主機! ### 前提條件: 必備條件: 1. 該主機須安裝Docker Engine 2. 要申請自己的line&telegram chat bot 要啟用SSL(HTTPS): 1. 該主機得具備Domain name(域名)和公開IP,用於啟用SSL加密 2. 請準備好你的SSL憑證(要求PEM檔,且private key必須是RSA) 因為line webhook需要HTTPS 所以不想開啟、無法開啟(Ex:沒域名、沒公開IP)或不知道怎麼HTTPS 請下載[Ngrok](https://ngrok.com/)來代替自己設定SSL ### 開始部屬容器 因為此容器需要很多的環境變數設定 所以建議使用Docker Compose 範例也將使用Docker Compose 這裡針對完全不理解的新手 所以會要求更改檔名,建立指定資料夾 如果你了解Docker compose,不一定要照範例步驟 只要能讓容器找到正確檔案就能正常執行 * **docker-compose.yml 範例** ``` version: "1" services: microservice-instant-message: image: tairitsu86/cross-instant-messaging-software-service container_name: cimss ports: - 443:8080 volumes: - cimss-database-file:/usr/src/microservice/src/main/resources/db/h2file - cimss-ssl:/usr/src/microservice/src/main/resources/SSL restart: always environment: LINE_BOT_TOKEN: LINE_BOT_SECRET: LINE_WEBHOOK: TELEGRAM_BOT_TOKEN: TELEGRAM_WEBHOOK: CIMSS_ADMIN_TOKEN: SSL_ENABLE: volumes: cimss-database-file: cimss-ssl: driver: local driver_opts: o: bind type: none device: "C:/SSL" ``` 設定完環境變數後(如果不確定該變數值,請參考後面的環境變數介紹) 若要啟用HTTPS,請照以下步驟掛載SSL憑證到容器上 1. 請先在C:下建立SSL資料夾 1. 請在裡面放入SSL憑證(需PEM格式) 1. private key的檔案檔明請命名為 privkey.pem 1. 認證鏈(cahin)憑證請命名為 fullchain.pem 就可以用(此指令需要在docker-compose.yml所在的資料夾) ``` docker-compose up ``` 啟動容器了! #### 環境變數介紹 在environment: 設定環境變數 **注意!** 值和:之間要有空格 詳情請查閱YAML檔格式規定 * **LINE_BOT_TOKEN** line bot的channel access token ![](https://i.imgur.com/qR7GaqS.png) * **LINE_BOT_SECRET** line bot的channel secret ![](https://i.imgur.com/zGZl0m3.png) * **LINE_WEBHOOK** 域名後的URL路徑(照下圖範例就是/lineWebhook) ![](https://i.imgur.com/AmDcGLq.png) * **TELEGRAM_BOT_TOKEN** telegram chat bot的token(下圖中60160開頭那一大串) ![](https://i.imgur.com/x3MMwdr.png) * **TELEGRAM_WEBHOOK** 域名後的URL路徑 * **CIMSS_ADMIN_TOKEN** 這個不一定要設定 這是整個系統的最高權限Token 如果沒有要用可以不用打 * **SSL_ENABLE** 決定是否要開啟SSL加密的變數 若要開啟(使用HTTPS)請設定值為true 若不開啟(使用HTTP)請設定值為false 請不要設定其他的值,有可能導致程式無法執行 以上就是全部的系統變數設定 ### 下一步該怎麼做? 如果一切順利,那CIMSS應該已經成功執行了 但現在除了預設路徑的hello訊息什麼都沒有 Swagger UI會在/swagger-ui/index.html#/路徑下 Ex: 域名為: https://example.com Swagger UI: https://example.com/swagger-ui/index.html#/ 接下來就可以利用裡面介紹的API進行服務開發了! 可以參考[CIMSS-DEMO](https://github.com/tairitsu86/CIMSS-DEMO) # CIMSS 更新日誌 ## 1.0.1-ALPHA版本 ### 簡介 發現了很多、很多有趣的技術 像是JWT,Event-driven,到Chat bot的按鈕訊息 所以這個版本又是超級大的更新 ### 重點更新 * **資料庫結構修改** 去除了一堆東東 增加了一堆東東 移除了org.liquibase套件,目前使用jpa原生的ddl-auto產生table 更改了一部份的欄名 * **驗證模式修改** 不再使用group對應的group api key 改為使用user的資料產生jwt來做為驗證的token 降低了驗證的複雜度,也簡化了資料庫結構 並使用spring security進行驗證 後續則透過使用者的操作進行授權 * **API修改**(還沒做) * **Chat bot功能新增**(Line好了,但有Bug,Telegram還沒開始) 現在能透過group表中的FUNCTION_LIST客製化chat bot的選單了 也有系統的按鈕清單 可以透過按鈕使用絕大部分功能 ### 未來展望--短期目標 ### 未來展望--長期規劃 ## 1.0.0-ALPHA版本 ### 簡介 這會是第一個正式版本 雖然還有很多小問題和優化沒處理 但整體架構已經是能良好運行的 資料庫架構: ![](https://i.imgur.com/yfEG4gK.png) [Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-1.0.0.html) 有鑑於某些展望沒有即時的必要性 從最初版本就寫到現在還沒處理 所以我決定將1.0.0-ALPHA之後的版本 展望分成長期規劃與短期目標 ### 重點更新 * **建立HTTPS** 目前申請了學校的免費Domain name https://cimss.csie.fju.edu.tw 並且已經將SSL憑證安裝上程式(使用Certbot) 但還沒設定自動更新憑證 秉持微服務的耦合性,SSL憑證並不存在於映像檔中 而是需要透過volume抓取本地端的SSL憑證 確保安全性的同時 也讓這個容器不需要綁死在某個域名下 換個憑證照樣能執行 另外SSL的啟用與否以系統變數設定 可以自由決定是要用HTTPS還是HTTP * **新增群組屬性** 經考慮後不採用 使用者訊息廣播啟用/停用 的屬性 已經將其餘四個欄位加入資料表 1. 公開/隱私群組 -> isPublic(boolean) 1. 透過群組Id加入功能的啟用/停用 -> joinById(boolean) 1. 群組敘述 -> groupDescription(String) 1. 關鍵字 -> groupKeyword(String) 目前已經都實作好了 * **增加系統指令** ``` Command list: No require permission command: Search group by keyword /cimss search <keyword> Create new group, you will auto joined this group, and have manager permission /cimss new <group name> Join any group(witch didn't close the join by id function) by group id /cimss join <group id> Leave the group you joined /cimss leave <group id> Show all group you joined now /cimss groups Require manager permission command: Get the detail data about the group /cimss detail <group id> Get all member data in group /cimss members <group id> Broadcast message to all member in group /cimss broadcast <group id> <message> Remove any member in the group /cimss remove <group id> <software> <userId> Alter the property of group /cimss alter <group id> <property> <value> Property can be groupName,groupDescription,isPublic,joinById, or allMessageBroadcast(no use) When property is groupName or groupDescription, value can be any string Else, value only can be true or false ``` 自己看,旁邊都有介紹ㄌ * **新增/修改/刪除API** 發現有些API沒得用會導致開發困難 所以就加了一些API 以及刪除我覺得不妥的API 然後把API變成Restful的(應該ㄅ) 具體內容自己看Swagger * **刪除Manager table** 突然發現不需要Manager table 改為以Member table中的isManager column實現 我之前怎麼沒想到? ### 未來展望--短期目標 * **開發聊天機器人功能** 目前機器人只能寄文字訊息 也只處理文字訊息 我覺得至少要加上寄圖片的API 和能Handle圖片事件和追隨事件的方法 * **建立更完整的Webhook** 目前只送文字事件 但有人加入這個群組 或離開這個群組應該都要有所通知 總之就是還有很多事件值得傳送 ### 未來展望--長期規劃 * **資料庫查詢優化** 從最初版說到現在 其實不做也沒關係 就是優化效能 * **開發聊天機器人功能** 這裡著重於更深入的開發 看看能不能挖到寶 找到什麼有趣的功能 * **進行更深入的套件使用** 就是看看那些套件有甚麼酷東東 能用的就拿來用 ## 0.0.2-DEMO版本 ### 簡介 現在已經能實際使用了 但實際還有很多細節沒處理 也有很多地方使用上並不便利 不過他已經能稱為一個微服務了(大概ㄅ) [Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-0.0.2.html) 資料庫架構: ![](https://i.imgur.com/bPluihU.png) ### 重點更新 * **建立Webhook轉送事件和文字事件** 現在可以將即時通訊軟體的事件 透過本服務的webhook轉送過去 但目前先關著,我覺得轉送有安全性問題 現在當任意使用者傳送訊息 所有該使用者加入之群組 都能透過Webhook獲得文字事件 不過後面應該會改成訊息符合特殊前綴才傳送事件 不然隱私性太差了 * **新增和更新API** 原有Database增刪修的API被移除了 只剩刪除所有資料和查詢表的API 增加了給予權限、查詢群組和重新命名群組的API等等 然後把需要0~1個參數的API都改為GET 需要2個或以上的API皆為POST * **實作權限控管** 權限分為Admin>Group Manager>Normal User>NONE四階 現在大部分API加上了權限控管 需要透過API KEY才能使用 * **新增系統指令** 目前實作了透過群組名稱搜尋的API 但一般使用者可不會用API 所以還是轉回文字指令 但有個大問題是文字指令使用上並不直觀 一般使用者應該也不想用 所以要怎麼提供基本功能還值得思考 目前只有四個指令 搜尋群組、加入群組、退出群組和顯示目前已加入的群組 * **完善Swagger說明文件** 現在把不該出現的API/Schema隱藏 並幫每個API加上介紹 API所要求的參數也有相應的介紹 response也有介紹 目前還在考慮是否要加入200以外的http回傳 ### 未來展望 * **新增群組屬性**(已完成) 現在的group都是一樣的 我們應該分成公開/私人的群組 某些有安全性疑慮的特定服務(Ex:IoT門禁系統) 不應該公開讓所有人搜尋 也不應該讓其他人能自行加入 所以目前設想的屬性為 1. 公開/隱私群組 1. 透過群組Id加入功能的啟用/停用 1. 使用者訊息廣播啟用/停用 1. 群組敘述 1. 關鍵字 * **增加更多系統指令**(已完成) 還在考慮,如果可以 我不太希望使用者必須使用文字指令 但如果這是最終決定 那就應該完善這套指令 * **資料庫查詢優化** 因為重點放在先讓它動起來 所以資料庫查詢完全沒動 還是暴力搜尋 但其實資料不要太多就沒有差 * **開發聊天機器人功能** 依舊在考慮 不過我認為至少要提供寄圖片的API 然後可以看看有沒有辦法用chat bot的功能(line應該可以) 讓使用者能有更好的介面操作系統 而不是透過系統指令 * **進行更深入的套件使用** 和資料庫優化的部分差不多 因為目前重點不是效能 所以我一樣完全沒動 然後這點應該會一直被推遲 因為他偏錦上添花 錦都還沒織出來,花還是先放著ㄅ ## 0.0.1-DEMO版本 ### 簡介 現在已經是個功能不齊全的微服務了 能單獨部署單獨執行 [Swagger快照](https://foscr5b4vumagf2gylhiua.on.drv.tw/Swagger/MicroServiceInstantMessageSwagger-0.0.1.html) 資料庫架構: ![](https://i.imgur.com/nhkc1xY.png) ### 重點更新 * **現在能以YAML來進行細部設定** 比起原本bot token等資料寫死的情況 現在轉變為以系統環境變數取用 此項更新可以讓未來的服務取用者 利用yaml指定自己的chat bot等等 * **改為使用嵌入式資料庫H2** 原本只是因為電腦上有SQL SERVER 加上熟悉java與SQL SERVER的串接 經過思考,本專案並不需要使用到SQL SERVER這種大型資料庫 還有對於資料庫的依賴性 降低了微服務單獨部屬單獨執行的特性 所以決定改為使用嵌入式資料庫 儲存的資料路徑在resourse/db下的h2file資料夾中 檔名是h2.mv.db和h2.trace.db 放在獨立資料夾是為了方便掛載卷冊(volume) * **整合Swagger套件** Swagger是OpenAPI的說明文檔 而springdoc是由Spring官方提供的Swagger實作 springdoc在程式運行時會自己爬code 找到我們的api並產生json和yaml檔 交給Swagger官方提供的前端UI 就能獲得精美的OpenAPI格式文件了 * **建立Database OpenAPI** 目前建立了四張資料表的增刪查API 12個 再加一個刪除所有資料的API共13個 現在可以利用Open API來操作資料庫 不過後來發現H2有console 有點尷尬,不過我還是留著 提供另一種取用資料庫的方法 未來可能移除 * **建立跨即時通訊軟體OpenAPI** 目前只有send, broadcast, join, 和newgroup 有點少,但我有點不知道還需要什麼API 現在主要想盡快能建立基礎應用 * **拔除PK的意義性的依賴性** 現在將原本的具依賴性的PK拔除 改為使用複合PK,以絕後患 * **簡易權限分級** 新增實體Manager 現在有三層權限分級 系統管理員>群組管理員>一般用戶 但實際功能取用尚未進行權限判定 現在人人都是系統管理員 * **去除文字訊息指令** 當初只是用來demo的 現在已經把功能實作到API上 所以就移除了 同時也移除了echo(重複使用者訊息)功能 ### 未來展望 * **完善權限分級**(已完成) 就像在重點更新所敘述 目前權限分級是形同虛設的模子 後須需要實作認證行為 * **資料庫查詢優化** 改為使用H2讓安全性問題得到解決 但沒有解決暴力搜尋的問題 依舊需要研究自定義查詢 * **建立Webhook**(已完成) 後續也應該提供Webhook功能 方便開發者接收使用者之訊息 * **轉送聊天機器人webhook**(已完成) 此版本沒有動chat bot的部分 而且我開始考慮是否應該開發chat bot 每個應用對chat bot的實作不盡相同 我不可能實作出人人滿意的功能 目前想法傾向於將chat bot的webhook事件 透果本服務的webhook轉交給使用者 確保原本的chat bot功能 使用者也可以百分百的發揮 * **完善Swagger說明文件**(已完成) 現在幾乎沒有進行說明 應該沒有人能看得懂 所以後續應該要多加註解 * **進行更深入的套件使用** 現在很多套件功能我都只取我要的 但事實是那些套件還有很多更優秀的功能 有些甚至能加強效能與錯誤容忍度 所以好好研究每個套件是必需做的功課 ## 0.0.0-DEMO版本 ### 簡介 比起微服務,目前更像是一個應用程式 因為目前尚未架設足夠API供他人取用 現階段只有一些基礎功能 資料庫架構: ![](https://i.imgur.com/kvK9ZnM.png) ### 功能介紹 Line和Telegram收到一般訊息都只會複讀 另外有設計一些基礎指令: ``` 指令列表: 新增群組(不會自動加入該群組) /newgroup <groupname> 加入群組 /join <groupId> 目前已加入的群組 /mygroups 列出所有群組成員 /groupmembers <groupId> 進行群組內廣播 /broadcast <groupId> <message> 退出群組(尚未實作) /leave <groupId> 查詢指令格式 /? 備註: 1.任何以/開頭之文字訊息皆被視為指令 2.指令中英文字母皆為小寫 3.以角括號<>框起之文字皆為參數 4.參數不能包括空格 5.參數需用空格與指令隔開 6.複數參數也應用空格隔開 7.參數輸入時不應該帶有角括號<> 範例: 新增名為MyGroup的群組 /newgroup MyGroup ``` 如果認為指令不直覺或難用是正常的 這個是設計給API的功能,只是先用這種方式DEMO 和三個測試的API: ``` @GetMapping("/") public String home() { return "{\"Message\":\"OAO\"}"; } @GetMapping("/linebot/send/{userId}/{message}") public String linebotSendText(@PathVariable String userId,@PathVariable String message) { lineMessageService.pushTextMessage(userId, message); return "{\"Message\":\"OWO\"}"; } @GetMapping("/telegrambot/send/{chatId}/{message}") public String telegrambotSendText(@PathVariable Long chatId,@PathVariable String message) { telegramMessageService.sendTextMessage(chatId, message); return "{\"Message\":\"OWO\"}"; } ``` ### 未來展望 * **架設完整API**(已完成) 目前API只有三個,基本上做不了什麼事情 除了基本指令應該架設到API上 也應該要求開發者提供chat bot token 讓其他開發者可以使用自己的chat bot * **開發聊天機器人功能** 目前所接取的事件基本侷限於文字訊息 還有很多事件值得實作 另外Telegram chat bot不能傳送大量文字的問題也尚須解決 * **進行權限分級**(已完成) 目前創立的跨即時通訊軟體群組,組內人人平等 應該新增管理員和管理用指令讓此群組更具功能性 * **資料庫查詢優化** 目前取用資料的方式是全查出來,再透過程式過濾所需資料 這樣不但浪費時間也浪費資源 所以應該建立JPA客製化查詢,甚至搭配預存程序與索引建置等 另外因為處於開發階段,SQL Server帳號貪圖便利直接給了最高權限 這點也應該更正 * **以YAML來進行細部設定**(已完成) 當這個微服務架設完成後 line bot,telegram bot的token,JDBC URL等等 應該要能讓使用者自行設定 目前預計用yaml進行 * **拔除PK的意義性的依賴性**(已完成) 目前PK用組合字 即時通訊軟體平台+使用者ID 這沒什麼問題 但現在取用User資料的方式是直接從webhook的json中把資料挖出來 自行組合PK,然後直接取用 老實講感覺很不賴,不用查詢就有PK能鎖定資料行 更別提查關聯表可以跳過JOIN,效率直線上升 但對資料庫設計這是不好的(應該吧?) 總之也許會造成隱患(又或許沒有?)