首先,在公共模块中添加netty的maven依赖
<dependencies>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.16.Final</version>
</dependency>
<!-- fastjson依赖:-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
</dependencies>
提供者及消费者工程都需依赖公共模块,这样提供者来实现接口并且提供网络调用,消费者直接通过接口来进行TCP通信及一定的协议定制获取提供者的实现返回值
接口的定义
IUserService
package com.lwl.service;
public interface IUserService {
public String sayHello(String msg);
}
具体协议对象、序列化接口及实现类、编解码器如下
JSONSerializer
package com.lwl.common;
import com.alibaba.fastjson.JSON;
import java.io.IOException;
public class JSONSerializer implements Serializer {
/**
* java对象转换为二进制
*
* @param object
* @return
* @throws IOException
*/
public byte[] serialize(Object object) throws IOException {
return JSON.toJSONBytes(object);
}
/**
* 二进制转换成java对象
*
* @param clazz
* @param bytes
* @return
* @throws IOException
*/
public <T> T deserialize(Class<T> clazz, byte[] bytes) throws IOException {
return JSON.parseObject(bytes,clazz);
}
}
RpcDecoder
package com.lwl.common;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.util.List;
public class RpcDecoder extends ByteToMessageDecoder {
private Class<?> clazz;
private Serializer serializer;
public RpcDecoder(Class<?> clazz, Serializer serializer) {
this.clazz = clazz;
this.serializer = serializer;
}
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
int length = byteBuf.readInt();
byte[] data = new byte[length];
byteBuf.readBytes(data);
Object o = serializer.deserialize(clazz, data);
list.add(o);
}
}
RpcEncoder
package com.lwl.common;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
public class RpcEncoder extends MessageToByteEncoder {
private Class<?> clazz;
private Serializer serializer;
public RpcEncoder(Class<?> clazz, Serializer serializer) {
this.clazz = clazz;
this.serializer = serializer;
}
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, Object msg, ByteBuf byteBuf) throws Exception {
if (clazz != null && clazz.isInstance(msg)) {
byte[] bytes = serializer.serialize(msg);
byteBuf.writeInt(bytes.length);
byteBuf.writeBytes(bytes);
}
}
}
RpcRequest
package com.lwl.common;
/**
* 通信协议对象
*/
public class RpcRequest {
/**
* 请求对象的ID
*/
private String requestId;
/**
* 类名
*/
private String className;
/**
* 方法名
*/
private String methodName;
/**
* 参数类型
*/
private Class<?>[] parameterTypes;
/**
* 入参
*/
private Object[] parameters;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Class<?>[] getParameterTypes() {
return parameterTypes;
}
public void setParameterTypes(Class<?>[] parameterTypes) {
this.parameterTypes = parameterTypes;
}
public Object[] getParameters() {
return parameters;
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
}
Serializer
package com.lwl.common;
import java.io.IOException;
/**
* 序列化接口
*/
public interface Serializer {
/**
* java对象转换为二进制
* @param object
* @return
* @throws IOException
*/
byte[] serialize(Object object) throws IOException;
/**
* 二进制转换成java对象
* @param clazz
* @param bytes
* @param <T>
* @return
* @throws IOException
*/
<T> T deserialize(Class<T> clazz, byte[] bytes) throws IOException;
}