转 ofbiz 服务引擎

概述

服务定义为一段独立的逻辑顺序,当多个服务组合一起时可完成不同类型的业务需求

服务有很多类型,WorkFlow、Rules、Java、SOAP、BeanShell等。java类型的服务更像一个静态方法实现的事件,然而使用服务框架就不会局限在web应用程序中。

服务需要使用Map传入参数,结果同样从Map中返回。这样很妙,因为Map可以被序列化并保存或通过HTTP(SOAP)传输。服务通过服务定义来定义并指派给具体的服务引擎。每个服务引擎通过适当的方式负责调用服务定义。因为服务没有和web应用程序绑定在一起,就允许在没有响应对象可用时仍可以执行。这就允许在指定时间由工作调度程序在后台调用服务

服务能够调用其他服务。因此,将多个小的服务串联起来实现一个大的任务使重用更容易。在不同应用程序中使用的服务可以通过创建全局服务定义文件(只能创建一个)或者一个应用程序的特定服务(这样的服务受限制且只能用于这个应用程序)。

当在web应用程序中使用时,服务可以用于web事件,这允许同时在服务框架中并重用现成的逻辑。同样,服务可以定义成“exportable",允许外部程序访问。目前,SOAP EventHandler允许服务通过SOAP来产生。其他形式的远程访问将来会加入到框架中。

特点

1、不可知的服务调用:实现不可知,位置不可知,你需要调用的服务仅仅按照要求知道服务名和传递的参数即可,你不需要知道在哪里实现的,文件在哪个服务器上或者其他的这类事情。你也不必关心是用java、simplemethod、还是其他脚本语言实现的。这就提供了在调用服务代码和服务间的松耦合,提供了高伸缩性、增加重用性。

2、不同类型的服务调用:同步、异步、预定时间。相同的服务定义、相同的服务实现,可以根据应用的需要用不同的方式调用。

3、服务提供输入和输出参数的校验。

4、不同的实现方式:有许多不同方式实现服务,处理这些不同方式实现服务的对象称之为服务引擎。处理不同类型服务实现的每个对象都要实现GenericEngine interface。所以你想实现自己的服务,基本上实现这个接口即可。

服务引擎的定义

在serviceengine.xml文件中定义了存在的引擎

  <!-- Service Engine Configuration -->
        <engine name="entity-auto" class="org.ofbiz.service.engine.EntityAutoEngine"/>
        <engine name="group" class="org.ofbiz.service.group.ServiceGroupEngine"/>
        <engine name="interface" class="org.ofbiz.service.engine.InterfaceEngine"/>
        <engine name="java" class="org.ofbiz.service.engine.StandardJavaEngine"/>
        <engine name="simple" class="org.ofbiz.minilang.SimpleServiceEngine"/>
        <engine name="script" class="org.ofbiz.service.engine.ScriptEngine"/>
        <!-- Engines that can be replaced by the generic script engine -->
        <engine name="bsh" class="org.ofbiz.service.engine.BeanShellEngine"/>
        <engine name="groovy" class="org.ofbiz.service.engine.GroovyEngine">
            <parameter name="scriptBaseClass" value="org.ofbiz.service.engine.GroovyBaseScript"/>
        </engine>
        <engine name="jacl" class="org.ofbiz.service.engine.BSFEngine"/>
        <engine name="javascript" class="org.ofbiz.service.engine.ScriptEngine"/>
        <engine name="jpython" class="org.ofbiz.service.engine.BSFEngine"/>
        <!--  -->
        <engine name="route" class="org.ofbiz.service.engine.RouteEngine"/>
        <engine name="http" class="org.ofbiz.service.engine.HttpEngine"/>
        <engine name="jms" class="org.ofbiz.service.jms.JmsServiceEngine"/>
        <engine name="rmi" class="org.ofbiz.service.rmi.RmiServiceEngine"/>
        <engine name="soap" class="org.ofbiz.service.engine.SOAPClientEngine"/>
        <engine name="ofbiz-workflow" class="org.ofbiz.workflow.WorkflowEngine"/>
        <engine name="workflow" class="org.ofbiz.shark.service.SharkServiceEngine"/>


