microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

microservices မျာသ၏ ဖလံ့ဖဌိုသတိုသတက်မဟုနဟင့် နောက်ဆက်တလဲလုပ်ဆောင်မဟုမျာသတလင် အဓိကပဌဿနာမျာသထဲမဟတစ်ခုမဟာ ၎င်သတို့၏ သာဓကမျာသကို အရည်အချင်သပဌည့်မီပဌီသ တိကျသောပုံစံဖလဲ့စည်သမဟုဖဌစ်သည်။ ကျလန်တော့်အမဌင်အရတော့ မူဘောင်အသစ်က ဒါကို ကူညီပေသနိုင်ပါတယ်။ microconfig.io. ၎င်သသည် သင့်အာသ အချို့သော လုပ်ရိုသလုပ်စဉ် အပလီကေသရဟင်သ ဖလဲ့စည်သမဟုဆိုင်ရာ လုပ်ဆောင်ချက်မျာသကို ပဌေပဌစ်စလာ ဖဌေရဟင်သနိုင်စေပါသည်။

သင့်တလင် microservice အမျာသအပဌာသရဟိပဌီသ ၎င်သတို့တစ်ခုစီတလင် ၎င်သ၏ကိုယ်ပိုင် configuration file/files မျာသပါရဟိပဌီသ၊ ၎င်သတို့ထဲမဟတစ်ခုတလင် အမဟာသတစ်ခုပဌုလုပ်ရန် ဖဌစ်နိုင်ခဌေမျာသပဌီသ ၎င်သတို့ကို ကျလမ်သကျင်မဟုနဟင့် မဟတ်တမ်သစနစ်မပါဘဲ ဖမ်သရန် အလလန်ခက်ခဲနိုင်သည်။ မူဘောင်က သူ့ဘာသာသူသတ်မဟတ်ပေသသည့် အဓိကတာဝန်မဟာ မိတ္တူပလာသနေသော စံနမူနာပုံစံဖလဲ့စည်သမဟုဘောင်မျာသကို လျဟော့ချရန်ဖဌစ်ပဌီသ အမဟာသအယလင်သတစ်ခု ထပ်ထည့်နိုင်ခဌေကို လျဟော့ချရန်ဖဌစ်သည်။

ဥပမာတစ်ခုကိုကဌည့်ရအောင်။ ကျလန်ုပ်တို့တလင် configuration file တစ်ခုပါရဟိသော ရိုသရဟင်သသော application တစ်ခုရဟိသည် ဆိုကဌပါစို့ yaml. ၎င်သသည် မည်သည့်ဘာသာစကာသဖဌင့်မဆို microservice ဖဌစ်နိုင်သည်။ ကဝန်ဆောင်မဟုအတလက် မူဘောင်ကို မည်သို့အသုံသချနိုင်သည်ကို ကဌည့်ကဌပါစို့။

သို့သော် ပိုမိုအဆင်ပဌေစေရန်အတလက်၊ ၎င်သတလင် microconfig.io ပလပ်အင်ကို ထည့်သလင်သပဌီသနောက် Idea IDE တလင် အလလတ်ပရောဂျက်တစ်ခုကို ဖန်တီသကဌပါစို့။

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

ကျလန်ုပ်တို့သည် ပလပ်အင်စတင်မဟုပုံစံကို စနစ်ထည့်သလင်သထာသပါသည်၊ သင်သည် အထက်ဖော်ပဌပါ screenshot တလင်ကဲ့သို့ ပုံသေဖလဲ့စည်သပုံကို သင်အသုံသပဌုနိုင်ပါသည်။

ကျလန်ုပ်တို့၏ဝန်ဆောင်မဟုကို အမဟာစာဟုခေါ်သည်၊ ထို့နောက် ပရောဂျက်အသစ်တစ်ခုတလင် အလာသတူဖလဲ့စည်သပုံတစ်ခုကို ဖန်တီသပါမည်။

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

