Ice系列--傻瓜式服务开发IceBox
前言
相信大家在没有接触过框架之前,都自己或多或少的开发过一些应用服务。每个应用服务除了业务配置还有很多环境配置,资源配置等,这些跟部署相关的配置。服务跟配置文件是一种静态绑定的方式,更新配置还需要重启服务;即使要支持热加载配置,还需要自己实现一套机制。这种静态的方式缺乏灵活性,而且在微服务盛行的今天,无法应对服务的集中配置管理的需求。
为了解决这一问题,服务配置器模式(The Service Configurator pattern)被提了出来。服务配置器模式主要思想就是将服务实现与配置分离,实际上这就意味着配置进入通用超级服务(也就是服务管理程序)的服务程序可以被动态的加载。IceBox就是一种基于服务配置器模式实现的框架。
一个IceBox Server可以替换一个平时开发的庞大Ice Server。IceBox Server可以通过特定功能的服务进行远程配置。IceBox框架有以下几个优点:
- 配置进同一个IceBox Server的服务可以进行组合优化。例如Service-A和Service-B都配置在同一个IceBox Server时,Service-A调用Service-B的操作不需要走通常的RPC调用流程,直接可以像本地调用一样,不走TCP/UDP网络。
- 可以直接通过配置组成一个应用,不再需要编译链接。使得服务与应用分离,使得服务可以根据需要被组合和拆分。
- 对于Java应用而言,多个服务被组合在一个JVM实例中,相比于运行多个JVM实例的庞大应用服务,节约了系统资源。
- IceBox支持被集成到IceGrid中,可以进行统一的服务管理和部署。
开发IceBox服务
IceBox Service的接口
写一个IceBox服务需要实现IceBox Service的接口,一个启动服务接口--“start”,一个停止服务接口--"stop"。slice定义如下:
module IceBox
{
local interface Service
{
void start(string name, Ice::Communicator communicator,
Ice::StringSeq args);
void stop();
}
}
Ice服务实例(C++11)
完整源码见:https://github.com/GodMonking/ice-demo/tree/main/IceBox
slice文件
module Demo { interface Hello{ void HelloWorld(); } }
上述接口Hello的实现类HelloI参考《Ice框架介绍》中的例子。
接下来实现一个IceBox服务,继承IceBox::Service,并实现启动和停止接口即可,代码实现如下:
//HelloServiceI.h #include <IceBox/IceBox.h> class HelloServiceI : public IceBox::Service
{
public:
virtual void start(const std::string&, const std::shared_ptr<Ice::Communicator>&, const Ice::StringSeq&) override;
virtual void stop() override;
private:
std::shared_ptr<Ice::ObjectAdapter> _adapter;
};
//HelloServiceI.cpp #include <Ice/Ice.h>
#include <HelloServiceI.h>
#include <HelloI.h> using namespace std;
using namespace Demo;
extern "C"
{
ICE_DECLSPEC_EXPORT IceBox::Service*
create(const shared_ptr<Ice::Communicator>&)
{
return new HelloServiceI;
}
} void
HelloServiceI::start(const string &name,
const shared_ptr<Ice::Communicator>& communicator,
const Ice::StringSeq& args)
{
_adapter = communicator->createObjectAdapter(name);
auto object = make_shared<HelloI>();
_adapter->add(object, Ice::stringToIdentity("HelloImp"));
_adapter->activate();
cout << "service start complete" << endl;
} void
HelloServiceI::stop()
{
_adapter->deactivate();
}
函数接口create就是IceBox服务实例创建入口。
Makefile如下:
CPP=c++
CXXFLAGS= -g -DICE_CPP11_MAPPING -m64 -O0 -fPIC -std=c++11
INC= -I.
LINK_LIB= -lIce++11 -lpthread all: helloserver client HelloServiceI.o:HelloServiceI.cpp HelloServiceI.h
$(CPP) $(CXXFLAGS) $(INC) -c HelloServiceI.cpp
Client.o:Client.cpp Hello.h
$(CPP) $(CXXFLAGS) $(INC) -c Client.cpp
Hello.o:Hello.cpp Hello.h
$(CPP) $(CXXFLAGS) $(INC) -c Hello.cpp
HelloI.o:Hello.cpp Hello.h
$(CPP) $(CXXFLAGS) $(INC) -c HelloI.cpp helloserver:HelloServiceI.o Hello.o HelloI.o
$(CPP) -shared -o libHelloI++11.so HelloServiceI.o Hello.o HelloI.o $(LINK_LIB)
client:Client.o Hello.o
$(CPP) -o client Client.o Hello.o $(LINK_LIB) clean:
rm *.o libHelloI++11.so client -rf
最终编译得到libHelloI++11.so,即服务以动态库的形式被IceBox加载。服务启动命令:
icebox++11 –Ice.Config=config_path
配置IceBox服务
配置文件config-v1
IceBox.InstanceName=Mongking 1
IceBox.InheritProperties=1
IceBox.PrintServicesReady=MkIceBox 1
IceBox.ServiceManager.Endpoints=tcp -p 9999 #performance properties
IceBox.ThreadPool.Server.Size=4
IceBox.ThreadPool.Server.SizeMax=100
IceBox.ThreadPool.Server.SizeWarn=40
IceBox.ThreadPool.Client.Size=4
IceBox.ThreadPool.Client.SizeMax=100
IceBox.ThreadPool.Client.SizeWarn=40 #for system stronger
Ice.ACM.Client=300
Ice.ACM.Server=300 #log and trace
#Ice.LogFile=iceserver.log
Ice.PrintStackTraces=1
Ice.Trace.Network=2
Ice.Trace.ThreadPool=1
Ice.Warn.Connections=1
Ice.Warn.Dispatch=1
Ice.Warn.Endpoints=1 #服务配置
IceBox.Service.Hello=HelloI:create
Hello.Endpoints=tcp -p 20000
这里重点解释一下最后两行配置,“IceBox.Service.Hello”定义了一个名为Hello的IceBox服务,而值“HelloI:create”指明了该服务实例创建的入口即动态库libHelloI++11.so的create函数。
“Hello.Endpoints”表示Hello服务地址端口。
当然我们也可以配置多个服务实例到IceBox中,Config-v2:
…
#服务配置
IceBox.Service.Hello1=HelloI:create
Hello.Endpoints=tcp -p 20001
IceBox.Service.Hello2=HelloI:create
Hello.Endpoints=tcp -p 20002
IceBox.Service.Hello3=HelloI:create
Hello.Endpoints=tcp -p 20003
结尾
IceBox作为Ice架构体系中非常重要的组件,分离了服务实现和配置管理,简化了服务开发和提高了配置的灵活性,是基于IceGrid灵活部署方案的基础。
Ice系列--傻瓜式服务开发IceBox的更多相关文章
- windows下共享式服务开发
参考: https://blog.csdn.net/dongyewolong/article/details/8164873 https://blog.csdn.net/qwertyupoiuytr/ ...
- 5分钟搭建wordpress个人博客网站——宝塔傻瓜式部署,无坑系列,附赠主题和md插件[2021-12-31]
一.前言 自从买了服务器,小编已经马不停蹄的学了两天服务搭建的知识,问了很多大佬,快速搭建自己的博客网站.有四种方式,我在这里全部分享给大家.自己已经搭建好,欢迎大家过来看一下,给你提供个思路哈! 小 ...
- 在线App开发平台——应用之星傻瓜式开发平台
随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...
- Agile.Net 组件式开发平台 - 服务开发示例
在上一篇文章中已经讲解了组件的开发,这篇文章讲解平台服务开发. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina.net) 登陆码云平台进入项目主页 ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)
原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...
- SuperMap iObject入门开发系列之一组件式GIS开发平台介绍
本文是一位好友“炀炀”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢.平台介绍:SuperMap iObjects Java/.NET 是面向GIS应用系统开发者的组件式GIS开发平台,具有强 ...
- .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
作者:依乐祝 原本链接:https://www.cnblogs.com/yilezhu/p/9947905.html 引子 为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net ...
- Webpack傻瓜式指南(转)
add by zhj: 作者写了三篇文章,这是第一篇幅,另外两篇参见 https://zhuanlan.zhihu.com/p/20397902 https://zhuanlan.zhihu.com/ ...
随机推荐
- Elastic Search 学习之路(三)—— tutorial demo
一.ElasticSearch tutorial demo example 1. 单机.local.CRUD操作 实现方式: SpringBoot + ElasticSearch 拷贝的小demo,原 ...
- 深度图解Redis Cluster原理
不想谈好吉他的撸铁狗,不是好的程序员,欢迎微信关注「SH的全栈笔记」 前言 上文我们聊了基于Sentinel的Redis高可用架构,了解了Redis基于读写分离的主从架构,同时也知道当Redis的ma ...
- [日常摸鱼]poj2778 DNA Sequence
这题太神啦 题意:求长度为$n$的不包含给定DNA序列的DNA序列个数,给定的不超过10个 构建出Trie图,用$danger[i]$来表示不能走到$i$,对于DNA序列结尾的结点$danger$设为 ...
- hugging face-基于pytorch-bert的中文文本分类
1.安装hugging face的transformers pip install transformers 2.下载相关文件 字表: wget http://52.216.242.246/model ...
- html嵌入腾讯视频的方法
1.首先我们从腾讯视频网站上找到一个视频网页的连接,格式是这样的 https://v.qq.com/x/page/b0136et5ztz.html 上面我标红色的是视频的vid 2.我们把vid放到接 ...
- double 转为long类型
System.out.println(new Double(234314.999999999).longValue());//234314 System.out.println(new Double ...
- easyui中权限分配和添加 前后端代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- python使用smtplib和email库发送邮件
国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...
- 在Ubuntu14.04下配置Samba 完成linux和windows之间的文件共享
在Windows和Linux之间传递文件可以使用Samba服务.下面是安装步骤: 1. 安装Samba. sudo apt-get install samba 2. 修改配置文件 sudo gedit ...
- .NETCore使用EntityFrameworkCore连接数据库生成实体
EF Core 通过数据库提供程序插件模型与 SQL Server/SQL Azure.SQLite.Azure Cosmos DB.MySQL.PostgreSQL 和更多数据库配合使用. 使用EF ...