前言

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

  为了解决这一问题,服务配置器模式(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. Numpy的学习4-array的合并

    import numpy as np A = np.array([1, 1, 1]) B = np.array([2, 2, 2]) print(np.vstack((A, B))) # vertic ...

  2. python2与python3共存后,如何使用

    借用py的一个参数 py -2 与py -3调用不同是的python版本 所以运行的时候只要 py -2 文件名可以用python2来运行脚本 py -3 文件名就是用python3 来运行脚本 参考 ...

  3. Kali Linux破解wifi密码(无须外置网卡)

    环境准备:  方式一(选择该方式):Kali Linux.笔记本一台.U盘(至少8G)  方式二:Kali Linux.外置网卡.笔记本一台.VM   特别说明,主要是使用方式一进行破解,如果有外置网 ...

  4. 一种简单的吉布斯采样modify中应用

    这是主函数clc; clear all; close all; %% 生成初始序列 sequenceOfLength = 20; sequenceOfPop = 4; sequence = produ ...

  5. Java学习_注解

    使用注解 注解是放在Java源码的类.方法.字段.参数前的一种特殊"注释". 1 // this is a component: 2 @Resource("hello&q ...

  6. JavaWeb基础总结:Filter专题

    Java Servlet Filter Filter 被称为过滤器,其主要作用是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊功能 ...

  7. H5-地理定位/本地存储/拖放

    一.地理定位 Geolocation 兼容性:Internet Explorer 9+, Firefox, Chrome, Safari 和 Opera 支持Geolocation(地理定位). 一次 ...

  8. [标签] Java学习日报7.28

    package minG;import java.util.*;public class MinG { public static void main(String[] args) { // TODO ...

  9. python-scrapy爬取某招聘网站(二)

    首先要准备python3+scrapy+pycharm 一.首先让我们了解一下网站 拉勾网https://www.lagou.com/ 和Boss直聘类似的网址设计方式,与智联招聘不同,它采用普通的页 ...

  10. LVS之2---基于LVS负载均衡集群架构

    LVS之2---基于LVS负载均衡集群架构实现 目录 LVS之2---基于LVS负载均衡集群架构实现 ipvsadm software package Options 常用命令 保存及重载规则 内存映 ...