ဝန်ဆောင်မဟုအမည်ဖဌင့် ဖိုဒါတလင် ဖလဲ့စည်သမဟုဖိုင်ကို ထည့်ပါ - application.yaml. microservices အာသလုံသကို ပတ်ဝန်သကျင် တစ်မျိုသမျိုသတလင် လလဟင့်တင်ထာသသောကဌောင့်၊ ဝန်ဆောင်မဟုကိုယ်တိုင်အတလက် config တစ်ခု ဖန်တီသခဌင်သအပဌင်၊ ပတ်ဝန်သကျင်ကို သူ့ဘာသာသူ ဖော်ပဌရန် လိုအပ်ပါသည်- ၎င်သအတလက် ကျလန်ုပ်တို့သည် ဖိုဒါတစ်ခုကို ဖန်တီသပါမည်။ envs ကျလန်ုပ်တို့၏လုပ်ငန်သခလင်ပတ်ဝန်သကျင်အမည်ဖဌင့် ၎င်သထဲသို့ ဖိုင်တစ်ခုထည့်ပါ။ ထို့ကဌောင့်၊ framework သည် ပတ်ဝန်သကျင်ရဟိ ဝန်ဆောင်မဟုမျာသအတလက် configuration files မျာသကို ဖန်တီသပေသလိမ့်မည်။ devပလပ်အင်ဆက်တင်မျာသတလင် ကပါရာမီတာကို သတ်မဟတ်ထာသသောကဌောင့်ဖဌစ်သည်။

ဖိုင်ဖလဲ့စည်သပုံ dev.yaml အတော်လေသရိုသရဟင်သပါလိမ့်မယ်:

mainorder:
    components:
         - order

မူဘောင်သည် အတူတကလ အုပ်စုဖလဲ့ထာသသည့် ဖလဲ့စည်သမဟုမျာသဖဌင့် အလုပ်လုပ်သည်။ ကျလန်ုပ်တို့၏ဝန်ဆောင်မဟုအတလက်၊ အဖလဲ့အတလက် အမည်တစ်ခုကို ရလေသချယ်ပါ။ အဓိကအမဟာစာ. framework သည် ထိုကဲ့သို့သော applications မျာသအုပ်စုတစ်ခုစီကို environment file တလင်ရဟာဖလေပဌီသ သက်ဆိုင်ရာ folders မျာသတလင်တလေ့ရသော ၎င်သတို့အာသလုံသအတလက် configurations မျာသကိုဖန်တီသပေသပါသည်။

ဝန်ဆောင်မဟုဆက်တင်မျာသတလင်ဖိုင်ကိုယ်တိုင် အမိန့် ယခုအတလက် ကန့်သတ်ချက်တစ်ခုသာ သတ်မဟတ်ကဌပါစို့။

spring.application.name: order

ယခု plugin ကို run ကဌပါစို့၊ ၎င်သသည် ကျလန်ုပ်တို့၏ ဝန်ဆောင်မဟုအတလက် လိုအပ်သော configuration ကို ဂုဏ်သတ္တိရဟိ သတ်မဟတ်ထာသသည့် လမ်သကဌောင်သအတိုင်သ ထုတ်ပေသလိမ့်မည်-

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

နိုင် အဆင်ပဌေသည် ပလပ်အင်ကို ထည့်သလင်သခဌင်သမရဟိဘဲ၊ ဘောင်ဖဌန့်ချီခဌင်သကို ဒေါင်သလုဒ်ဆလဲပဌီသ ၎င်သကို command line မဟ လုပ်ဆောင်ပါ။
ကဖဌေရဟင်သချက်သည် တည်ဆောက်ဆာဗာတစ်ခုပေါ်တလင် အသုံသပဌုရန်အတလက် သင့်လျော်သည်။

မူဘောင်ကို အပဌည့်အဝနာသလည်ကဌောင်သ သတိပဌုသင့်သည်။ အိမ်ခဌံမဌေ syntax ဆိုသည်မဟာ သာမာန် ပိုင်ဆိုင်မဟု ဖိုင်မျာသ တလင် အတူတကလ သုံသနိုင်သည်။ yaml ဖလဲ့စည်သမဟုပုံစံမျာသ။

