.

异数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,往事",
""
}

未来计划

目前由于没有做文件系统,因此没有完整的实现容器镜像功能,后面会实现虚拟容器概念,来将镜像动态分配类运行时的物理容器。

异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门的更多相关文章

  1. 异数OS 织梦师-云(五)-- 容器服务化,绿色拯救未来。

    . 异数OS 织梦师-云(五)– 容器服务化,绿色拯救未来. 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652 ...

  2. 异数OS 星星之火(一)-- 异数OS-织梦师云 用户使用手册

    . 异数OS 星星之火(一)– 异数OS-织梦师云 用户使用手册 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 6 ...

  3. 异数OS 织梦师-水桶(三)-- RAM共享存储方案

    . 异数OS 织梦师-水桶(三)– RAM共享存储方案 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455 ...

  4. 异数OS 织梦师-Xnign(四)-- 挑战100倍速Nginx,脚踩F5硬件负载均衡

    . 异数OS 织梦师-Xnign(四)– 挑战100倍速Nginx,脚踩F5硬件负载均衡 本文来自异数OS社区 github: https://github.com/yds086/HereticOS ...

  5. 异数OS 织梦师-纤手(二)-- LPC RPC篇

    异数OS 织梦师-纤手(二)– LPC RPC篇 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455784 ...

  6. 异数OS 织梦师-水母(一)--消息队列篇

    异数OS 织梦师-水母(一)–消息队列篇 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455784 异数O ...

  7. 微服务(入门三):netcore ocelot api网关结合consul服务发现

    简介 api网关是提供给外部调用的统一入口,类似于dns,所有的请求统一先到api网关,由api网关进行指定内网链接. ocelot是基于netcore开发的开源API网关项目,功能强大,使用方便,它 ...

  8. 一片非常有趣的文章 三分钟读懂TT猫分布式、微服务和集群之路

    原文http://www.cnblogs.com/smallSevens/p/7501932.html#3782600 三分钟读懂TT猫分布式.微服务和集群之路   针对新手入门的普及,有过大型网站技 ...

  9. 三分钟读懂TT猫分布式、微服务和集群之路

    针对入门新手的普及,有过大型网站技术架构牛人路过,别耽误浪费了时间,阅读之前,请确保有一定的网络基础,熟练使用Linux,浏览大概需要3-5分钟的时间,结尾有彩蛋. 目录 分布式 微服务 负载均衡集群 ...

随机推荐

  1. vue 使用webpack打包后路径报错以及 alias 的使用

    一.vue 使用webpack打包后路径报错(两步解决) 1. config文件夹 ==> index.js ==> 把assetsPublicPath的 '/ '改为 './' 2. b ...

  2. H3C网络监测工具命令

    1.Debugging 2.Display debugging 3.Display diagnostic-information display diagnostic-information 命令用来 ...

  3. Teleport ultra/IDM(Internet Download Manager)

    神器扒网站——teleport ultra IDM(Internet Download Manager) 在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它搞下来,自己手工 ...

  4. ajaxStart()和ajaxStop()方法

    使用ajaxSetup()方法设置全局Ajax默认选项 使用ajaxSetup()方法可以设置Ajax请求的一些全局性选项值,设置完成后,后面的Ajax请求将不需要再添加这些选项值,它的调用格式为: ...

  5. 阿里云“网红&quot;运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...

  6. 如何在ClickOnce 应用中使用 GitVersion

    https://github.com/GitTools/GitVersion/issues/1153 I'm using GitVersion in an internal ClickOnce app ...

  7. Nmap基本使用

    Nmap ​ Network Mapper ​ 一款开源免费的网络发现和安全审计工具. 用途 ​ 列举网络主机清单 ​ 监控主机或服务运行状况 ​ 管理服务升级调度 ​ 检测目标主机是否在线 ​ 检测 ...

  8. 洛谷$P2057\ [SHOI2007]$ 善意的投票 网络流

    正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表 ...

  9. $Poj2083/AcWing118\ Fractal$ 模拟

    $AcWing$ $Sol$ 一年前做过差不多的南蛮图腾,当时做出来还是很有成就感的$OvO$ $N<=7$,就是模拟模拟,预处理一下,$over$ $Code$ #include<bit ...

  10. 曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...