前言

  相信大家在没有接触过框架之前,都自己或多或少的开发过一些应用服务。每个应用服务除了业务配置还有很多环境配置,资源配置等,这些跟部署相关的配置。服务跟配置文件是一种静态绑定的方式,更新配置还需要重启服务;即使要支持热加载配置,还需要自己实现一套机制。这种静态的方式缺乏灵活性,而且在微服务盛行的今天,无法应对服务的集中配置管理的需求。

  为了解决这一问题,服务配置器模式(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的更多相关文章

  1. windows下共享式服务开发

    参考: https://blog.csdn.net/dongyewolong/article/details/8164873 https://blog.csdn.net/qwertyupoiuytr/ ...

  2. 5分钟搭建wordpress个人博客网站——宝塔傻瓜式部署,无坑系列,附赠主题和md插件[2021-12-31]

    一.前言 自从买了服务器,小编已经马不停蹄的学了两天服务搭建的知识,问了很多大佬,快速搭建自己的博客网站.有四种方式,我在这里全部分享给大家.自己已经搭建好,欢迎大家过来看一下,给你提供个思路哈! 小 ...

  3. 在线App开发平台——应用之星傻瓜式开发平台

    随着智能手机及APP应用程序的普及,越来越多的企业和个人意识到APP的营销价值,出于对技术的敬畏,很多企业下意识认为开发APP是一个有难度的技术活,所以很多时候有心无力,也担心APP的后续的技术支持. ...

  4. Agile.Net 组件式开发平台 - 服务开发示例

    在上一篇文章中已经讲解了组件的开发,这篇文章讲解平台服务开发. Agile.Net开发管理平台项目,已经托管在开源中国码云平台(http://git.oschina.net) 登陆码云平台进入项目主页 ...

  5. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一) 写下此文章只为了记录Surging微服务学习过程,并且分享给广大想学习surging的基友,方便广大 ...

  6. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二)

    原文:.NetCore微服务Surging新手傻瓜式 入门教程 学习日志---结构简介(二) 先上项目解决方案图: 以上可以看出项目结构可以划分为4大块,1是surging的核心底层,2,3,4都可以 ...

  7. SuperMap iObject入门开发系列之一组件式GIS开发平台介绍

    本文是一位好友“炀炀”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢.平台介绍:SuperMap iObjects Java/.NET 是面向GIS应用系统开发者的组件式GIS开发平台,具有强 ...

  8. .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    作者:依乐祝 原本链接:https://www.cnblogs.com/yilezhu/p/9947905.html 引子 为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net ...

  9. Webpack傻瓜式指南(转)

    add by zhj: 作者写了三篇文章,这是第一篇幅,另外两篇参见 https://zhuanlan.zhihu.com/p/20397902 https://zhuanlan.zhihu.com/ ...

随机推荐

  1. [日常摸鱼]UVA393 The Doors 简单计算几何+最短路

    The  Boy Next   Doors 题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点 ...

  2. Yii2 给表添加字段后报错 Getting unknown property

    手动在数据库中添加了image字段 然后再模型类Image中的 rule方法也将image的验证规则放进去了 但是在 $model = new Image 后,使用$model->iamge 还 ...

  3. Spring Cloud Alibaba基础教程-Nacos(二)

    在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...

  4. wuter 使用了腾讯云Ubuntu系统,但是没有root权限怎么办?

    友情链接: 手把手教你搭饥荒专用服务器(一)-服务器准备工作 手把手教你搭饥荒专用服务器(二)-环境配置及基本使用 手把手教你搭饥荒专用服务器(三)-MOD及其他高级设置 手把手教你搭饥荒专用服务器( ...

  5. springcloud执行流程理解图

    执行流程图

  6. redis scan 命令指南

    redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...

  7. 详解Js加法运算符

    简介 JavaScript是一门了不起的语言.我喜欢它的灵活性:只需以你喜欢的方式做事:更改变量类型,动态的向对象添加方法或属性,对不同的变量类型使用运算符等等. 然而动态是要付出代价的,开发人员需要 ...

  8. R绘图(1): 在散点图边缘加上直方图/密度图/箱型图

    当我们在绘制散点图的时候,可能会遇到点特别多的情况,这时点与点之间过度重合,影响我们对图的认知.为了更好地反映特征,我们可以加上点的密度信息,比如在原来散点所在的位置将密度用热图的形式呈现出来,再比如 ...

  9. CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考

    CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性  可用性   分区容错性] BASE理论是对CAP中 ...

  10. container_of 宏

    宏的作用 该宏的作用就是根据结构体中一个成员变量的地址求结构体首地址 如何做到 如果要想根据结构体成员的地址求结构体的首地址,我们需要分三步: 第一步:明确成员变量的地址: 第二步:计算成员变量在该结 ...