Skip to content

Commit

Permalink
Netty 入门示例 - 增加注释
Browse files Browse the repository at this point in the history
  • Loading branch information
YunaiV committed Jun 22, 2020
1 parent 05ec049 commit 55d1b12
Show file tree
Hide file tree
Showing 40 changed files with 132 additions and 56 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@

## RPC 开发

* [《芋道 Spring Boot Netty 入门》](http://www.iocoder.cn/Spring-Boot/Netty/?github) 对应 [lab-67](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-67)
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
* [《芋道 Spring Boot 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Boot/Feign/?github) 对应 [lab-58](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-58)
* [《芋道 Spring Boot gRPC 入门》](http://www.iocoder.cn/Spring-Boot/gRPC/?github) 对应 [lab-64](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-64)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,13 @@ public class NettyClient {
private volatile Channel channel;

/**
* 启动 Netty Server
* 启动 Netty Client
*/
@PostConstruct
public void start() throws InterruptedException {
// 创建 Bootstrap 对象,用于 Netty Client 启动
Bootstrap bootstrap = new Bootstrap();
// 设置 Bootstrap 的各种属性。
bootstrap.group(eventGroup) // 设置一个 EventLoopGroup 对象
.channel(NioSocketChannel.class) // 指定 Channel 为客户端 NioSocketChannel
.remoteAddress(serverHost, serverPort) // 指定链接服务器的地址
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.client.handler;

import cn.iocoder.springboot.lab67.nettyclientdemo.client.NettyClient;
import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
import cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat.HeartbeatRequest;
import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
Expand All @@ -22,19 +22,6 @@ public class NettyClientHandler extends ChannelInboundHandlerAdapter {
@Autowired
private NettyClient nettyClient;

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object event) throws Exception {
// 空闲时,向服务端发起一次心跳
if (event instanceof IdleStateEvent) {
HeartbeatRequest heartbeatRequest = new HeartbeatRequest();
ctx.writeAndFlush(new Invocation(HeartbeatRequest.TYPE, heartbeatRequest))
.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
logger.info("[userEventTriggered][发起一次心跳]");
} else {
super.userEventTriggered(ctx, event);
}
}

@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
// 发起重连
Expand All @@ -50,4 +37,17 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
ctx.channel().close();
}

@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object event) throws Exception {
// 空闲时,向服务端发起一次心跳
if (event instanceof IdleStateEvent) {
logger.info("[userEventTriggered][发起一次心跳]");
HeartbeatRequest heartbeatRequest = new HeartbeatRequest();
ctx.writeAndFlush(new Invocation(HeartbeatRequest.TYPE, heartbeatRequest))
.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
} else {
super.userEventTriggered(ctx, event);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import cn.iocoder.springboot.lab67.nettycommondemo.codec.InvocationDecoder;
import cn.iocoder.springboot.lab67.nettycommondemo.codec.InvocationEncoder;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageDispatcher;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageDispatcher;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand All @@ -28,6 +29,7 @@ protected void initChannel(Channel ch) {
ch.pipeline()
// 空闲检测
.addLast(new IdleStateHandler(READ_TIMEOUT_SECONDS, 0, 0))
.addLast(new ReadTimeoutHandler(3 * READ_TIMEOUT_SECONDS))
// 编码器
.addLast(new InvocationEncoder())
// 解码器
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.config;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageDispatcher;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandlerContainer;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageDispatcher;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandlerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.auth;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 用户认证请求
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.auth;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 用户认证响应
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 转发消息给一个用户的 Message
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 聊天发送消息结果的 Response
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 发送给所有人的群聊消息的 Message
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 发送给指定人的私聊消息 Request
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 消息 - 心跳请求
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 消息 - 心跳响应
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.auth;

import cn.iocoder.springboot.lab67.nettyclientdemo.message.auth.AuthResponse;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.chat;

import cn.iocoder.springboot.lab67.nettyclientdemo.message.chat.ChatRedirectToUserRequest;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.chat;

import cn.iocoder.springboot.lab67.nettyclientdemo.message.chat.ChatSendResponse;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import io.netty.channel.Channel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyclientdemo.messagehandler.heartbeat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import cn.iocoder.springboot.lab67.nettyclientdemo.message.heartbeat.HeartbeatResponse;
import io.netty.channel.Channel;
import org.slf4j.Logger;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package cn.iocoder.springboot.lab67.nettycommondemo.codec;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;
import com.alibaba.fastjson.JSON;

/**
* 通信协议的消息体
*/
public class Invocation {

/**
* 类型
*/
private String type;
/**
* 消息
* 消息,JSON 格式
*/
private String message;

// 空构造方法
public Invocation() {
}

Expand Down Expand Up @@ -52,4 +56,5 @@ public String toString() {
", message='" + message + '\'' +
'}';
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@

import java.util.List;

/**
* {@link Invocation} 解码器
*/
public class InvocationDecoder extends ByteToMessageDecoder {

private Logger logger = LoggerFactory.getLogger(getClass());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* {@link Invocation} 编码器
*/
public class InvocationEncoder extends MessageToByteEncoder<Invocation> {

private Logger logger = LoggerFactory.getLogger(getClass());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ public class MessageDispatcher extends SimpleChannelInboundHandler<Invocation> {
protected void channelRead0(ChannelHandlerContext ctx, Invocation invocation) {
// 获得 type 对应的 MessageHandler 处理器
MessageHandler messageHandler = messageHandlerContainer.getMessageHandler(invocation.getType());
// 解析消息
// 获得 MessageHandler 处理器 的消息类
Class<? extends Message> messageClass = MessageHandlerContainer.getMessageClass(messageHandler);
// 解析消息
Message message = JSON.parseObject(invocation.getMessage(), messageClass);
// 执行逻辑
// noinspection unchecked
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,27 @@ public void afterPropertiesSet() throws Exception {
logger.info("[afterPropertiesSet][消息处理器数量:{}]", handlers.size());
}

protected MessageHandler getMessageHandler(String type) {
/**
* 获得类型对应的 MessageHandler
*
* @param type 类型
* @return MessageHandler
*/
MessageHandler getMessageHandler(String type) {
MessageHandler handler = handlers.get(type);
if (handler == null) {
throw new IllegalArgumentException(String.format("类型(%s) 找不到匹配的 MessageHandler 处理器", type));
}
return handler;
}

public static Class<? extends Message> getMessageClass(MessageHandler handler) {
/**
* 获得 MessageHandler 处理的消息类
*
* @param handler 处理器
* @return 消息类
*/
static Class<? extends Message> getMessageClass(MessageHandler handler) {
// 获得 Bean 对应的 Class 类名。因为有可能被 AOP 代理过。
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(handler);
// 获得接口的 Type 数组
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.config;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageDispatcher;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandlerContainer;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageDispatcher;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandlerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.auth;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 用户认证请求
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.auth;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 用户认证响应
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 转发消息给一个用户的 Message
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 聊天发送消息结果的 Response
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 发送给所有人的群聊消息的 Message
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 发送给指定人的私聊消息 Request
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.heartbeat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 消息 - 心跳请求
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.message.heartbeat;

import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.Message;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.Message;

/**
* 消息 - 心跳响应
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.messagehandler.auth;

import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.auth.AuthRequest;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.auth.AuthResponse;
import cn.iocoder.springboot.lab67.nettyserverdemo.server.NettyChannelManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.messagehandler.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatSendResponse;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatSendToAllRequest;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatRedirectToUserRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package cn.iocoder.springboot.lab67.nettyserverdemo.messagehandler.chat;

import cn.iocoder.springboot.lab67.nettycommondemo.codec.Invocation;
import cn.iocoder.springboot.lab67.nettycommondemo.dispacher.MessageHandler;
import cn.iocoder.springboot.lab67.nettycommondemo.dispatcher.MessageHandler;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatSendResponse;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatSendToOneRequest;
import cn.iocoder.springboot.lab67.nettyserverdemo.message.chat.ChatRedirectToUserRequest;
Expand Down
Loading

0 comments on commit 55d1b12

Please sign in to comment.