.

异数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. 2019-8-31-How-to-fix-nuget-Unrecognized-license-type-MIT-when-pack

    title author date CreateTime categories How to fix nuget Unrecognized license type MIT when pack lin ...

  2. VJhrbustacm0304专题一题解

    L:搬果子 用一般的priority_queue做就可以了. 优先队列//扔进去就能自动排序的序列,记得T组数据要pop干净 #include<iostream> #include< ...

  3. Flutter 添加阴影效果

    Container( width: double.infinity, height: ScreenUtil.getInstance().setHeight(500), decoration: BoxD ...

  4. UI自动化测试框架 ---TestCafe

    UI自动化测试框架 ---TestCafe 官网文档链接: https://devexpress.github.io/testcafe/ https://devexpress.github.io/te ...

  5. C#反射与特性(一):反射基础

    目录 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 2. 程序集操作 2.1 获取 程序集对象(Assembly) 2.2 Assembly 使用 2.3 获取程序集的方式 C# ...

  6. linux下tomcat相关的命令

    1.查看Tomcat是否以关闭 ps -ef|grep tomcat 2.直接干掉Tomcat可以使用kill命令,直接杀死Tomcat进程(这个命令用在当你关闭tomcat报错的时候直接杀死进程) ...

  7. .NetCore集成Dapr踩坑经历

    该篇内容由个人博客点击跳转同步更新!转载请注明出处 前言 之前自己有个core2.2的项目一直是用的Surging作为微服务框架的,后来了解到了Dapr,发现比较轻量级,开发部署等也非常方便,故将自己 ...

  8. Kafka学习笔记(四)—— API使用

    Kafka学习笔记(四)-- API使用 1.Producer API 1.1 消息发送流程 Kafka的Producer发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了两个线程--mai ...

  9. DEVOPS技术实践_04:Jenkins参数化构建

    一.参数化构建 1.1 各个参数的信息 凭据参数存储一个用户的账号密码信息,等等,运用最多的是选项参数 1.2 使用选项参数 构建已经变成参数化构建 1.3 获取这个值,修改Jenkinsfile文件 ...

  10. 百度地图addEventListener“赋值”参数

    实现点击百度地图上的覆盖物,然后获取覆盖上的属性,进而实现数据传送. var pointArray=new Array();//创建一个数组存储坐标 /*在地图上标点*/ function ShowA ...