前言

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

  为了解决这一问题,服务配置器模式(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. Clickhouse 在大数据分析平台 - 留存分析上的应用

    导语 | 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案.同时,除了留存分析,对于用户群分析,事件分析等也可以尝试用此方案来解决. 文章作者: ...

  2. Bug java 安全证书

    在一个改修项目里,安全性方面总是出一个bug,错误信息如下: xception in thread "main" javax.crypto.BadPaddingException: ...

  3. BullseyeCoverage——C/C++代码覆盖率分析工具

    安装 官网下载地址: https://www.bullseye.com/cgi-bin/download 安装过程中需要License, 可以申请评估版本的key或者直接从官网渠道购买. Ubuntu ...

  4. Erlang那些事儿第2回之我是模块(module),一文件一模块

    前几篇文章会写得比较基础,但是既然要写一系列的文章,还是得从基础开始写.我刚学Erlang碰到最大的问题是,想网上搜索下语法,结果却是寥寥无几,而且介绍得不是很系统,对我了解一些细节是有影响的,正好我 ...

  5. python菜鸟教程学习:数据结构

    列表方法 list.append(x):把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]. list.extend(L):通过添加指定列表的所有元素来扩充列表,相当于 a[len( ...

  6. ASP.NET Core 中间件 自定义全局异常中间件以及 MVC异常过滤器作用

    中间件是一种装配到应用管道以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 请求委托用于生成请求管道. 请求委托处理每个 HTTP ...

  7. Autofac的基本使用---1、前言

    Autofac的基本使用---目录 代码地址 https://github.com/catbiscuit/AutofacStudy 参考网上的大神,原博文地址 https://www.cnblogs. ...

  8. JVM 经典垃圾收集器

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者.Java 虚拟机规范中对垃圾收集器的实现做出规定,因此不同的厂 ...

  9. 前置机器学习(五):30分钟掌握常用Matplitlib用法

    Matplotlib 是建立在NumPy基础之上的Python绘图库,是在机器学习中用于数据可视化的工具. 我们在前面的文章讲过NumPy的用法,这里我们就不展开讨论NumPy的相关知识了. Matp ...

  10. 跳表(SkipList)设计与实现(Java)

    微信搜一搜「bigsai」关注这个有趣的程序员 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构,它在很多中间件和语言中得到应用,我们 ...