属性名

是否必须

描述

name

Y

服务引擎的名字,必须唯一

class

Y

GenericEngine接口的实现类

服务引擎的一些配置

服务引擎的名称:<service-engine name = "default"/>

authorization 标签设置服务授权需要调用的服务。这个标签只有一个属性service-name:属性值应该是用来授权的服务名。默认使用通用的OFBiz的UserLogin服务

        <!-- Name of the service to use for authorization -->
        <authorization service-name="userLogin"/>
服务位置:
        <service-location name="main-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="main-http" location="http://localhost:8080/webtools/control/httpService"/>

        <service-location name="entity-sync-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="entity-sync-http" location="http://localhost:8080/webtools/control/httpService"/>

        <service-location name="rita-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="eedcc-test" location="http://localhost:8080/webtools/control/httpService"/>

服务引擎的线程池的配置

工作调度器(job scheduler)异步调用工作/服务。它包含池化的线程和几个请求线程。

thread-pool:该标签用来配置每个线程是怎操作。

 <!-- Thread pool configuration (max/min threads, uses to live and time to live) -->
        <thread-pool send-to-pool="pool"
                     purge-job-days="4"
                     failed-retry-min="3"
                     ttl="18000000"
                     wait-millis="750"
                     jobs="10"
                     min-threads="5"
                     max-threads="15"
                     poll-enabled="true"
                     poll-db-millis="20000">
            <run-from-pool name="pool"/>
        </thread-pool>

如下属性可用


属性名

是否必须

描述

Ttl

Y

每个请求线程的存活时间。达到时间线程将被销毁

wait-millis

Y

每个请求线程在检查通过运行前休眠的时间

jobs

Y

每个请求线程在销毁之前可运行的工作数

min-threads

Y

线程池中保持的请求线程的最小数

max-threads

Y

线程池中将会创建请求线程的最大数
poll-enabled Y 为‘true’scheduler就会poll数据库来调度工作
poll-db-millis Y 如果线程池可用,本属性用来定义池化线程运行的频率

几种服务引擎

BeanShell(BSH):是用BeanShell脚本实现一个服务

服务组:你能用一组服务实现一个服务,结果是通过定义的服务组来调用其他服务

HTTP:http方式是通过另一台通过http通讯接口运行的服务引擎的一个服务,它是通过http或https运行的。指定URL联系到另一台服务器,发送请求到远程服务器,远程服务器通过处理后返回响应。

接口:这个是特殊的服务,其根本没有实现服务,只是设定了一个接口,它有属性定义。只是它的作用在于给其他服务继承和扩展

jacl:另一种脚本语言,基本上是java语言写的解释器。

java引擎:用java实现的静态方法(可能在OFBiz中使用较多的方式是这种)

RMI:远程调用接口,基于java的rmi方式调用

SOAP:另一个远程调用接口。将基于服务定义的自动化映射调用在另一台服务器的soap服务上

simple:用minilang实现的服务

服务的定义

服务定义在服务定义文件中,该文件一般在每个组件的servicedef目录下,习惯命名weiservices.xml

服务定义有一个唯一的名字,明确的服务引擎,明确的输入输出参数

参考:framework\common\servicedef\services.xml

    <service name="createNote" engine="java"
        location="org.ofbiz.common.CommonServices" invoke="createNote">
        <description>Create a new note record</description>
        <attribute name="partyId" type="String" mode="INOUT" optional="true"/>
        <attribute name="noteName" type="String" mode="IN" optional="true"/>
        <attribute name="note" type="String" mode="IN" allow-html="safe"/>
        <attribute name="noteId" type="String" mode="OUT"/>
    </service>

服务元素