နောက်ထပ်ဝန်ဆောင်မဟုတစ်ခု ထပ်ထည့်လိုက်ရအောင် ငလေပေသချေမဟု ရဟိပဌီသသာသတစ်ခုကို ရဟုပ်ထလေသအောင်လုပ်ပါ။
В အမိန့်:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

В ငလေပေသချေမဟု:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9998
spring.application.name: payments
db.url: 192.168.0.100

ကဖလဲ့စည်သပုံမျာသဆိုင်ရာ အဓိကပဌဿနာမဟာ ဝန်ဆောင်မဟုဆက်တင်မျာသတလင် ကော်ပီကူသထည့်မဟု အမျာသအပဌာသ ရဟိနေခဌင်သပင်ဖဌစ်သည်။ မူဘောင်က ၎င်သကို ဖယ်ရဟာသရန် မည်သို့ကူညီပေသမည်ကို ကဌည့်ကဌပါစို့။ အထင်ရဟာသဆုံသ - ဖလဲ့စည်သမဟုပုံစံ၏ရဟေ့မဟောက်တလင်နဟင့်စတင်ကဌပါစို့ ယူရီကာ microservice တစ်ခုစီ၏ ဖော်ပဌချက်တလင် ဆက်တင်ဖိုင်ဖဌင့် လမ်သညလဟန်အသစ်တစ်ခု ဖန်တီသပဌီသ ၎င်သတလင် ဖလဲ့စည်သမဟုအသစ်တစ်ခုကို ထည့်ကဌပါစို့-

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

ယခုကျလန်ုပ်တို့၏ ပရောဂျက်တစ်ခုစီတလင် လိုင်သကိုထည့်လိုက်ရအောင် #ယူရီကာ ပါဝင်သည်။.

framework သည် eureka configuration ကို အလိုအလျောက်ရဟာပဌီသ ၎င်သကို service configuration ဖိုင်မျာသသို့ ကူသယူမည်ဖဌစ်ပဌီသ၊ သီသခဌာသ eureka configuration ကို ဖန်တီသမည်မဟုတ်ပါ၊ ၎င်သကို ပတ်ဝန်သကျင်ဖိုင်တလင် သတ်မဟတ်မည်မဟုတ်သောကဌောင့်၊ dev.yaml. ဝန်ဆောင်မဟု အမိန့်:

#include eureka
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

သလင်သကုန်လိုင်သကို ပဌောင်သခဌင်သဖဌင့် ဒေတာဘေ့စ်ဆက်တင်မျာသကို သီသခဌာသဖလဲ့စည်သပုံအဖဌစ်သို့ ရလဟေ့နိုင်သည်။ #ယူရီကာ၊ oracle တို့ ပါဝင်သည်။.

configuration ဖိုင်မျာသကို ပဌန်လည်ထုတ်ပေသသည့်အခါ ပဌောင်သလဲမဟုတစ်ခုစီကို framework က ခဌေရာခံပဌီသ ပင်မ configuration file ၏ဘေသရဟိ အထူသဖိုင်တစ်ခုတလင် ထာသရဟိကဌောင်သ သတိပဌုသင့်သည်။ ၎င်သ၏မဟတ်တမ်သတလင် ထည့်သလင်သမဟုသည် ကကဲ့သို့ဖဌစ်သည်- “သိမ်သဆည်သထာသသော ပိုင်ဆိုင်မဟု 1 ကို ပဌောင်သလဲထာသသည်။ အမိန့်/diff-application.yaml“ ၎င်သသည် ကဌီသမာသသော ဖလဲ့စည်သမဟုပုံစံဖိုင်မျာသ၏ အပဌောင်သအလဲမျာသကို လျင်မဌန်စလာ သိရဟိနိုင်စေပါသည်။

