本章是一个初学的简单demo
以后的目标就是逐步把这个demo完善
RPCServer-一个简单的RPC demo
本demo包含的内容:
- RPCClient + RPCServer
- RPCClient + RPCServer均用netty框架
- RPCServer 端使用Spring扫描服务
- RPCClient 通过proxy调用服务
- 使用protostuff序列化与反序列化请求和响应
- -
1.protostuff
在网络传输中离不开序列化与反序列化. 在java中, 序列化就是指将java对象转化为二进制数据, 反序列化就是将二进制数据恢复成java对象. 序列化对象的方式有很多种, 比如protobuf, 将对象转化为json, xml 以及protostuff等等方法, 而protostuff因为性能好, 序列化后的体积小, 使用方便等等有点而广受采用. 使用方法:
*添加maven依赖
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>io.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>1.5.3</version>
</dependency>
*序列化和反序列化方法
@SuppressWarnings("unchecked")
public static <T> byte[] serilize(T msg) {
Class<T> tClass = (Class<T>) msg.getClass();
Schema<T> schema = RuntimeSchema.getSchema(tClass);
LinkedBuffer buffer = LinkedBuffer.allocate();
final byte[] bytes;
try {
bytes = ProtostuffIOUtil.toByteArray(msg, schema, buffer);
} finally {
buffer.clear();
}
return bytes;
}
public static <T> T deserialize(byte[] bytes, Class<T> clazz) {
Schema<T> schema = RuntimeSchema.getSchema(clazz);
T msg = schema.newMessage();
ProtostuffIOUtil.mergeFrom(bytes, msg, schema);
return msg;
}
2.Spring扫描Service
*RPCService注解
// 该注解用于标注一个RPCService类, Spring通过扫描该注解来生成service bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RPCService {
Class<?> value();
}
*service_context.xml配置文件
Spring的配置文件, component-scan标识Spring要扫描的的包, 默认情况下, Spring 只扫描@Component @Controller @Service这些Spring定义的注解. include-filter标签可以添加扫描的注解类型.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=