.

异数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-C#-await-高级用法

    title author date CreateTime categories C# await 高级用法 lindexi 2019-08-31 16:55:58 +0800 2018-2-13 17 ...

  2. Nodejs之使用express框架搭建WEB应用

      首先创建一个index.js,在里面引入相关的中间件,如果没有这些中间件,则需要在nodejs里进入index.js所在的文件夹安装这些模块,安装命令:npm install express ex ...

  3. Spring Boot 嵌入式Web容器

    目录 前言 1.起源 2.容器启动流程解析 2.1.获取应用类型 2.2.容器启动流程 3.加载 Web 容器工厂 4.总结 前言         最近在学习Spring Boot相关的课程,过程中以 ...

  4. Spark RDD的弹性到底指什么

    RDD(Resiliennt Distributed Datasets)抽象弹性分布式数据集对于Spark来说的弹性计算到底提现在什么地方? 自动进行内存和磁盘数据这两种存储方式的切换 Spark 可 ...

  5. 基于ambassador实现K8S灰度发布

    为什么需要灰度发布 灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式.在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对 ...

  6. 第一次看CCControl

    Control中有九种可能的事件,定义在.h文件中,另外还定义四种状态,用来表示控件高亮等. 在初始化控件的时候: bool Control::init() { if (Layer::init()) ...

  7. Kafka原理及应用(一)

    一. Kafka简介 (1) 消息中间件的两种实现模式 JMS (Java Message Service) 对消息的发送和接收定义了两种模式: 点对点模式:消息的生产和消费者均只有一个,消息由生产者 ...

  8. 解决springmvc报错,java.lang.IllegalArgumentException:No converter found for return value of type: class .......

    1.背景 最近在自学java中的三大框架 ssm,在 springmvc 与 mybatis 整合过程中用到 json 数据交互.因为看的视频的是比较早的嘛,一些配置.jar包什么的,要么跟 jdk ...

  9. Stripe支付对接

    一.由于文档丢失原因,我就直接上代码了. 这个Stripe支付可以支持多个币种,我下面就采用"HDK"来参照支付先上一个支付效果图  提示:先上代码,在说明博主自己理解的流程. 一 ...

  10. Eclipse中安装LEAP插件

    点击eclipse中顶部菜单栏中 Help 项,选择 Install New Software... 项 在弹出安装窗口中点击 Add... 在弹出的添加安装软件的窗口中点击 Local... 选择插 ...