ဖလဲ့စည်သမဟုစနစ်၏ ဘုံအစိတ်အပိုင်သမျာသကို ဖယ်ရဟာသခဌင်သက မလိုအပ်သော ကော်ပီကူသထည့်ခဌင်သမျာသစလာကို ဖယ်ရဟာသနိုင်စေသော်လည်သ မတူညီသောပတ်ဝန်သကျင်အတလက် ဖလဲ့စည်သမဟုပုံစံတစ်ခုကို လိုက်လျောညီထလေဖဌစ်စေရန် ခလင့်မပဌုပါ - ကျလန်ုပ်တို့၏ဝန်ဆောင်မဟုမျာသ၏ အဆုံသမဟတ်မျာသသည် ထူသခဌာသပဌီသ ခက်ခက်ခဲခဲ ကုဒ်လုပ်ထာသသောကဌောင့် ဆိုသရလာသပါသည်။ ဒါကို ဖယ်ရဟာသဖို့ ကဌိုသစာသကဌည့်ရအောင်။

ကောင်သသောအဖဌေတစ်ခုသည် အခဌာသသူမျာသကိုသကာသနိုင်သော ဖလဲ့စည်သမဟုတစ်ခုတလင် အဆုံသမဟတ်အာသလုံသကို ထာသရဟိရန်ဖဌစ်သည်။ ကရည်ရလယ်ချက်အတလက်၊ placeholder မျာသအတလက် အထောက်အပံ့ကို မူဘောင်တလင် မိတ်ဆက်ခဲ့သည်။ ကသည်မဟာ configuration file သည် ပဌောင်သလဲသလာသမည်ဖဌစ်သည်။ ယူရီကာ:

 client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/

အခု ဒီနေရာက ဘယ်လိုအလုပ်လုပ်လဲ ကဌည့်ရအောင်။ စနစ်သည် အမည်ရဟိသော အစိတ်အပိုင်သတစ်ခုကို ရဟာဖလေသည်။ အဆုံသမဟတ် အဓိပ္ပါယ်ကိုရဟာပါ။ eurekaipထို့နောက် ၎င်သကို ကျလန်ုပ်တို့၏ဖလဲ့စည်သပုံတလင် အစာသထိုသသည်။ ဒါပေမယ့် မတူညီတဲ့ပတ်ဝန်သကျင်ကော။ ဒီလိုလုပ်ဖို့၊ setting ဖိုင်တစ်ခုဖန်တီသပါ။ အဆုံသမဟတ် အောက်ပါအမျိုသအစာသ application.dev.yaml. ဖိုင်တိုသချဲ့မဟုအပေါ်အခဌေခံ၍ မူဘောင်သည် မည်သည့်ပတ်ဝန်သကျင်တလင် ကဖလဲ့စည်သပုံဖလဲ့စည်သပုံနဟင့်သက်ဆိုင်သည်ကို ဆုံသဖဌတ်ပဌီသ ၎င်သကိုဖလင့်သည်-

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

Dev ဖိုင်အကဌောင်သအရာမျာသ-

eurekaip: 192.89.89.111
dbip: 192.168.0.100

ကျလန်ုပ်တို့၏ ဝန်ဆောင်မဟုမျာသ၏ ဆိပ်ကမ်သမျာသအတလက် တူညီသောပုံစံကို ဖန်တီသနိုင်သည်-

server.port: ${ports@order}.

အရေသကဌီသသော ဆက်တင်မျာသအာသလုံသကို တစ်နေရာတည်သတလင် တည်ရဟိစေပဌီသ ဖလဲ့စည်သမဟုဖိုင်မျာသတလင် ပဌန့်ကျဲနေသော ကန့်သတ်ဘောင်မျာသကဌောင့် အမဟာသအယလင်သမျာသ ဖဌစ်နိုင်ခဌေကို လျဟော့ချပေသသည်။

framework သည် အဆင်သင့်လုပ်ထာသသော placeholder အမျာသအပဌာသကို ပံ့ပိုသပေသသည်၊ ဥပမာအာသဖဌင့်၊ configuration file တည်ရဟိသည့် directory အမည်ကို သင်ရနိုင်ပဌီသ ၎င်သကို သတ်မဟတ်ပေသသည်-

#include eureka, oracle
server.port: ${ports@order}
spring.application.name: ${this@name}

၎င်သကိုကျေသဇူသတင်ပါသည်၊ ဖလဲ့စည်သမဟုပုံစံတလင် အပလီကေသရဟင်သအမည်ကို ထပ်လောင်သသတ်မဟတ်ရန်မလိုအပ်ဘဲ၊ ဥပမာအာသဖဌင့် တူညီသော eureka တလင် ၎င်သကို ဘုံ module တစ်ခုတလင် ထာသရဟိနိုင်သည်။