service的属性 详细参考framework/service/dtd/service.xsd


属性

是否必须

说明

缺省值

name

Y

服务的唯一名称

 

engine

Y

引擎的名称(在serviceengine.xml中定义)

 

location

N

位置或服务包类的包名

 

invoke

N

服务的方法名

 

auth

N

服务是否要求授权?(true/false)

true
debug N 当调用服务时,是否启动详细调试?(true/false) true
default-entity-name N 使用自动属性(auto-attribute)的缺省实体  
export N 这个服务是否允许通过SOAP/HTTP/JMS访问?(true/false) false
validate N 是否对服务参数的名字和类型进行验证?(true/false) true
max-retry N 异步调用服务失败时,最大重复次数 -1(无限次)
use-transaction N 是否使用事务 true
require-new-transaction N 在使用事务的情况下是否启动新事务 true
semaphore N 并发调用服务时使用的信号量:
none:当多个线程调用服务时,并发执行服务
wait:当多个线程调用服务时,采用排队的方法调用服务
fail:当服务正在被执行时,其他任何试图要调用该服务的线程都将调用失败
none
semaphore-wait-seconds N 当sempaphore="wait"时,调用服务的线程要等待的超时时间,
超时调用失败
300
semaphore-sleep N 当sempaphore="wait"时,1毫秒内做几次检查
(检查服务能否被调用)
300
transaction-timeout N 该服务的事务超时时间,当该服务启动新事务才有效 0

属性

attribute的属性 详细参考framework/service/dtd/service.xsd


属性

是否必须

描述

缺省值

name

Y

这个是属性的名字

 

type

Y

对象的类型(String,java.util.Date)等

 

model

Y

这个参数是输入、输出或输入输出(IN/OUT/INOUT)

 

optional

N

这个参数是否可选?(true/false)

false

default-value

N

默认值

 
form-label N 对应的表单项显示名称  
entity-name N 对象名  
field-name N 属性名  
string-map-prefix N Map类型参数的前缀  
string-list-prefix N List类型参数的后缀  
form-display N 是否在表单中显示?(true/false) true

我们参考几个service的定义看看service

参考一:framework\service\servicedef\services.xm

    <!-- simple condition implementation -->
    <service name="effectiveDateEcaCondition" engine="java" auth="false" use-transaction="false"
            location="org.ofbiz.service.ServiceUtil" invoke="genericDateCondition">
        <implements service="serviceEcaConditionInterface"/>
        <attribute name="fromDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
        <attribute name="thruDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
    </service>

参考二:applications/accounting/servicedef/services_finaccount.xml

    <service name="refundGcPurchase" engine="java" require-new-transaction="true" use-transaction="true"
            location="org.ofbiz.accounting.payment.GiftCertificateServices" invoke="refundGcPurchase" auth="true">
        <description>Creates return for reload on failure</description>
        <attribute name="orderItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="false"/>
        <attribute name="partyId" type="String" mode="IN" optional="false"/>
    </service>

参考三:framework\service\servicedef\services.xml

    <!-- Service Engine Services -->
    <service name="purgeOldJobs" engine="java"
            location="org.ofbiz.service.ServiceUtil" invoke="purgeOldJobs" auth="true" use-transaction="false" semaphore="wait">
        <description>Cleans out old jobs which have been around longer then what is defined in serviceengine.xml</description>
        <required-permissions join-type="AND">
            <check-permission permission="SERVICE_INVOKE_ANY"/>
        </required-permissions>
        <!-- this service has no attributes -->
    </service>

概述

服务定义为一段独立的逻辑顺序,当多个服务组合一起时可完成不同类型的业务需求

服务有很多类型,WorkFlow、Rules、Java、SOAP、BeanShell等。java类型的服务更像一个静态方法实现的事件,然而使用服务框架就不会局限在web应用程序中。

