前言

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

  为了解决这一问题,服务配置器模式(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. 【震惊】padding-top的百分比值参考对象竟是父级元素的宽度

    引言 书写页面样式与布局是前端工程师Coding 中必不可少的一项工作,在定义页面元素的样式时,padding 属性也是经常被使用到的. padding 属性用于设置元素的内边距,其值可以是lengt ...

  2. 系统类 字符串String类

    java编程语言中的字符串. 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象. String 对象是 System.Char 对象的有序集合,用 ...

  3. RocketMQ集群搭建(3m-3s-async)

    RocketMQ集群搭建(3m-3s-async) 各角色介绍 角色 作用 Producer 消息发送者,将消息发送到 Broker.无状态,其与NameServer集群中的一个节点建立长连接,定期从 ...

  4. 第五章 Gateway--服务网关

    欧克 ,我接着上篇第四章 Sentinel–服务容错,继续写下去 开始网关之旅 5.1网关简介 大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务.那么作为客户端要如何去调用 这么多的微服务呢 ...

  5. 推荐系统实践 0x12 什么是Embedding

    做过深度学习的小伙伴,大家应该多多少少都听说过Embedding,这么火的Embedding到底是什么呢?这篇文章就用来介绍Embedding.另外,基于深度学习的推荐系统方法或者论文还没有结束,我打 ...

  6. windows Server 2016安装Sqlserver远程连接的坑

    如果要连接远程服务器 首先打开防火墙端口1433  新建入站规则 然后 如果没启用 就启用  然后重启服务就行 如果还是不行 进去属性  修改三处 然后重启服务

  7. Git 分支模型与开发规范

    GitHub Flow & Git Flow 基于Git 的两种协作开发模式 01.分支模型 master:长期分支,一般用于管理对外发布版本,每个 commit 对一个 tag,也就是一个发 ...

  8. 使用maven创建java项目是,jdk的版本默认为1.5,如何修改为1.8

    <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  9. MySQL性能优化,MySQL索引优化,order by优化,explain优化

    前言 今天我们来讲讲如何优化MySQL的性能,主要从索引方面优化.下期文章讲讲MySQL慢查询日志,我们是依据慢查询日志来判断哪条SQL语句有问题,然后在进行优化,敬请期待MySQL慢查询日志篇 建表 ...

  10. Redis的内存淘汰

    Redis占用内存大小 我们知道Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小. 1.通过配置文件配置 ...