異數OS 星星之火(三)--異數OS-織夢師雲 微服務編寫入門
.
異數OS 星星之火(三)–異數OS-織夢師雲 微服務編寫入門
本文來自異數OS社群
github: https://github.com/yds086/HereticOS
異數OS社群QQ群: 652455784
異數OS-織夢師(訊息中介軟體 ,遊戲開發方向)群: 476260389
異數OS-織夢師-Xnign(Nginx方向)群: 859548384
什麼是異數OS微服務
異數OS在做容器化改造後提供了容器多服務例項能力,以此提供多租戶多使用者的使用環境,未來異數OS的系統元件以及使用者應用元件都以微服務的形式來設計實現,比如檔案系統,自定義tcp協議棧等。使用者可以考慮在異數OS閉源授權協議下編寫自己的服務產品來整合到異數OS平臺,因此本文介紹使用者如何編寫微服務。
異數OS微服務怎麼寫
異數OS是高效能作業系統,高效能的程式是不能隨便寫的,還是需要注意一些事項,目前只提供C++的微服務寫法,未來可能的話也可能會提供php js等擴充套件。
下面是Xnign服務的程式碼案例,完整程式碼請去社群尋共享翻閱
class XnignService : public HereticThread<XnignService>
{
public:
XnignService() {};
~XnignService() {};
ULONGLONG nWaitTime;
XnignStatisticsInfo m_OwnInfo;
HereticEvent<int, true> m_WaitEvent;
struct XnignState
{
unsigned int bNeedClose : 1; //系統請求關閉服務
unsigned int bCanClose : 1; //表示服務目前可以關閉
unsigned int bClosed : 1; //表示服務目前已關閉
unsigned int bNeedEntryPower : 1; //系統請求進入目標電源狀態
unsigned int nNeedEntryPower : 2; //表示系統當前請求的電源狀態
unsigned int nCanEntryPower : 2; //表示服務目前可以進入的最低電源狀態
};
unsigned int m_nServiceID;
XnignState m_XnignState;
bool Input(const char * pszInput) {
ContainerThreadError(_T("XnignService-%d Input %s"), m_nServiceID, pszInput);
return true;
};
bool PowerEntry(SystemPowerState & State) {
/*
enum SystemPowerState
{
PowerState_S0 = 1, // 高效能全速
PowerState_S1, // IDLE低負載
PowerState_S2, // RAM駐留,任務排程暫停
PowerState_S3 // 關機,需要做資料持久化
};
*/
switch (State)
{
case SystemPowerState::PowerState_S0:
break;
case SystemPowerState::PowerState_S1:
break;
case SystemPowerState::PowerState_S2:
break;
case SystemPowerState::PowerState_S3:
break;
}
m_XnignState.bNeedEntryPower = 1;
m_XnignState.nNeedEntryPower = State;
if (m_XnignState.nCanEntryPower > State)
{
return true;
}
return false;
};
bool StartService(unsigned int nServiceID,const char * pszCommand) {
bool bOk=BindTcpServerByContainerThread(HttpCacheStubThreadT::TcpRpcServerT, 79,this);
if(bOk)BindTcpServerByContainerThread(HttpServer::TcpSocketT, 80,this);
ContainerThreadError(_T("XnignService-%d StartService %s %s"), nServiceID, pszCommand,(bOk)?_T("OK"):_T("Fail"));
if (bOk == false)
{
m_XnignState.bNeedClose = true;
m_WaitEvent.SetEvent();
}
m_nServiceID = nServiceID;
memset(&m_OwnInfo, 0, sizeof(m_OwnInfo));
return bOk;
};
bool StopService() {
ContainerThreadError(_T("XnignService-%d StopService "), m_nServiceID);
return true;
};
bool CloseService() {
ContainerThreadError(_T("XnignService-%d CloseService bCanClose=%d"), m_nServiceID, m_XnignState.bCanClose);
if (m_XnignState.bCanClose)
{
return true;
}
UnBindTcpServerByContainerThread(HttpCacheStubThreadT::TcpRpcServerT, 79, this);
UnBindTcpServerByContainerThread(HttpServer::TcpSocketT, 80, this);
m_XnignState.bNeedClose = 1;
m_WaitEvent.SetEvent();
return false;
};
void Init() {
nWaitTime = ::GetTickCount64();
memset(&m_XnignState, 0, sizeof(m_XnignState));
};
void Close() {
ContainerThreadError(_T("XnignService-%d Thread Close "), m_nServiceID);
};
void Loop(void * pContext = NULL);
private:
};
OPTIMIZE_OFF
void XnignService::Loop(void * pContext)
{
USING_HERETICOS_THREAD;
ContainerThreadError(_T("XnignService begin..."));
for (;;)
{
XOS_Wait(m_WaitEvent);
if (m_XnignState.bNeedClose)
{
for (;;)
{
if (m_OwnInfo.g_nCurrentServerLinkCount == 0)
{
m_XnignState.bCanClose = 1;//系統可以關閉服務了
break;
}
XOS_Sleep_Name(_WaitHttpServerClose, 100);
}
}
}
ContainerThreadError(_T("XnignService exit..."));
ExitThread();
}
OPTIMIZE_OFF_END
微服務的組成介面介紹
1.成為一個異數OS執行緒
建一個類Test,public HereticThread,然後實現執行緒需要的3個介面init close loop.
2.實現微服務介面
bool StartService(unsigned int nServiceID,const char * pszCommand),使用者啟動服務是呼叫
bool CloseService(),使用者關閉服務是呼叫
bool PowerEntry(SystemPowerState & State) 使用者關閉系統或者系統電源狀態發生改變是請求服務是否能進入目標狀態,如果不能進入目標狀態則返回false ,系統會再下一個電源週期再次請求進入,使用者需要自己實現一個服務狀態機來互動式響應系統電源狀態以滿足需求,比如關機資料持久化等能力。
bool Input(const char * pszInput) 服務執行後,使用者可以對服務輸入執行時命令,服務通過該介面響應使用者輸入的命令。
3.微服務的註冊,填充如下結構體,標明服務名,類例項,版權資訊,啟動型別(系統自啟,容器自啟,單例)
struct ServiceInfo
{
ServiceFactoryInterface * pServiceFactory;
unsigned int nServiceType;
char * pszServiceName;
char * pszServiceDesc;
char * pszServiceVer;
char * pszAuthor;
char * pszCopyright;
char * pszHelp;
};
#define SERVICE_TYPE_NONE 0x0 //預設啟動型別,使用者手動啟動,可多例啟動
#define SERVICE_TYPE_SYSTEM_ROOT 0x1 //系統啟動時自啟
#define SERVICE_TYPE_CONTAINER_ROOT 0x2 //容器啟動時自啟
#define SERVICE_TYPE_CONTAINER_SINGLE_INSTANCE 0x4 //單例啟動(每容器)
#define SERVICE_TYPE_SYSTEM_SINGLE_INSTANCE 0x8 //單例啟動(每系統)
定義一個ServiceInfo服務註冊資訊結構
{
&ServiceFactory<XnignService>::GetInstance(),
SERVICE_TYPE_CONTAINER_ROOT,
"Xnign",
"織夢師-Xnign http server.",
"0.1",
"往事",
"HereticOS,往事",
""
}
未來計劃
目前由於沒有做檔案系統,因此沒有完整的實現容器映象功能,後面會實現虛擬容器概念,來將映象動態分配類執行時的物理容器。