服务需要使用Map传入参数,结果同样从Map中返回。这样很妙,因为Map可以被序列化并保存或通过HTTP(SOAP)传输。服务通过服务定义来定义并指派给具体的服务引擎。每个服务引擎通过适当的方式负责调用服务定义。因为服务没有和web应用程序绑定在一起,就允许在没有响应对象可用时仍可以执行。这就允许在指定时间由工作调度程序在后台调用服务

服务能够调用其他服务。因此,将多个小的服务串联起来实现一个大的任务使重用更容易。在不同应用程序中使用的服务可以通过创建全局服务定义文件(只能创建一个)或者一个应用程序的特定服务(这样的服务受限制且只能用于这个应用程序)。

当在web应用程序中使用时,服务可以用于web事件,这允许同时在服务框架中并重用现成的逻辑。同样,服务可以定义成“exportable",允许外部程序访问。目前,SOAP EventHandler允许服务通过SOAP来产生。其他形式的远程访问将来会加入到框架中。

特点

1、不可知的服务调用:实现不可知,位置不可知,你需要调用的服务仅仅按照要求知道服务名和传递的参数即可,你不需要知道在哪里实现的,文件在哪个服务器上或者其他的这类事情。你也不必关心是用java、simplemethod、还是其他脚本语言实现的。这就提供了在调用服务代码和服务间的松耦合,提供了高伸缩性、增加重用性。

2、不同类型的服务调用:同步、异步、预定时间。相同的服务定义、相同的服务实现,可以根据应用的需要用不同的方式调用。

3、服务提供输入和输出参数的校验。

4、不同的实现方式:有许多不同方式实现服务,处理这些不同方式实现服务的对象称之为服务引擎。处理不同类型服务实现的每个对象都要实现GenericEngine interface。所以你想实现自己的服务,基本上实现这个接口即可。

服务引擎的定义

在serviceengine.xml文件中定义了存在的引擎

  <!-- Service Engine Configuration -->
        <engine name="entity-auto" class="org.ofbiz.service.engine.EntityAutoEngine"/>
        <engine name="group" class="org.ofbiz.service.group.ServiceGroupEngine"/>
        <engine name="interface" class="org.ofbiz.service.engine.InterfaceEngine"/>
        <engine name="java" class="org.ofbiz.service.engine.StandardJavaEngine"/>
        <engine name="simple" class="org.ofbiz.minilang.SimpleServiceEngine"/>
        <engine name="script" class="org.ofbiz.service.engine.ScriptEngine"/>
        <!-- Engines that can be replaced by the generic script engine -->
        <engine name="bsh" class="org.ofbiz.service.engine.BeanShellEngine"/>
        <engine name="groovy" class="org.ofbiz.service.engine.GroovyEngine">
            <parameter name="scriptBaseClass" value="org.ofbiz.service.engine.GroovyBaseScript"/>
        </engine>
        <engine name="jacl" class="org.ofbiz.service.engine.BSFEngine"/>
        <engine name="javascript" class="org.ofbiz.service.engine.ScriptEngine"/>
        <engine name="jpython" class="org.ofbiz.service.engine.BSFEngine"/>
        <!--  -->
        <engine name="route" class="org.ofbiz.service.engine.RouteEngine"/>
        <engine name="http" class="org.ofbiz.service.engine.HttpEngine"/>
        <engine name="jms" class="org.ofbiz.service.jms.JmsServiceEngine"/>
        <engine name="rmi" class="org.ofbiz.service.rmi.RmiServiceEngine"/>
        <engine name="soap" class="org.ofbiz.service.engine.SOAPClientEngine"/>
        <engine name="ofbiz-workflow" class="org.ofbiz.workflow.WorkflowEngine"/>
        <engine name="workflow" class="org.ofbiz.shark.service.SharkServiceEngine"/>


属性名

是否必须

描述

name

Y

服务引擎的名字,必须唯一

class

Y

GenericEngine接口的实现类

服务引擎的一些配置

