.

异数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. 用webAudio和canvas实现音频可视化

    前两天遇到了要显示音频波形图的需求,因为时间紧,就直接用了wavesufer.js,这两天有空,就研究了一下怎么用webAudio实现音频的可视化. 大致流程是对音源进行解析,解析得到的数据是个频谱数 ...

  2. vueX中使用namespaced

    用法: namespaced:true; getter调用时: this.$store.getters['XXX/getXXX']; commit调用时: this.$store.commit('XX ...

  3. CF809D Hitchhiking in the Baltic States

    CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...

  4. Keras lstm 文本分类示例

    #基于IMDB数据集的简单文本分类任务 #一层embedding层+一层lstm层+一层全连接层 #基于Keras 2.1.1 Tensorflow 1.4.0 代码: '''Trains an LS ...

  5. mac如何查看已连接wifi的密码

    可以通道mac自带的“钥匙串访问”功能查看.选择需要查询的wifi名称,右击选择“将密码拷贝到剪贴板”,输入管理员密码后,密码就拷贝好了. 找个地方粘贴即可看到密码

  6. Omnigraffle 许可证

    名字:Appked 序列号:MFWG-GHEB-HYTW-CGHT-CSXU-QCNC-SXU

  7. [梁山好汉说IT] 区块链在梁山的应用

    [梁山好汉说IT] 区块链在梁山的应用 0x00 摘要 区块链属于一种去中心分布式数据存储系统,有其擅长的应用场景,也有其缺点. 下面用梁山为例来阐释下区块链部分概念&应用. 0x01 梁山好 ...

  8. 构建锁与同步组件的基石AQS:深入AQS的实现原理与源码分析

    Java并发包(JUC)中提供了很多并发工具,这其中,很多我们耳熟能详的并发工具,譬如ReentrangLock.Semaphore,它们的实现都用到了一个共同的基类--AbstractQueuedS ...

  9. cookies 与session

    cookies :存放在浏览器(客户端)的用户信息 - 优点: 可以将数据存在客户端一方: - 缺点: 不安全,可以存放多份,导致服务端占用空间过大 session :存放在服务端的用户信息 - 优点 ...

  10. HTML和JavaScript代码分离、平稳退化(1)

    使用的编辑器是Hbuilder,浏览器是Chrome. HTML和JavaScript代码分离,会使得修改网页功能和代码的阅读与维护会轻松的许多,不用在DOM中阅读大量的JavaScript代码. 文 ...