Преглед изворни кода

refactor:完善日志和数据类别

王智勇 пре 4 година
родитељ
комит
29de393b2d

+ 1 - 1
README.md

@@ -21,7 +21,7 @@
 - [x] 消息确认ACK
 - [x] 非主动下线的断线检测与重连
 - [x] 支持客户端查询与下线等操作
-- [ ] 微服务化 支持其他服务动态调用
+- [x] 微服务化 支持其他服务动态调用
 - [ ] 支持多种序列化方式(现暂json)
 - [ ] ssl 通道加密 保证数据安全
 - [ ] data数据加密 保证数据安全

+ 3 - 0
dim-client/src/main/java/com/dzdy/dim/NettyClient.java

@@ -72,7 +72,10 @@ public class NettyClient {
      */
     private static void login(Channel channel) {
         LoginRequestPacket loginRequestPacket = new LoginRequestPacket();
+        // jgzh1
         loginRequestPacket.setToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI1NTk1NDY5MDMsInVzZXJfbmFtZSI6ImpnemgwMSIsImF1dGhvcml0aWVzIjpbIlJPTEVfT1BFUkFUT1IiXSwianRpIjoiZjA2NmQxMGMtZWVmMy00Mzk4LTg0NjctOTNiNGYwNWRiMTEwIiwiY2xpZW50X2lkIjoiYW5waW4tb3BzLXBjIiwic2NvcGUiOlsic2VsZWN0Il19.yB-K7s25d9cVUCT4Ec4ag5T4uJSa0X2hWNM5UJdinLk");
+        // jgzh2
+//        loginRequestPacket.setToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjI1NTk1NDY5MDMsInVzZXJfbmFtZSI6ImpnemgwMiIsImF1dGhvcml0aWVzIjpbIlJPTEVfT1BFUkFUT1IiXSwianRpIjoiZjA2NmQxMGMtZWVmMy00Mzk4LTg0NjctOTNiNGYwNWRiMTExIiwiY2xpZW50X2lkIjoiYW5waW4tb3BzLXBjIiwic2NvcGUiOlsic2VsZWN0Il19.y3Dp1WNkobhp-u_oK-19Y6OcXYkb4x_KC_G6cZ8ELxo");
         channel.writeAndFlush(loginRequestPacket);
     }
 

+ 1 - 1
dim-client/src/main/java/com/dzdy/dim/handler/SockDataRequestHandler.java

@@ -15,7 +15,7 @@ import io.netty.channel.SimpleChannelInboundHandler;
 public class SockDataRequestHandler extends SimpleChannelInboundHandler<SockData> {
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, SockData sockData) {
-        // todo 判断消息类别 然后对应业务逻辑处理
+        // todo 判断 Command 消息类别 然后对应业务逻辑处理
         System.out.println("已接收到 消息:" + JSONObject.toJSON(sockData));
         ConfirmRequestPacket packet = new ConfirmRequestPacket();
         packet.setPacketId(sockData.getId());

+ 1 - 1
dim-common/pom.xml

@@ -9,7 +9,7 @@
 
     <properties>
         <java.version>1.8</java.version>
-        <netty.version>4.1.6.Final</netty.version>
+        <netty.version>4.1.36.Final</netty.version>
         <lombok.version>1.18.6</lombok.version>
         <fastjson.version>1.2.56</fastjson.version>
         <jwt.version>0.10.5</jwt.version>

+ 1 - 1
dim-common/src/main/java/com/dzdy/dim/handler/IMIdleStateHandler.java

@@ -25,7 +25,7 @@ public class IMIdleStateHandler extends IdleStateHandler {
     }
 
     @Override
-    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
+    protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) {
         System.out.println(READER_IDLE_TIME + "s 内未读取到数据,关闭连接");
         ctx.channel().close();
     }

+ 8 - 1
dim-common/src/main/java/com/dzdy/dim/protocol/PacketCode.java

@@ -6,6 +6,7 @@ import com.dzdy.dim.serialize.impl.JSONSerializer;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -97,7 +98,13 @@ public class PacketCode {
             Command comm = Command.getCommand(command);
             Serializer serializer = getSerializer(serializeAlgorithm);
             if (null != serializer && null != comm) {
-                return serializer.deserialize(bytes, comm.getClazz());
+                Packet packet = serializer.deserialize(bytes, comm.getClazz());
+                if (packet instanceof SockData) {
+                    SockData sockData = (SockData)packet;
+                    sockData.setCommand(comm);
+                    return sockData;
+                }
+                return packet;
             }
         } catch (Exception e) {
             System.out.println("数据异常,解析失败");

+ 3 - 0
dim-service/src/main/java/com/dzdy/dim/DimApplication.java

@@ -1,6 +1,7 @@
 package com.dzdy.dim;
 
 import com.dzdy.dim.config.NettyManager;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -12,6 +13,7 @@ import javax.annotation.Resource;
  * @date : 2019/5/29 16:24
  * description :
  */
+@Slf4j
 @SpringBootApplication
 public class DimApplication implements CommandLineRunner {
 
@@ -25,5 +27,6 @@ public class DimApplication implements CommandLineRunner {
     @Override
     public void run(String... args) {
         nettyManager.run();
+        log.info("netty started .");
     }
 }

+ 4 - 2
dim-service/src/main/java/com/dzdy/dim/api/impl/ClientApiImpl.java

@@ -6,6 +6,7 @@ import com.dzdy.dim.contants.Session;
 import com.dzdy.dim.protocol.response.LogoutResponsePacket;
 import com.dzdy.dim.util.SessionUtil;
 import io.netty.channel.Channel;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -15,6 +16,7 @@ import java.util.List;
  * @date : 2019/5/27 15:36
  * description :
  */
+@Slf4j
 @RestController
 @RequestMapping("client")
 public class ClientApiImpl implements ClientApi {
@@ -35,9 +37,9 @@ public class ClientApiImpl implements ClientApi {
         logoutResponsePacket.setSuccess(true);
         channel.writeAndFlush(logoutResponsePacket).addListener(future -> {
             if (future.isSuccess()) {
-                System.out.println("客户端下线成功");
+                log.info("客户端下线成功");
             } else {
-                System.out.println("客户端下线失败:" + future.cause());
+                log.info("客户端下线失败:", future.cause());
             }
         });
         return R.ok(true);

+ 4 - 2
dim-service/src/main/java/com/dzdy/dim/config/NettyManager.java

@@ -5,6 +5,7 @@ import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelOption;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.nio.NioServerSocketChannel;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
 
 import javax.annotation.PreDestroy;
@@ -17,6 +18,7 @@ import javax.annotation.Resource;
  * @date : 2019/5/30 11:24
  * description :
  */
+@Slf4j
 @Configuration
 public class NettyManager {
 
@@ -53,9 +55,9 @@ public class NettyManager {
     private void bind(int port) {
         serverBootstrap.bind(port).addListener(future -> {
             if (future.isSuccess()) {
-                System.out.println("端口[" + port + "]绑定成功");
+                log.info("netty port [" + port + "] bind success . ");
             } else {
-                System.out.println("端口[" + port + "]绑定失败");
+                log.info("netty port [" + port + "] bind failure .");
                 bind(port + 1);
             }
         });

+ 3 - 1
dim-service/src/main/java/com/dzdy/dim/handler/ConfirmRequestHandler.java

@@ -4,6 +4,7 @@ import com.dzdy.dim.protocol.request.ConfirmRequestPacket;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 消息确认请求处理器
@@ -11,6 +12,7 @@ import io.netty.channel.SimpleChannelInboundHandler;
  * @date : 2019/5/28 13:49
  * description :
  */
+@Slf4j
 @ChannelHandler.Sharable
 public class ConfirmRequestHandler extends SimpleChannelInboundHandler<ConfirmRequestPacket> {
 
@@ -21,6 +23,6 @@ public class ConfirmRequestHandler extends SimpleChannelInboundHandler<ConfirmRe
 
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, ConfirmRequestPacket packet) throws Exception {
-        System.out.println(String.format("id %s 已被消费", packet.getPacketId()));
+        log.info(String.format("id %s consumed", packet.getPacketId()));
     }
 }

+ 9 - 3
dim-service/src/main/java/com/dzdy/dim/handler/HeartBeatRequestHandler.java

@@ -1,19 +1,22 @@
 package com.dzdy.dim.handler;
 
+import com.dzdy.dim.contants.Session;
 import com.dzdy.dim.protocol.request.HeartBeatRequestPacket;
 import com.dzdy.dim.protocol.response.HeartBeatResponsePacket;
+import com.dzdy.dim.util.SessionUtil;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.SimpleChannelInboundHandler;
-
-import java.util.Date;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 心跳检查请求处理器
+ *
  * @author : wangzhiyong
  * @date : 2019/5/28 11:21
  * description :
  */
+@Slf4j
 @ChannelHandler.Sharable
 public class HeartBeatRequestHandler extends SimpleChannelInboundHandler<HeartBeatRequestPacket> {
     public static final HeartBeatRequestHandler INSTANCE = new HeartBeatRequestHandler();
@@ -23,7 +26,10 @@ public class HeartBeatRequestHandler extends SimpleChannelInboundHandler<HeartBe
 
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, HeartBeatRequestPacket msg) {
-        System.out.println(new Date() + " receive heartBeat");
+        Session session = SessionUtil.getSession(ctx.channel());
+        if (null != session) {
+            log.info(String.format(" receive [user:%s - session:%s] heartBeat", session.getUserId(), session.getSessionId()));
+        }
         ctx.writeAndFlush(new HeartBeatResponsePacket());
     }
 }

+ 10 - 4
dim-service/src/main/java/com/dzdy/dim/handler/LoginRequestHandler.java

@@ -4,6 +4,7 @@ import com.dzdy.dim.contants.Session;
 import com.dzdy.dim.protocol.command.JWTUser;
 import com.dzdy.dim.protocol.request.LoginRequestPacket;
 import com.dzdy.dim.protocol.response.LoginResponsePacket;
+import com.dzdy.dim.util.ApplicationContextUtils;
 import com.dzdy.dim.util.IDUtil;
 import com.dzdy.dim.util.JWTUtil;
 import com.dzdy.dim.util.SessionUtil;
@@ -11,20 +12,25 @@ import io.jsonwebtoken.ExpiredJwtException;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.SimpleChannelInboundHandler;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 登录请求处理器
+ *
  * @author : wangzhiyong
  * @date : 2019/5/28 14:38
  * description :
  */
+@Slf4j
 @ChannelHandler.Sharable
 public class LoginRequestHandler extends SimpleChannelInboundHandler<LoginRequestPacket> {
 
     public static final LoginRequestHandler INSTANCE = new LoginRequestHandler();
 
-    private LoginRequestHandler() {
+    private final JWTUtil jwtUtil;
 
+    private LoginRequestHandler() {
+        jwtUtil = ApplicationContextUtils.getBean(JWTUtil.class);
     }
 
     @Override
@@ -34,14 +40,14 @@ public class LoginRequestHandler extends SimpleChannelInboundHandler<LoginReques
 
         String token = packet.getToken();
         try {
-            JWTUser user = JWTUtil.decode(token);
+            JWTUser user = jwtUtil.decode(token);
             if (null != user) {
                 responsePacket.setSuccess(true);
                 String sessionId = IDUtil.randomId();
                 Session session = new Session(sessionId, user.getUser_name(), null);
                 responsePacket.setSession(session);
                 SessionUtil.bind(session, ctx.channel());
-                System.out.println(String.format("[%s]登录成功", user.getUser_name()));
+                log.info(String.format("[%s] login success .", user.getUser_name()));
             }
         } catch (ExpiredJwtException e) {
             responsePacket.setSuccess(false);
@@ -55,7 +61,7 @@ public class LoginRequestHandler extends SimpleChannelInboundHandler<LoginReques
 
     @Override
     public void channelInactive(ChannelHandlerContext ctx) {
-        System.out.println("客户端和客户端断开连接");
+        log.info("有客户端与服务端断开连接");
         SessionUtil.unBind(ctx.channel());
     }
 }

+ 64 - 0
dim-service/src/main/java/com/dzdy/dim/util/ApplicationContextUtils.java

@@ -0,0 +1,64 @@
+package com.dzdy.dim.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author : wangzhiyong
+ * @date : 2019/6/17 14:36
+ * description :
+ */
+@Component("ApplicationContextUtils")
+public class ApplicationContextUtils implements ApplicationContextAware {
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        ApplicationContextUtils.applicationContext = applicationContext;
+    }
+
+    /**
+     * 获取applicationContext
+     *
+     * @return
+     */
+    private static ApplicationContext getApplicationContext() {
+        return applicationContext;
+    }
+
+    /**
+     * 通过name获取 Bean.
+     *
+     * @param name
+     * @return
+     */
+    public static Object getBean(String name) {
+        return getApplicationContext().getBean(name);
+    }
+
+    /**
+     * 通过class获取Bean.
+     *
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(Class<T> clazz) {
+        return getApplicationContext().getBean(clazz);
+    }
+
+    /**
+     * 通过name,以及Clazz返回指定的Bean
+     *
+     * @param name
+     * @param clazz
+     * @param <T>
+     * @return
+     */
+    public static <T> T getBean(String name, Class<T> clazz) {
+        return getApplicationContext().getBean(name, clazz);
+    }
+}

+ 31 - 11
dim-service/src/main/java/com/dzdy/dim/util/JWTUtil.java

@@ -4,41 +4,61 @@ import com.alibaba.fastjson.JSONObject;
 import com.dzdy.dim.protocol.command.JWTUser;
 import io.jsonwebtoken.*;
 import io.jsonwebtoken.security.InvalidKeyException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import javax.crypto.SecretKey;
 import javax.crypto.spec.SecretKeySpec;
 
 /**
  * jwt 校验
- * todo 添加长度 或者 自写算法校验
- * todo 后续和handle 都放入spring容器
  *
  * @author : wangzhiyong
  * @date : 2019/5/28 14:45
  * description :
  */
+@Slf4j
+@Component
 public class JWTUtil {
 
-    //    private static final String SIGNING_KEY = "Y#@8trs74";
-//    private static final String SIGNING_KEY = "gufanyuanyingbikongjingweijianchangjiantianjiliu";
-//    private static Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
+    @Value("${dim.jwt.secret}")
+    private String key;
+    private SecretKey secretKey;
 
-    private static final SecretKey SECRET_KEY = new SecretKeySpec("[B@11c20519222222222222222222222".getBytes(), SignatureAlgorithm.HS256.getJcaName());
+    @PostConstruct
+    private void init() {
+        secretKey = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS256.getJcaName());
+    }
 
-    public static JWTUser decode(String token) throws ExpiredJwtException {
+    /**
+     * token 解密
+     *
+     * @param token
+     * @return
+     * @throws ExpiredJwtException
+     */
+    public JWTUser decode(String token) throws ExpiredJwtException {
         if (null != token && token.length() > 0) {
-            Jws<Claims> jws = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
+            Jws<Claims> jws = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
             Claims body = jws.getBody();
             return JSONObject.parseObject(JSONObject.toJSONString(body), JWTUser.class);
         }
         return null;
     }
 
-    public static String encode(String object) {
+    /**
+     * token 加密
+     *
+     * @param object
+     * @return
+     */
+    public String encode(String object) {
         try {
-            return Jwts.builder().setSubject(object).signWith(SECRET_KEY).compact();
+            return Jwts.builder().setSubject(object).signWith(secretKey).compact();
         } catch (InvalidKeyException e) {
-            e.printStackTrace();
+            log.error("JWTUtil - encode", e);
         }
         return null;
     }

+ 4 - 2
dim-service/src/main/java/com/dzdy/dim/util/PushUtil.java

@@ -4,6 +4,7 @@ import com.dzdy.dim.contants.Session;
 import com.dzdy.dim.protocol.SockData;
 import com.dzdy.dim.protocol.command.Command;
 import io.netty.channel.Channel;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 推送工具
@@ -12,6 +13,7 @@ import io.netty.channel.Channel;
  * @date : 2019/5/30 10:25
  * description :
  */
+@Slf4j
 public class PushUtil {
 
     /**
@@ -25,9 +27,9 @@ public class PushUtil {
         Channel channel = SessionUtil.getChannel(session.getSessionId());
         channel.writeAndFlush(sockData).addListener(future -> {
             if (future.isSuccess()) {
-                System.out.println(session.getUserId() + " 发送成功");
+                log.info(session.getSessionId() + " push success.");
             } else {
-                System.out.println(session.getUserId() + " 发送失败");
+                log.info(session.getSessionId() + " push failure.");
             }
         });
     }

+ 17 - 8
dim-service/src/main/resources/application.yml

@@ -1,12 +1,21 @@
-dim:
-  netty:
-    port: 9002
-  jwt:
-    secret: '[B@11c20519222222222222222222222'
+spring:
+  application:
+    name: dim
 
 server:
   port: 9090
 
-spring:
-  application:
-    name: dim
+logging:
+  file: dim.log
+  level:
+    root: info
+  pattern:
+    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n'
+    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n'
+#  path:
+
+dim:
+  netty:
+    port: 9002
+  jwt:
+    secret: '[B@11c20519222222222222222222222'