服务引擎的名称:<service-engine name = "default"/>

authorization 标签设置服务授权需要调用的服务。这个标签只有一个属性service-name:属性值应该是用来授权的服务名。默认使用通用的OFBiz的UserLogin服务

        <!-- Name of the service to use for authorization -->
        <authorization service-name="userLogin"/>
服务位置:
        <service-location name="main-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="main-http" location="http://localhost:8080/webtools/control/httpService"/>

        <service-location name="entity-sync-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="entity-sync-http" location="http://localhost:8080/webtools/control/httpService"/>

        <service-location name="rita-rmi" location="rmi://localhost:1099/RMIDispatcher"/>
        <service-location name="eedcc-test" location="http://localhost:8080/webtools/control/httpService"/>

服务引擎的线程池的配置

工作调度器(job scheduler)异步调用工作/服务。它包含池化的线程和几个请求线程。

thread-pool:该标签用来配置每个线程是怎操作。

 <!-- Thread pool configuration (max/min threads, uses to live and time to live) -->
        <thread-pool send-to-pool="pool"
                     purge-job-days="4"
                     failed-retry-min="3"
                     ttl="18000000"
                     wait-millis="750"
                     jobs="10"
                     min-threads="5"
                     max-threads="15"
                     poll-enabled="true"
                     poll-db-millis="20000">
            <run-from-pool name="pool"/>
        </thread-pool>

如下属性可用


属性名

是否必须

描述

Ttl

Y

每个请求线程的存活时间。达到时间线程将被销毁

wait-millis

Y

每个请求线程在检查通过运行前休眠的时间

jobs

Y

每个请求线程在销毁之前可运行的工作数

min-threads

Y

线程池中保持的请求线程的最小数

max-threads

Y

线程池中将会创建请求线程的最大数
poll-enabled Y 为‘true’scheduler就会poll数据库来调度工作
poll-db-millis Y 如果线程池可用,本属性用来定义池化线程运行的频率

几种服务引擎

BeanShell(BSH):是用BeanShell脚本实现一个服务

服务组:你能用一组服务实现一个服务,结果是通过定义的服务组来调用其他服务

HTTP:http方式是通过另一台通过http通讯接口运行的服务引擎的一个服务,它是通过http或https运行的。指定URL联系到另一台服务器,发送请求到远程服务器,远程服务器通过处理后返回响应。

接口:这个是特殊的服务,其根本没有实现服务,只是设定了一个接口,它有属性定义。只是它的作用在于给其他服务继承和扩展

jacl:另一种脚本语言,基本上是java语言写的解释器。

java引擎:用java实现的静态方法(可能在OFBiz中使用较多的方式是这种)

RMI:远程调用接口,基于java的rmi方式调用

SOAP:另一个远程调用接口。将基于服务定义的自动化映射调用在另一台服务器的soap服务上

simple:用minilang实现的服务

服务的定义

服务定义在服务定义文件中,该文件一般在每个组件的servicedef目录下,习惯命名weiservices.xml

服务定义有一个唯一的名字,明确的服务引擎,明确的输入输出参数

参考:framework\common\servicedef\services.xml

    <service name="createNote" engine="java"
        location="org.ofbiz.common.CommonServices" invoke="createNote">
        <description>Create a new note record</description>
        <attribute name="partyId" type="String" mode="INOUT" optional="true"/>
        <attribute name="noteName" type="String" mode="IN" optional="true"/>
        <attribute name="note" type="String" mode="IN" allow-html="safe"/>
        <attribute name="noteId" type="String" mode="OUT"/>
    </service>

服务元素

service的属性 详细参考framework/service/dtd/service.xsd


属性

是否必须

说明

缺省值

name

Y

服务的唯一名称

 

engine

Y

引擎的名称(在serviceengine.xml中定义)

 

location

N

位置或服务包类的包名

 

invoke

N

服务的方法名

 

auth

N

