Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

init.go 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package modules
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/fatih/color"
  7. "log"
  8. "net"
  9. "net/rpc"
  10. )
  11. // TODO: RM 처리와 init.go 전반적으로 DI 이용하여 구현 RM 키등록 부분 구현 예정
  12. type Moscato struct {
  13. queue MsgQueue
  14. SendQueue chan myType
  15. MicroServiceManager NodeManager `inject:""`
  16. MatchingManager match_manager
  17. SubscriptionManager sub_manager
  18. SecureManager SecurityManager `inject:""`
  19. }
  20. type myType struct {
  21. subList []string
  22. pubMsg MsgUnit
  23. err error
  24. }
  25. type Reply struct {
  26. CompleteLog string
  27. }
  28. type Receiver struct {
  29. moscato *Moscato
  30. }
  31. type Args struct { // 매개변수
  32. JsonMsg []byte
  33. Kind int
  34. }
  35. func (receiver Receiver) MmReceive(args Args, reply *Reply) error {
  36. // 메세지 별로 나눠서 언마샬하면 됨
  37. switch args.Kind {
  38. case KSM:
  39. var msg KeyShareMsg
  40. err := json.Unmarshal(args.JsonMsg, &msg)
  41. if err != nil {
  42. return err
  43. }
  44. go func() {
  45. _, err := receiver.moscato.Receive(msg)
  46. if err != nil {
  47. }
  48. }()
  49. reply.CompleteLog = "received"
  50. case PM:
  51. var msg PublishMsg
  52. err := json.Unmarshal(args.JsonMsg, &msg)
  53. if err != nil {
  54. return err
  55. }
  56. go func() {
  57. _, err := receiver.moscato.Receive(msg)
  58. if err != nil {
  59. }
  60. }()
  61. reply.CompleteLog = "PM received"
  62. case SM:
  63. var msg SubscriptionMsg
  64. err := json.Unmarshal(args.JsonMsg, &msg)
  65. if err != nil {
  66. return err
  67. }
  68. go func() {
  69. _, err := receiver.moscato.Receive(msg)
  70. if err != nil {
  71. }
  72. }()
  73. reply.CompleteLog = "SM received"
  74. case RM:
  75. var msg RegisterMsg
  76. err := json.Unmarshal(args.JsonMsg, &msg)
  77. if err != nil {
  78. return err
  79. }
  80. go func() {
  81. _, err := receiver.moscato.Receive(msg)
  82. if err != nil {
  83. fmt.Println(err)
  84. }
  85. }()
  86. reply.CompleteLog = "RM received"
  87. case WM:
  88. var msg WithdrawMsg
  89. err := json.Unmarshal(args.JsonMsg, &msg)
  90. if err != nil {
  91. return err
  92. }
  93. go func() {
  94. _, err := receiver.moscato.Receive(msg)
  95. if err != nil {
  96. }
  97. }()
  98. reply.CompleteLog = "WM received"
  99. default:
  100. return errors.New("message type Error: Not registered message type")
  101. }
  102. //reply.CompleteLog = "received completely"
  103. return nil
  104. }
  105. func (moscato *Moscato) preProcessMsg(originalMsg MsgUnit) MsgUnit {
  106. if originalMsg.CheckType() == PM {
  107. pubMsg := originalMsg.(PublishMsg)
  108. for index := 0; index < len(pubMsg.Topic); index++ {
  109. pubMsg.Topic[index] = pubMsg.Topic[index] - moscato.SecureManager.GetNodeKey(pubMsg.From)
  110. }
  111. for index := 0; index < len(pubMsg.Value); index++ {
  112. pubMsg.Value[index] = pubMsg.Value[index] - moscato.SecureManager.GetNodeKey(pubMsg.From)
  113. }
  114. return pubMsg
  115. } else if originalMsg.CheckType() == SM {
  116. subMsg := originalMsg.(SubscriptionMsg)
  117. for index := 0; index < len(subMsg.Topic); index++ {
  118. subMsg.Topic[index] = subMsg.Topic[index] - moscato.SecureManager.GetNodeKey(subMsg.From)
  119. }
  120. for index := 0; index < len(subMsg.Value); index++ {
  121. subMsg.Value[index] = subMsg.Value[index] - moscato.SecureManager.GetNodeKey(subMsg.From)
  122. }
  123. return subMsg
  124. }
  125. return nil
  126. }
  127. func (moscato *Moscato) SendWithEncrypt() MsgUnit {
  128. for {
  129. mt := <-moscato.SendQueue
  130. fmt.Println(mt)
  131. if mt.err == nil {
  132. for index := 0; index < len(mt.subList); index++ {
  133. tmpNode := mt.subList[index]
  134. tmpNodeIpAddr, _ := moscato.MicroServiceManager.GetIpaddr(tmpNode)
  135. moscato.SecureManager.ReEncPubMsg(mt.pubMsg.(PublishMsg), tmpNode)
  136. moscato.Send2MS(tmpNodeIpAddr, mt.pubMsg)
  137. }
  138. }
  139. return nil
  140. }
  141. }
  142. //Recieve - MM가 msg전달 받음
  143. func (moscato *Moscato) Receive(msg MsgUnit) (MsgUnit, error) {
  144. //rpc call
  145. var msg_type = msg.CheckType()
  146. //메세지 타입에 따라 다르게 처리
  147. switch msg_type {
  148. case KSM: //Key share msg
  149. case PM: //Publish msg
  150. log.Println("PM received")
  151. fmt.Println("PM: ", msg)
  152. moscato.queue.push(moscato.preProcessMsg(msg))
  153. fmt.Println("pushed")
  154. case SM: //Subscription msg
  155. err := moscato.SubscriptionManager.addSubscription(moscato.preProcessMsg(msg))
  156. if err != nil {
  157. println(err)
  158. //return nil, err
  159. }
  160. case RM: //Register msg
  161. log.Println("RM received")
  162. var newMsg RegisterMsg
  163. newMsg = msg.(RegisterMsg)
  164. newNode := MSNode{newMsg.From, newMsg.From}
  165. resultAddNode := moscato.MicroServiceManager.AddMicroservice(newNode)
  166. if resultAddNode {
  167. log.Println("Node added successful")
  168. } else {
  169. log.Println("Node is already added, ignore RM")
  170. return msg, nil
  171. }
  172. addr, _ := moscato.MicroServiceManager.GetIpaddr(newMsg.From)
  173. moscato.SecureManager.RegKey(newMsg)
  174. fmt.Println("Registered microservice: address", addr,
  175. "/ key", moscato.SecureManager.GetNodeKey(newMsg.From))
  176. // ackRM 메세지 전송
  177. go moscato.Send2MS(addr, newMsg)
  178. case WM: //Withdraw msg
  179. moscato.MicroServiceManager.RemoveMicroservice(msg.(WithdrawMsg).From)
  180. moscato.SecureManager.RemoveSecureKey(msg.(WithdrawMsg).From)
  181. default:
  182. return nil, errors.New("Message type Error: Not registered message type")
  183. }
  184. return msg, nil
  185. }
  186. //Ms로 보낼때 쓸 함수
  187. func (moscato *Moscato) Send2MS(ipaddress string, msg MsgUnit) {
  188. client, err := rpc.Dial("tcp", ipaddress+":8150")
  189. if err != nil {
  190. fmt.Println(err)
  191. return
  192. }
  193. defer client.Close()
  194. reply := new(Reply)
  195. jmsg, _ := msg.ConvertToJson()
  196. args := Args{
  197. JsonMsg: jmsg,
  198. Kind: msg.CheckType(),
  199. }
  200. err = client.Call("Receiver.Receive", args, reply)
  201. if err != nil {
  202. fmt.Println(err)
  203. return
  204. }
  205. //log.Println(reply.CompleteLog) //잘 받았는지 확인 해줌
  206. // 마이크로 서비스에게 받은 메시지는 노란색으로 출력
  207. log.Println(reply.CompleteLog)
  208. }
  209. func (moscato *Moscato) Run() {
  210. config := AppConfig{moscato}
  211. config.config()
  212. //모스카토 구조체 변수 초기화
  213. receiver := Receiver{moscato: moscato}
  214. err := moscato.queue.queue_init()
  215. moscato.SendQueue = make(chan myType)
  216. moscato.SubscriptionManager.Initialize()
  217. if err != nil {
  218. fmt.Println(err)
  219. return
  220. }
  221. //go routine -> matching 동작
  222. go func() {
  223. for {
  224. msg := moscato.queue.pop(true)
  225. fmt.Println(msg)
  226. go moscato.Matching(msg)
  227. go moscato.SendWithEncrypt()
  228. }
  229. }()
  230. //go moscato.CheckQueue()
  231. //rpc 등록 -> Receive 함수
  232. err = rpc.Register(receiver)
  233. if err != nil {
  234. log.Println(err)
  235. return
  236. }
  237. go Listen()
  238. color.Blue("initializing complete.")
  239. fmt.Scanln()
  240. }
  241. func Listen() {
  242. //l, err := net.Listen("tcp", fmt.Sprintf(":%v", 8160))
  243. l, err1 := net.Listen("tcp", ":8160") //MS로 부터 받는거
  244. //l2, err2 := net.Listen("tcp","0.0.0.0:8150")
  245. if err1 != nil {
  246. log.Fatal(fmt.Sprintf("Unable to listen on given port: %s", err1))
  247. }
  248. defer l.Close()
  249. /*if err2 != nil {
  250. log.Fatal(fmt.Sprintf("Unable to listen on given port: %s", err2))
  251. }
  252. defer l2.Close()*/
  253. for {
  254. conn, _ := l.Accept()
  255. go rpc.ServeConn(conn)
  256. }
  257. /*for {
  258. conn, _ := l2.Accept()
  259. go rpc.ServeConn(conn)
  260. }*/
  261. }