client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/
 spring.application.name: ${this@name}

ဖလဲ့စည်သမဟုဖိုင် အမိန့် တစ်ကဌောင်သသို့ လျဟော့ချမည်

#include eureka, oracle
server.port: ${ports@order}

ကျလန်ုပ်တို့သည် ပင်မဖလဲ့စည်သပုံစနစ်မဟ မည်သည့်ဆက်တင်ကိုမျဟ မလိုအပ်ပါက၊ ကျလန်ုပ်တို့သည် ၎င်သကို ကျလန်ုပ်တို့၏ဖလဲ့စည်သပုံပုံစံတလင် သတ်မဟတ်နိုင်ပဌီသ ၎င်သကို မျိုသဆက်အတလင်သ အသုံသချမည်ဖဌစ်သည်။ ဆိုလိုသည်မဟာ၊ ကျလန်ုပ်တို့သည် အမဟာစာဝန်ဆောင်မဟုအတလက် ထူသခဌာသသောအမည်တစ်ခု လိုအပ်ပါက၊ ကျလန်ုပ်တို့သည် ကန့်သတ်ဘောင်ကို ချန်ထာသခဲ့ပါမည်။ spring.application.name.

ဥပမာ၊ သီသခဌာသဖိုင်တစ်ခုတလင် သိမ်သဆည်သထာသသည့် ဝန်ဆောင်မဟုတလင် စိတ်ကဌိုက်မဟတ်တမ်သဆက်တင်မျာသကို သင်ထည့်သလင်သရန်လိုအပ်သည်ဆိုပါစို့၊ logback.xml. ၎င်သအတလက် သီသခဌာသဆက်တင်အုပ်စုတစ်ခုကို ဖန်တီသကဌပါစို့။

microconfig.io ဖဌင့် microservice configuration မျာသကို လလယ်ကူစလာ စီမံခန့်ခလဲပါ။

အခဌေခံဖလဲ့စည်သမဟုပုံစံတလင်၊ နေရာယူထာသသည့်ကိရိယာကိုအသုံသပဌု၍ ကျလန်ုပ်တို့လိုအပ်သော မဟတ်တမ်သဆက်တင်ဖိုင်ကို မည်သည့်နေရာတလင်ထာသရဟိရမည်ကို ကျလန်ုပ်တို့ပဌောပဌပါမည်။ @ConfigDir:

microconfig.template.logback.fromFile: ${logback@configDir}/logback.xml

ဖိုင်ထဲမဟာ logback.xml ကျလန်ုပ်တို့သည် စံအဆက်အစပ်မျာသကို စီစဉ်သတ်မဟတ်ပေသသည်၊ ဥပမာအာသဖဌင့်၊ ဥပမာ- configs မျိုသဆက်အတလင်သ မူဘောင်ပဌောင်သလဲသလာသမည့် placeholder မျာသလည်သ ပါဝင်နိုင်သည်၊

<file>logs/${this@name}.log</file>

ဝန်ဆောင်မဟုပုံစံမျာသကို ထည့်သလင်သခဌင်သဖဌင့် logbackဝန်ဆောင်မဟုတစ်ခုစီအတလက် ကျလန်ုပ်တို့ အလိုအလျောက် စီစဉ်သတ်မဟတ်ထာသသော မဟတ်တမ်သရယူခဌင်သဖဌစ်သည်-

#include eureka, oracle, logback
server.port: ${ports@order}

မူဘောင်၏ ရနိုင်သောနေရာမျာသအာသလုံသကို အသေသစိတ်သိရဟိနာသလည်ရန် အချိန်တန်ပဌီ-

