bug fixed:
- 解决返回结果类中包含泛型的解析异常
务必需要将以下类库进行升级:
版本依赖
<dependency> <groupId>com.meidusa.toolkit</groupId> <artifactId>fastmark</artifactId> <version>1.0.3</version> </dependency> <dependency> <groupId>com.meidusa.toolkit</groupId> <artifactId>fastjson</artifactId> <version>1.4.3</version> </dependency> <dependency><groupId>com.meidusa.toolkit.commons</groupId> <artifactId>toolkit-common-pool</artifactId> <version>1.2.8</version> </dependency> <dependency> <groupId>com.meidusa.toolkit.net</groupId> <artifactId>toolkit-net-nio</artifactId> <version>1.0.15</version> </dependency>
bug fixed:
- 解决数据包超过8M的时候出现解析异常
版本依赖升级:
<dependency> <groupId>com.meidusa.toolkit.net</groupId> <artifactId>toolkit-net-nio</artifactId> <version>1.0.15</version> </dependency>
bug fixed:
- 修复用户名、密码的认证方式
- 客户端请求等待的超时时间默认为30秒,客户端通过factory设置 该参数目前无效,需要通过 endpoint 的配置来指定 timewait时间(如果该接口会超过30秒的话)
/** * 有返回结果的服务调用,该接口只能支持同步调用 * * @param name * @return Hello */ @Endpoint(name = "getHello", timeWait = 5000) public abstract Hello getHello(@Param(name = "name") String name);
- Venus的文件加载机制采用Spring 提供的ResourceLoader
- 修复了SpringMVC中 多级加载Venus Service Client配置文件,子Bean Container无法找到父 Bean Container中的 Venus Service的问题
- fastjson升级到 1.3.17
- venus remote配置的地址,默认情况下采用物理连接池共享(多个remote中包含相同的ip,则该ip形成的pool是共享的,如果要独享,则需要设置remote属性 share="false")
- 版本依赖升级
类库 版本 修改内容 toolkit-net-nio
1.0.12
- 增加方法
fastjson 1.3.16 - 功能增强:Map中key支持 Long、Integer等基本数据类型对象,修正 TreeMap、LinkedList等有序集合经过序列化以后数据乱序问题
- Venus Bus升级,增加路由日志
- 修复ObjectPool的心跳检测有效性的问题
新版本发布,主要完善venus 日志的输出
<!-- venus服务端口启动日志 --> <logger name="com.meidusa.toolkit.net.ConnectionAcceptor" additivity="true"> <level value="info"/> <appender-ref ref="VENUS"/> <appender-ref ref="STDOUT"/> </logger> <!-- venus主日志 --> <logger name="com.meidusa.venus" additivity="false"> <level value="info"/> <appender-ref ref="VENUS"/> </logger> <logger name="com.meidusa.toolkit.net" additivity="false"> <level value="info"/> <appender-ref ref="VENUS"/> </logger> <!-- Venus后端socket连接池的心跳信息,info级别只会打印异常的Pool,debug将会打印所有Pool的心跳情况 --> <logger name="com.meidusa.toolkit.common.heartbeat" additivity="false"> <level value="info"/> <appender-ref ref="VENUS-HEARTBEAT"/> </logger> <!-- venus性能相关的日志,诸如服务调用消耗的时间 --> <logger name="venus.backend.performance" additivity="false"> <level value="debug"/> <appender-ref ref="VENUS-PERFORMANCE"/> </logger> <!-- 作为venus 客户端调用远程服务的性能情况 --> <logger name="venus.client.performance" additivity="false"> <level value="debug"/> <appender-ref ref="VENUS-PERFORMANCE"/> </logger> <!-- Venus执行线程中的等待任务日志 --> <logger name="venus.report.queue" additivity="false"> <level value="info"/> <appender-ref ref="VENUS"/> </logger> <!-- venus 调用日志,客户端调用的时候将会产生一个UUID,这个ID将会流传到服务端,服务端也会记录本次调用 --> <logger name="venus.tracer" additivity="false"> <level value="debug"/> <appender-ref ref="VENUS-TRACER"/> </logger>
Bug fix:
- Venus client中配置Service,分成Remote配置与简单的ipAddressList 配置,本次修正了采用 ipAddressList,原远程连接的连接池配置,默认将支持 testOnBorrow=true,testWhileIdle=true
- 修复Venus返回结果Map中带数组,而没有转换成相应类型的bug
功能增加:
- 增加@ExceptionCode Annotation 取代 采用CodedException的接口实现方式,更加方便异常的定义,目前Exception采用扫描classpath的方式获取所有标有 ExceptionCode Annotation的类 进行cache,方便异常类的系列化与反序列化
异常例子:
@ExceptionCode(errorCode=1988000) /** 该code在你的系统中需要唯一性,否则该code转换成Exception 将会混乱 **/ public class HelloRuntimeException extends RuntimeException { private static final long serialVersionUID = 1L; public HelloRuntimeException(String msg){ super(msg); } }
- source code文件采用 utf8编码
- 修正了接口返回null 客户端出现解析异常的bug
功能增加:
- 支持服务参数 无默认构造函数 类序列化与反序列化,该类必须实现 java.io.Serializable 接口
- Endpoint annotation增加 timeWait ,解释:
- 客户端:等待该方法返回结果的超时时间
- 服务端:客服端请求进入队列,等待执行线程开始执行的时间
- 时间单位:毫秒,默认30000毫秒
- 主要作用:该参数主要用于协商该接口的调用最大等待时间,服务端的作用在于防止请求的浪涌(诸如秒杀,秒杀的特征基本在于刷页面,会导致不停的请求进入后端服务执行队列中,包括客户端恶意请求,不等待请求结果而再次发起请求)。这种情况服务端执行线程肯定非常繁忙,而且开始有队列堆积,当堆积到一定程度,如果服务端从队列中获得该请求,并且开始执行的时候,可能用户已经不耐烦,关闭页面或者已经超时,那么就没有必要执行这个请求,应该返回特定的数据包给客户端,告知请求被忽略了。
BugFix:
1. 修正了3.0.2之前的客户端对 3.0.2版本的服务端调用 出现异常的问题
Venus 3.0.2增加Venus调用跟踪日志:
2013-10-21 11:14:48,385 DEBUG venus.tracer - receive id=d6863646-6b87-4e53-8d70-41068fc875e3,service=HelloService.sayHello,params={name:jack} 2013-10-21 11:14:48,394 DEBUG venus.tracer - receive id=f891fddf-537c-4195-82ea-d1d9384a2794,service=HelloService.sayAsyncHello,params={name:jack} method sayAsyncHello invoked 2013-10-21 11:14:48,418 DEBUG venus.tracer - receive id=1e986970-0235-403d-a33b-ec9208781039,service=HelloService.sayHelloCallback,params={name:jack,callback:com.meidusa.venus.notify.ReferenceInvocationListener@28f19d6e} 2013-10-21 11:16:27,853 DEBUG venus.tracer - receive id=35fcb9ae-deb1-4b5e-abdf-707d49c826ef,service=HelloService.getHello,params={name:Jack}
主要在几个地方增加日志:
- 发起Venus 服务请求 (request id=....)
- 接收到服务请求 (receive id=....)
- 接收到回调请求 (callback id=...)
Venus 日志格式:
* debug打印的信息:请求标识{request,receive,callback} id={uuid},service={apiName},params={request Param Json} * Info 打印的信息:请求标识{request,receive,callback} id={uuid},service={apiName} * warn或则error将忽略该日志
原理:
- 客户端:Venus通过ThreadLocal判断当前是否有请求表示初始请求的UUID,如果不存在则产生byte[16]数组,存储在com.meidusa.venus.util.ThreadLocalMap, Key="REQUEST_TRACE_ID",每次发起请求,则将这byte[16]通过数据包传输
- 服务端:接受到Venus客户端的请求,则解析数据包,获取byte[16],存储在com.meidusa.venus.util.ThreadLocalMap,以方便该线程的Venus调用使用,如果在该线程进行二次Venus调用,那么可以将这个byte[16] 带入这次请求
- 重置UUID:单线程或者后台系统如何分离不同的Venus请求? 每次调用Venus,如果一次调用作为一个完整的Venus调用,需要通过 com.meidusa.venus.util.ThreadLocalMap类 调用reset() 方法来清理 ThreadLocalMap中的byte[]
- 日志输出:通过UUID类,将byte[16]生成36个长度的字符串打印出来。
相关Log4j配置
<logger name="venus.tracer" additivity="true"> <level value="debug"/> <appender-ref ref="CONSOLE"/> </logger>
简介: venus 3.0.1做一次重大升级,首先NIO框架进行升级,增加了路由协议,服务端将支持Venus Bus.协议数据包,性能有所提升
本次升级兼容2.x版本
- 增加了Venus Bus系统,Venus Registry系统(简单)
- 增加nio的虚拟连接池 (PollingBackendConnectionPool)
- 依赖全新的网络io框架,toolkit-net-nio
- 剔除对log4j的直接依赖,转向对slf4j的接口依赖
- venus-backend支持 venus-bus的路由协议包
- Venus性能优化
- venus接口支持Set集合
本期更新内容:
- 主要解决内部类库的依赖,剔除了不合理的依赖关系
- 为接入slf4j做准备
- 依赖的Toolkit类库都进行了版本升级
Venus 2.2.7 Released:
主要新增功能:客户端根据 服务的请求参数,通过一致性hash的方式将请求发送到hash环的一台机器上。
主要目的:有些数据是有缓存,并且这些内存数据会定期执行某种业务。那么跟在内存中的数据相关的操作必须发送到这台服务器上,避免相同数据出现的不同的物理机器上。
这个功能主要是由客户端来决定的,虽然有点不妥,但目前来説,对于内部服务是非常有效的解决方法。
使用方法:
一个接口关于一致性hash的用法
@Endpoint(name = "getHello",loadbalancingKey="name") public abstract Hello getHello(@Param(name = "name") String name);
复杂对象的loadbalancingKey表达式写法:
复杂对象的loadbalancingKey表达式
@Endpoint(name = "testChild" ,loadbalancingKey="hello.name") public abstract Hello testChild(@Param(name = "hello") Hello hello);
![]() | 注意: 要让一致性hash路由算法起作用,remote中的地址必须配置多个ip |
Venus 2.2.6 Released:
该版本改进有2方面:
- validator有了新的性能提升
- 修复了toolkit-net-io的一个bug
- 相关的Bug描述:由于 connectionManager在主循环中检测并且发送ping包,ping发送的时候,如果该connection之前有消息堆积(可能是由于网络问题/CPU/GC时间过长等问题 最终导致消息堆积) ,并且当前消息堆积达到设定的最大值,
默认最大值Venus设定了1(目前每个连接已经提示到10000), - 解决方法: connection *idle check仍旧保留在主循环中,但是发送ping包通过另外一个线程来发送,避免主线程wait.并且增加每个连接的发送队列长度.