§ Fox3.0 服务端新特性
标签(空格分隔): server
§ 1.服务请求
服务请求的URL格式修改 old:http://host:port/services/服务路径.do new:http://host:port/工程名/服务路径.do
§ 2.预启动服务
service配置文件中可设置onload配置,设置onload=true的service会在server启动的时候加载,调用该服务的init方法。当然改服务对象必须继承fox.ninetales.app.IService接口或其子类。
XML配置:
<!--继承的名字是文件名,继承的文件必须为abstract为true的文件-->
<package name="example" namespace="boot" extends="filter-parser.xml">
<!-- boot测试 -->
<service name="boot" class="service.example.BootService"
method="execute" onload = "true" scope="singleton">
</service>
</package>
2
3
4
5
6
7
Java代码:
/**
* Boot Service
* @author 江成
*
*/
public class BootService extends Service<JsonRequest, JsonResponse>{
/**
* 构造函数
*/
public BootService() {
super();
}
/**
* 初始化
*/
public void init(){
System.out.println("-----------------------> init "+this.getClass().getName());
}
/**
* 销毁
*/
public void destroy(){
System.out.println("-----------------------> destory "+this.getClass().getName());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
§ 3.扩展点
服务提供和配置扩展点和获取扩展点的接口,以便于非平台层面能够处理层实现复杂的功能。扩展点配置目录为service/extension。
扩展点XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<plugins>
<!--外设模块扩展-->
<extension point="fox.extension.device">
<!--相机设备-->
<device class="fox.device.system.camera.CameraDevice" scope="singleton"
type="camera" typeName="照相机" devId="camera-default" devName="照相机"></device>
<!--音频设备-->
<device class="fox.device.system.media.MediaDevice" scope="singleton"
type="audio" typeName="录音机" devId="audio-default" devName="录音机"></device>
<!--视频设备-->
<device class="fox.device.system.media.MediaDevice" scope="singleton"
type="video" typeName="录像机" devId="video-default" devName="录像机"></device>
<!--签名板-->
<device class="fox.device.system.writepad.WritePadDevice" scope="singleton"
type="sign" typeName="签名板" devId="sign-default" devName="签名板"></device>
<!--系统相机设备-->
<device class="fox.device.system.camera.CameraDevice" scope="singleton"
type="sys-camera" typeName="系统照相机" devId="camera-sys" devName="照相机"></device>
</extension>
</plugins>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java代码:
//获取扩展点注册器
ExtensionRegistry extensionRegistry = ExtensionFacotry.getExtensionRegistry(this);
//获取扩展点
IExtensionPoint point = extensionRegistry.getExtensionPoint("fox.extension.device");
if(point == null){
System.out.println("获取扩展点为空");
return;
}
//获取扩展
IExtension[] extensions = point.getExtensions();
if(extensions != null){
//循环获取扩展
for(IExtension ext : extensions){
//获取配置
IConfigElement[] items = ext.getConfigElements();
for(int i=0; i<items.length;i++){
IConfigElement item = items[i];
String type = item.getAttribute("type");
String typeName = item.getAttribute("typeName");
String className = item.getAttribute("class");
System.out.println("type="+type);
System.out.println("typeName="+typeName);
System.out.println("className="+className);
System.out.println("---------------------");
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
§ 4.服务限流
平台采用了令牌桶限流算法来实现限流控制(令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有浏览来时取走一个或者多个令牌,当发生高并发情况下拿到令牌的执行业务逻辑,没有获取到令牌的就会拒绝访问),默认令牌生成速率是500/second,也就是每秒访问次数不能超过500次。 服务限流的配置可以通过运维平台设置或者通过service.propoerties配置,如下
cn.com.bankit.phoenix.trade.server/RateLimitPermitsPerSecond=500
§ 5.服务降级
服务压力剧增的时候,可以通过降低服务级别,让一部分服务暂时降级(运行该服务配置fallback服务),以保证核心任务的进行。
<!-- demo测试 -->
<service name="demoService" class="service.example.DemoService" method="execute">
<!--服务降级后执行服务-->
<fallback class="service.example.DemoService" method="fallback"></fallback>
</service>
2
3
4
5
§ 6.服务熔断
服务熔断是指某个服务在一定的时间内连续或调用超时的情况下降低服务级别,转为调用fallback函数避免服务瘫痪。服务熔断和服务降级的区别是:前者是面向某个服务的,而且是在满足某种错误的情况下自动触发的;而服务降级是面向所有服务的,可以手工触发,也可以在达到指定条件后主动触发。 目前平台的熔断机制的默认条件是: 1、在请求数量到达20次的时候,检查在10秒内的服务错误率,如果服务请求的错误率达到50%就触发熔断。 2、距离触发熔断时间或上一次半熔断状态5秒后,进入半熔断状态,也就是让一个请求访问正常服务,如果该请求正常,则关闭熔断状态,否则继续开启熔断状态。
<!-- demo测试 -->
<service name="demoService" class="service.example.DemoService" method="execute">
<!--服务降级后执行服务-->
<fallback class="service.example.DemoService" method="fallback"></fallback>
</service>
2
3
4
5
熔断参数
#熔断机制是否开启
CircuitBreakerEnabled=true
#熔断统计窗口
CircuitBreakerBucketVolumeThreshold = 10
#熔断器开始统计错误率阀值
CircuitBreakerRequestVolumeThreshold = 20
#熔断器中断请求后会自动进入半打开状态的时间窗口
CircuitBreakerSleepWindow = 5000
#熔断开启错误率
CircuitBreakerErrorThresholdPercentage = 50