服务是否要求授权?(true/false)

true
debug N 当调用服务时,是否启动详细调试?(true/false) true
default-entity-name N 使用自动属性(auto-attribute)的缺省实体  
export N 这个服务是否允许通过SOAP/HTTP/JMS访问?(true/false) false
validate N 是否对服务参数的名字和类型进行验证?(true/false) true
max-retry N 异步调用服务失败时,最大重复次数 -1(无限次)
use-transaction N 是否使用事务 true
require-new-transaction N 在使用事务的情况下是否启动新事务 true
semaphore N 并发调用服务时使用的信号量:
none:当多个线程调用服务时,并发执行服务
wait:当多个线程调用服务时,采用排队的方法调用服务
fail:当服务正在被执行时,其他任何试图要调用该服务的线程都将调用失败
none
semaphore-wait-seconds N 当sempaphore="wait"时,调用服务的线程要等待的超时时间,
超时调用失败
300
semaphore-sleep N 当sempaphore="wait"时,1毫秒内做几次检查
(检查服务能否被调用)
300
transaction-timeout N 该服务的事务超时时间,当该服务启动新事务才有效 0

属性

attribute的属性 详细参考framework/service/dtd/service.xsd


属性

是否必须

描述

缺省值

name

Y

这个是属性的名字

 

type

Y

对象的类型(String,java.util.Date)等

 

model

Y

这个参数是输入、输出或输入输出(IN/OUT/INOUT)

 

optional

N

这个参数是否可选?(true/false)

false

default-value

N

默认值

 
form-label N 对应的表单项显示名称  
entity-name N 对象名  
field-name N 属性名  
string-map-prefix N Map类型参数的前缀  
string-list-prefix N List类型参数的后缀  
form-display N 是否在表单中显示?(true/false) true

我们参考几个service的定义看看service

参考一:framework\service\servicedef\services.xm

    <!-- simple condition implementation -->
    <service name="effectiveDateEcaCondition" engine="java" auth="false" use-transaction="false"
            location="org.ofbiz.service.ServiceUtil" invoke="genericDateCondition">
        <implements service="serviceEcaConditionInterface"/>
        <attribute name="fromDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
        <attribute name="thruDate" mode="IN" type="java.sql.Timestamp" optional="true"/>
    </service>

参考二:applications/accounting/servicedef/services_finaccount.xml

    <service name="refundGcPurchase" engine="java" require-new-transaction="true" use-transaction="true"
            location="org.ofbiz.accounting.payment.GiftCertificateServices" invoke="refundGcPurchase" auth="true">
        <description>Creates return for reload on failure</description>
        <attribute name="orderItem" type="org.ofbiz.entity.GenericValue" mode="IN" optional="false"/>
        <attribute name="partyId" type="String" mode="IN" optional="false"/>
    </service>

参考三:framework\service\servicedef\services.xml

    <!-- Service Engine Services -->
    <service name="purgeOldJobs" engine="java"
            location="org.ofbiz.service.ServiceUtil" invoke="purgeOldJobs" auth="true" use-transaction="false" semaphore="wait">
        <description>Cleans out old jobs which have been around longer then what is defined in serviceengine.xml</description>
        <required-permissions join-type="AND">
            <check-permission permission="SERVICE_INVOKE_ANY"/>
        </required-permissions>
        <!-- this service has no attributes -->
    </service>
时间: 2024-08-28 16:44:36

转 ofbiz 服务引擎的相关文章

servicemix-3.2.1 内置的服务引擎和绑定组件

服务引擎: servicemix-bean servicemix-camel servicemix-cxf-se servicemix-drools servicemix-eip servicemix-jsr181  JSR-181服务引擎 servicemix-lwcontainer  轻量容器服务引擎 servicemix-quartz servicemix-saxon servicemix-script servicemix-wsn2005  WS-Notification服务引擎 绑定组

基于docker 如何部署surging分布式微服务引擎