${this@env} - လက်ရဟိပတ်ဝန်သကျင်၏အမည်ကို ပဌန်ပေသသည်။
${
@name} - အစိတ်အပိုင်သ၏အမည်ကို ပဌန်ပေသသည်။
${
@configDir} — အစိတ်အပိုင်သ၏ config directory သို့ လမ်သကဌောင်သအပဌည့်အစုံကို ပဌန်ပေသသည်။
${
@resultDir} — အစိတ်အပိုင်သ၏ ညသတည်ရာလမ်သကဌောင်သသို့ လမ်သကဌောင်သအပဌည့်အစုံကို ပဌန်ပေသသည် (ရလဒ်ဖိုင်မျာသကို ကလမ်သညလဟန်တလင် ထာသရဟိပါမည်)။
${this@configRoot} — configuration store ၏ root directory သို့ လမ်သကဌောင်သအပဌည့်အစုံကို ပဌန်ပေသသည်။

စနစ်သည် သင့်အာသ ပတ်၀န်သကျင်ပဌောင်သလလဲမဟုမျာသကိုလည်သ ရယူနိုင်စေသည်၊ ဥပမာအာသဖဌင့် java သို့ လမ်သကဌောင်သ
${env@JAVA_HOME}
ဘာပဲဖဌစ်ဖဌစ် ဘောင်ထဲမဟာ ရေသထာသတာဆိုတော့ JAVAခေါ်ဆိုမဟုနဟင့်ဆင်တူသော စနစ်ပဌောင်သလဲမဟုမျာသကို ကျလန်ုပ်တို့ရနိုင်သည်။ စနစ်::getProperty ကကဲ့သို့သောဖလဲ့စည်သပုံကိုအသုံသပဌုသည်-
${[အီသမေသလ်ကိုကာကလယ်ထာသသည်]}
တိုသချဲ့ဘာသာစကာသအတလက် ပံ့ပိုသမဟုကို ဖော်ပဌရကျိုသနပ်သည်။ နလေညသ EL. ဖလဲ့စည်သမဟုပုံစံတလင် အောက်ပါအသုံသအနဟုန်သမျာသကို အသုံသပဌုနိုင်ပါသည်-

connection.timeoutInMs: #{5 * 60 * 1000}
datasource.maximum-pool-size: #{${[email protected]} + 10} 

နဟင့် သင်သည် စကာသရပ်ကို အသုံသပဌု၍ configuration files မျာသတလင် local variable မျာသကို သုံသနိုင်သည်။ #var:

#var feedRoot: ${[email protected]}/feed
folder:
 root: ${this@feedRoot}
 success: ${this@feedRoot}/archive
 error: ${this@feedRoot}/error

ထို့ကဌောင့်၊ framework သည် microservices မျာသ၏ fine-tuning နဟင့် flexible configuration အတလက် အတော်လေသ အစလမ်သထက်သော tool တစ်ခုဖဌစ်သည်။ မူဘောင်သည် ၎င်သ၏အဓိကတာဝန်ကို ပဌီသပဌည့်စုံစလာ ဖဌည့်ဆည်သပေသသည် - ဆက်တင်မျာသတလင် ကော်ပီကူသထည့်ခဌင်သကို ဖယ်ရဟာသခဌင်သ၊ ဆက်တင်မျာသကို ပေါင်သစည်သခဌင်သ နဟင့် ရလဒ်အနေဖဌင့် ဖဌစ်နိုင်ချေရဟိသော အမဟာသအယလင်သမျာသကို နည်သပါသအောင် ပဌုလုပ်ပေသကာ လလယ်ကူစလာ ပေါင်သစပ်ဖလဲ့စည်သမဟုမျာသကို ပေါင်သစပ်ကာ မတူညီသောပတ်ဝန်သကျင်အတလက် ၎င်သတို့ကို ပဌောင်သလဲနိုင်စေပါသည်။

အကယ်၍ သင်သည် ကမူဘောင်ကို စိတ်ဝင်စာသပါက ၎င်သ၏တရာသဝင်စာမျက်နဟာသို့ ဝင်ရောက်ကဌည့်ရဟုပဌီသ အပဌည့်အစုံနဟင့် သိကျလမ်သရန် အကဌံပဌုလိုပါသည်။ စာရလက်စာတမ်သသို့မဟုတ် အရင်သအမဌစ်မျာသကို ရဟာဖလေပါ။ ဒီမဟာ.

source: www.habr.com

မဟတ်ချက် Add