1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微服务引擎,再把业务进行剥离, 通过配置路径就能驱动加载业务模块,这样的细粒度设计,能更加灵活从业务中针对于对象加以细分,能更加灵活的拆分聚合服务.而这篇文章我们来谈谈基于docker 如何部署 surging源码下载 2.概述 容器,就是用来存放镜像的器皿,而镜像是构建成的一个轻量的.独立的.可执行

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希一致性,随机,轮询.压力最小优先作为负载均衡的算法,底层协议集成采用的组件是dotnetty.websocket-sharp.Kestrel.支持通过docker hub 部署服务引擎,也可以通过nuget 引用组件的方式自定义服务引擎. surging 已完成了生成环境的稳定部署,支持超过千台机器

谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务架构的技术栈,覆盖了从服务注册.服务发现.中间件.协议主机再到链路跟踪,并且制定了一套微服务的规则,形成了一套统一的规范.以下是surging的服务引擎架构图 上图Diagnostic能够实现把整个服务链路的各种信息采集到. 比如来源地址.远程地址.报错.执行时间.调用链路.协议类型以及参数全部采集

surging 微服务引擎 -协议主机的Behavior特性

1.前言 因为工作的关系,最近很少更新surging,因为surging 一直处在不温不火的状态,而自己每天利用业余时间进行完善,每天都是疲惫的状态,还要应付新手的提问,曾经一度想放弃,但是有些人劝说,surging 已经有一定的忠粉,放弃难免可惜,你可以发展收费版本,这样你也有动力进行更新,用户也有需求,付费也是情理之中,你也能更好的发展下去.就在上个月我剥离了企业版.预定版.社区版. 社区版:阉割版本,不带配置中心,文档,服务编排流程引擎,管理中心等功能,而且没有咨询服务 预定版:部分企业版

Ofbiz项目学习——阶段性小结——服务返回结果

一.返回成功 1.在.DispatcherReturnDemoService类中编写服务[returnSuccess],内容如下: /** * 返回成功结果 * @param dctx * @param context * @return */ public static Map<String,Object> returnSuccess( DispatchContext dctx, Map<String,Object> context ){ //填写服务执行的代码 //......

Apache OFbiz MiniLang 源码解读

MiniLang所有元素的父类--MiniLangElement MiniLang 是基于XML的"描述型语言".所有的元素,包括节点.属性都继承自该类.它包含三个属性: lineNumber:表示解析MiniLang的源码(通常是Java)所处的行号,主要是为了便于日志记录 tagName:当前元素的tag名称,主要用于日志记录 simpleMethod:simpleMethod是一个大的"传输对象",里面实现了MiniLang支持的所有执行方式,其作用类似于se

串讲Apache OFBiz技术架构

从决定读ApacheOFBiz源码到现在不知不觉一年就过去了.这一年因为各种原因,导致源码读得断断续续.其实最大的问题还是因为无法深刻得理解里面的一些东西,导致热情骤减.直到最近,公司在开发的一个"应用快速开发平台"引发了我的一些思考,所以决定再把源码拿出来重新阅读.到最近对其架构设计近乎迷恋. 个人认为对于ApacheOFBiz的剖析可以分成三大块来进行:技术.业务.数据库设计.这三块个个都是非常顶尖的水准,每个方向深入进去都可以学到很多东西.之前只是对OFBiz各个部分的单独解析,

OSCHina技术导向:Java电子商务平台OFBiz

OFBiz 是开放的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级.跨平台.跨数据库.跨应用服务器的多层.分布式电子商务类WEB应用系统的框架. OFBiz最主要的特点是OFBiz提供了一整套的开发基于Java的web应用程序的组件和工具.包括实体引擎, 服务引擎, 消息引擎, 工作流引擎, 规则引擎等. OFBiz最新更新资讯,共12条  (投递新闻,查看所有») Apache OFBiz 12.04.05/11.04.06 发布12