From 1432ff5db7aaf11f410f3446e30b217ae37c916d Mon Sep 17 00:00:00 2001 From: tangmingyou <234767776@qq.com> Date: Wed, 27 Apr 2022 17:35:00 +0800 Subject: [PATCH] im-entry registry --- im-client/pom.xml | 4 ++ .../net/sopod/soim/client/ClientMain.java | 6 +- .../sopod/soim/client/cmd/CmdDispatcher.java | 5 +- .../net/sopod/soim/client/cmd/CmdEnum.java | 4 +- .../net/sopod/soim/client/cmd/CmdStarter.java | 31 +++++++--- .../sopod/soim/client/config/GuiceIoc.java | 9 +++ .../soim/client/handler/ExitHandler.java | 20 ------- .../soim/client/handler/cmd/ExitHandler.java | 30 ++++++++++ .../handler/{ => cmd}/LoginHandler.java | 7 +-- .../handler/msg/ResTokenAuthHandler.java | 26 ++++++++ .../net/sopod/soim/client/logger/Logger.java | 10 +++- .../client/session/MessageDispatcher.java | 53 ++++++++++++++++ .../soim/client/session/MessageHandler.java | 13 ++++ .../soim/client/session/SoImSession.java | 60 +++++++++++++++---- .../soim/common/constant/AppConstant.java | 21 +++++++ .../net/sopod/soim/common/util/Collects.java | 40 +++++++++++++ .../net/sopod/soim/common/util/Reflects.java | 26 +++++++- .../sopod/soim/common/util/StringUtil.java | 4 ++ .../core/handler/NetUserMessageHandler.java | 2 +- .../registry/ProtoMessageHandlerRegistry.java | 2 +- .../sopod/soim/entry/EntryApplication.java | 11 +++- .../soim/entry/config/EntryServerConfig.java | 5 +- .../handler/auth/ReqTokenAuthHandler.java | 7 ++- .../soim/entry/registry/RegistryService.java | 48 +++++++++++++++ im-entry/src/main/resources/application.yml | 5 +- .../src/main/resources/application.yml | 4 +- im-service/im-router/pom.xml | 5 ++ pom.xml | 7 ++- 28 files changed, 398 insertions(+), 67 deletions(-) delete mode 100644 im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java create mode 100644 im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java rename im-client/src/main/java/net/sopod/soim/client/handler/{ => cmd}/LoginHandler.java (89%) create mode 100644 im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java create mode 100644 im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java create mode 100644 im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java create mode 100644 im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java create mode 100644 im-entry/src/main/java/net/sopod/soim/entry/registry/RegistryService.java diff --git a/im-client/pom.xml b/im-client/pom.xml index c7cea70..8fcbe95 100644 --- a/im-client/pom.xml +++ b/im-client/pom.xml @@ -29,6 +29,10 @@ com.google.inject guice + + com.google.inject.extensions + guice-multibindings + org.reflections reflections diff --git a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java index b81909f..5bde5c4 100644 --- a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java +++ b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java @@ -18,16 +18,12 @@ import net.sopod.soim.client.config.GuiceIoc; public class ClientMain { public static void main(String[] args) { -// ImNetClient client = new ImNetClient(); -// client.connect("127.0.0.1", 8088); - // 创建 ioc 容器 GuiceIoc guiceIoc = new GuiceIoc(ClientMain.class); Injector injector = Guice.createInjector(Stage.PRODUCTION, guiceIoc); // 启动 cmd scanner - CmdStarter cmdStarter = injector.getInstance(CmdStarter.class); - cmdStarter.start(); + injector.getInstance(CmdStarter.class).start(); } } diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java index c231bc2..0fad400 100644 --- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java +++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java @@ -7,6 +7,7 @@ import com.google.inject.Injector; import com.google.inject.Singleton; import net.sopod.soim.client.cmd.handler.CmdHandler; import net.sopod.soim.client.logger.Logger; +import net.sopod.soim.common.util.StringUtil; /** * CommandDispatcher @@ -39,7 +40,9 @@ public class CmdDispatcher { if (args.length > 0) { System.arraycopy(cmdArgs, 1, args, 0, args.length); } - + if (StringUtil.isEmpty(cmd)) { + return; + } CmdEnum cmdEnum = CmdEnum.getValue(cmd); if (cmdEnum == null) { Logger.error("未知指令: {}", cmd); diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java index e9aff4a..1979f37 100644 --- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java +++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java @@ -1,8 +1,8 @@ package net.sopod.soim.client.cmd; import net.sopod.soim.client.cmd.handler.CmdHandler; -import net.sopod.soim.client.handler.ExitHandler; -import net.sopod.soim.client.handler.LoginHandler; +import net.sopod.soim.client.handler.cmd.ExitHandler; +import net.sopod.soim.client.handler.cmd.LoginHandler; /** * Commands diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java index 119c076..158feaa 100644 --- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java +++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java @@ -1,14 +1,14 @@ package net.sopod.soim.client.cmd; import com.google.inject.Inject; -import com.google.inject.Injector; import com.google.inject.Singleton; import net.sopod.soim.client.logger.Logger; import java.util.Scanner; /** - * Args + * CmdStarter + * 命令启动器 * * @author tmy * @date 2022-04-25 10:28 @@ -18,25 +18,38 @@ public class CmdStarter { private final CmdDispatcher cmdDispatcher; + private Scanner scanner; + @Inject public CmdStarter(CmdDispatcher cmdDispatcher) { this.cmdDispatcher = cmdDispatcher; } public void start() { - Scanner scanner = new Scanner(System.in); + this.close(); + this.scanner = new Scanner(System.in); Logger.pre("【client】: "); - while(scanner.hasNextLine()) { - String cmd = scanner.nextLine(); - cmdDispatcher.dispatchCmd(cmd); + while(this.scanner.hasNextLine()) { + String cmd = this.scanner.nextLine(); + this.cmdDispatcher.dispatchCmd(cmd); + + // 退出 + if (CmdEnum.exit.name().equals(cmd.split("[ \t]+")[0])) { + Logger.info("bye bye"); + break; + } Logger.pre("【client】: "); } - - scanner.close(); } - public void exit() { + public void close() { + if (this.scanner != null) { + this.scanner.close(); + } + } + public static void printPre() { + Logger.pre("【client】: "); } } diff --git a/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java index ba9aee1..160afab 100644 --- a/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java +++ b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java @@ -2,6 +2,8 @@ package net.sopod.soim.client.config; import com.google.inject.AbstractModule; import com.google.inject.Singleton; +import com.google.inject.multibindings.Multibinder; +import net.sopod.soim.client.session.MessageHandler; import org.reflections.Reflections; import java.util.Collections; @@ -31,8 +33,15 @@ public class GuiceIoc extends AbstractModule { * guice 注册 bean */ @Override + @SuppressWarnings("unchecked") protected void configure() { for (Class beanType : this.beanTypes) { + if (MessageHandler.class.isAssignableFrom(beanType)) { + Multibinder.newSetBinder(binder(), MessageHandler.class) + .addBinding() + .to((Class) beanType); + continue; + } bind(beanType); } // 注册后释放内存 diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java deleted file mode 100644 index 24aa9d6..0000000 --- a/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.sopod.soim.client.handler; - -import com.google.inject.Singleton; -import net.sopod.soim.client.cmd.handler.NonArgsHandler; - -/** - * ExitHandler - * - * @author tmy - * @date 2022-04-25 11:53 - */ -@Singleton -public class ExitHandler extends NonArgsHandler { - - @Override - public void handle() { - System.exit(1); - } - -} diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java new file mode 100644 index 0000000..ad81eb9 --- /dev/null +++ b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java @@ -0,0 +1,30 @@ +package net.sopod.soim.client.handler.cmd; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import net.sopod.soim.client.cmd.CmdStarter; +import net.sopod.soim.client.cmd.handler.NonArgsHandler; +import net.sopod.soim.client.session.SoImSession; + +/** + * ExitHandler + * + * @author tmy + * @date 2022-04-25 11:53 + */ +@Singleton +public class ExitHandler extends NonArgsHandler { + + @Inject + private SoImSession soImSession; + + @Inject + private CmdStarter cmdStarter; + + @Override + public void handle() { + cmdStarter.close(); + soImSession.close(); + } + +} diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java similarity index 89% rename from im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java rename to im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java index 90ffd83..0065dc7 100644 --- a/im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java +++ b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java @@ -1,4 +1,4 @@ -package net.sopod.soim.client.handler; +package net.sopod.soim.client.handler.cmd; import com.google.inject.Inject; import com.google.inject.Singleton; @@ -35,17 +35,16 @@ public class LoginHandler implements CmdHandler { @Override public void handleArgs(ArgsLogin args) { - Logger.info("login args: {}", args); HashMap params = new HashMap<>(); params.put("account", args.getAccount()); params.put("password", args.getPassword()); + Logger.info("登录中..."); LoginResDTO loginRes = HttpClient.restPost(clientConfig.getLoginUrl(), params, LoginResDTO.class); if (!Boolean.TRUE.equals(loginRes.getSuccess())) { Logger.error("登录失败: {}", loginRes.getMessage()); return; } - String authToken = loginRes.getAuthToken(); - Logger.info("登录成功: {}", authToken); + Logger.info("登录成功: {}", loginRes.getUid()); Auth.ReqTokenAuth reqTokenAuth = Auth.ReqTokenAuth.newBuilder() .setUid(loginRes.getUid()) diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java new file mode 100644 index 0000000..0f32f29 --- /dev/null +++ b/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java @@ -0,0 +1,26 @@ +package net.sopod.soim.client.handler.msg; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import net.sopod.soim.client.session.MessageHandler; +import net.sopod.soim.client.session.SoImSession; +import net.sopod.soim.data.msg.auth.Auth; + +/** + * ResTokenAuthHandler + * + * @author tmy + * @date 2022-04-27 9:46 + */ +@Singleton +public class ResTokenAuthHandler implements MessageHandler { + + @Inject + private SoImSession soImSession; + + @Override + public void handleMsg(Auth.ResTokenAuth msg) { + soImSession.authResult(msg.getSuccess(), msg.getMessage()); + } + +} diff --git a/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java b/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java index 94dfd22..8c75c6f 100644 --- a/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java +++ b/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java @@ -1,5 +1,7 @@ package net.sopod.soim.client.logger; +import net.sopod.soim.client.cmd.CmdStarter; + /** * Logger * @@ -21,7 +23,13 @@ public class Logger { for (int i = 0; i < args.length; i++) { args[i] = String.valueOf(args[i]); } - System.out.println(String.format(msg, args)); + if ("main".equals(Thread.currentThread().getName())) { + System.out.println(String.format(msg, args)); + } else { + // 其他线程异步打印 + System.out.println(System.lineSeparator() + String.format(msg, args)); + CmdStarter.printPre(); + } } public static void pre(String pre) { diff --git a/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java b/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java new file mode 100644 index 0000000..9482468 --- /dev/null +++ b/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java @@ -0,0 +1,53 @@ +package net.sopod.soim.client.session; + +import com.google.inject.Inject; +import com.google.inject.Singleton; +import com.google.protobuf.MessageLite; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import net.sopod.soim.common.util.Reflects; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * MessageDispatcher + * + * @author tmy + * @date 2022-04-27 9:48 + */ +@Singleton +@ChannelHandler.Sharable +public class MessageDispatcher extends SimpleChannelInboundHandler { + + private Map, MessageHandler> msgHandlers; + + @Inject + public MessageDispatcher(Set handlers) { + this.registryHandlers(handlers); + } + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageLite msg) throws Exception { + MessageHandler messageHandler = msgHandlers.get(msg.getClass()); + messageHandler.handleMsg(msg); + } + + private void registryHandlers(Set handlers) { + for (MessageHandler handler : handlers) { + List msgTypes = Reflects.getSuperInterfaceGenericTypes(handler.getClass()); + Map, MessageHandler> msgHandlers = new HashMap<>(); + try { + Class msgType = msgTypes.size() == 0 ? Object.class : Class.forName(msgTypes.get(0)); + msgHandlers.put(msgType, handler); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + this.msgHandlers = msgHandlers; + } + } + +} diff --git a/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java b/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java new file mode 100644 index 0000000..8d3d7f0 --- /dev/null +++ b/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java @@ -0,0 +1,13 @@ +package net.sopod.soim.client.session; + +/** + * MessageHandler + * + * @author tmy + * @date 2022-04-27 9:50 + */ +public interface MessageHandler { + + void handleMsg(T msg); + +} diff --git a/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java b/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java index 6c0de45..f9c234d 100644 --- a/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java +++ b/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java @@ -1,5 +1,6 @@ package net.sopod.soim.client.session; +import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.protobuf.MessageLite; import io.netty.bootstrap.Bootstrap; @@ -32,6 +33,13 @@ public class SoImSession { private AtomicBoolean auth = new AtomicBoolean(false); + private final MessageDispatcher messageDispatcher; + + @Inject + public SoImSession(MessageDispatcher messageDispatcher) { + this.messageDispatcher = messageDispatcher; + } + public void connect(String host, Integer port, Auth.ReqTokenAuth tokenAuth) { eventLoopGroup = new NioEventLoopGroup(2); Bootstrap b = new Bootstrap() @@ -41,43 +49,73 @@ public class SoImSession { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline() - .addLast(new ImMessageCodec()); - // .addLast(new ProtoMessageCodec()); + .addLast(new ImMessageCodec()) + .addLast(messageDispatcher); } }); try { + Logger.info("连接中..."); clientChannel = b.connect(host, port).await().channel(); // 连接后立即发送认证消息 - // TODO ResHandler clientChannel.writeAndFlush(tokenAuth); - } catch (InterruptedException e) { - e.printStackTrace(); + } catch (Exception e) { + Logger.error("连接服务器失败: {}", e.getMessage()); } } + /** + * 处理登录认证结果 + */ + public void authResult(boolean success, String message) { + this.auth.set(success); + if (this.auth.get()) { + Logger.info("连接服务器成功"); + return; + } + Logger.info("连接服务器失败: {}", message); + this.close(); + } + + public void authSuccess() { + // token 认证成功,连接建立 + this.auth.set(true); + Logger.info("连接服务器成功"); + } + + /** + * 发送消息 + */ public void send(MessageLite message) { if (!auth.get()) { - Logger.error("请登录后发送消息"); + Logger.error("请先登录"); return; } if (clientChannel == null || !clientChannel.isActive()) { - Logger.error("连接未打开"); + Logger.error("连接已关闭"); return; } clientChannel.write(message); } + /** + * 关闭 tcp 连接 + */ public void close() { if (clientChannel != null) { - try { - clientChannel.close().await(); - } catch (InterruptedException e) { - logger.error("channel close error: ", e); + if (this.clientChannel.isActive()) { + try { + clientChannel.close().await(); + Logger.info("连接已关闭"); + } catch (InterruptedException e) { + Logger.error("连接关闭失败: {}", e.getMessage()); + } } + this.clientChannel = null; } if (eventLoopGroup != null) { eventLoopGroup.shutdownGracefully(); + this.eventLoopGroup = null; } } diff --git a/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java b/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java new file mode 100644 index 0000000..54c7699 --- /dev/null +++ b/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java @@ -0,0 +1,21 @@ +package net.sopod.soim.common.constant; + +/** + * AppConstant + * + * @author tmy + * @date 2022-04-27 15:04 + */ +public interface AppConstant { + + String APP_REGISTRY_GROUP = "so-im"; + + /** im-entry 注册中心名称 */ + String APP_IM_ENTRY_REGISTRY_NAME = "im-entry-instance"; + + String APP_IM_ENTRY_NAME = "im-entry"; + + String APP_IM_HTTP_ENTRY_NAME = "im-http-entry"; + String APP_IM_DAS_USER_NAME = "im-das-user"; + +} diff --git a/im-common/src/main/java/net/sopod/soim/common/util/Collects.java b/im-common/src/main/java/net/sopod/soim/common/util/Collects.java index 4738e61..24f748f 100644 --- a/im-common/src/main/java/net/sopod/soim/common/util/Collects.java +++ b/im-common/src/main/java/net/sopod/soim/common/util/Collects.java @@ -1,5 +1,8 @@ package net.sopod.soim.common.util; +import java.util.*; +import java.util.function.Function; + /** * Collects * @@ -20,4 +23,41 @@ public class Collects { return arr; } + public static Map> group(Collection collect, + Function groupBy, + Function valBy) { + return group(3, collect, groupBy, valBy); + } + + /** + * 对 list 数据进行分组 + * @param aboutFactorOfSize 集合数据条数约是分组后数据的n倍 + * @param collect 集合数据 + * @param groupBy 集合元素分组值 + * @param valBy 分组结果 + * @param 集合元素类型 + * @param 分组值类型 + * @param 分组结果类型 + * @return 分组结果 + */ + public static Map> group(int aboutFactorOfSize, + Collection collect, + Function groupBy, + Function valBy) { + if (aboutFactorOfSize < 1) { + throw new IllegalArgumentException("aboutFactorOfSize需大于0"); + } + if (collect == null || collect.isEmpty()) { + return Collections.emptyMap(); + } + Map> result = new HashMap<>(Math.max(6, Math.min(16, collect.size() / aboutFactorOfSize))); + for (T item : collect) { + K key = groupBy.apply(item); + V val = valBy.apply(item); + List vals = result.computeIfAbsent(key, k -> new LinkedList<>()); + vals.add(val); + } + return result; + } + } diff --git a/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java b/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java index f0979f2..092536c 100644 --- a/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java +++ b/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java @@ -1,6 +1,7 @@ package net.sopod.soim.common.util; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -17,16 +18,35 @@ public class Reflects { * 获取父类上的泛型 * @return 父类上的泛型 */ - public static List getSuperclassGenericTypes(Class clazz) { + public static List getSuperClassGenericTypes(Class clazz) { // 获取 handler 的泛型消息 Type superType = clazz.getGenericSuperclass(); String typeName = superType.getTypeName(); - int idx = typeName.indexOf('<'); + return parseGenericType(typeName); + } + + /** + * 获取父接口上的泛型 + * @return 父接口上的泛型 + */ + public static List getSuperInterfaceGenericTypes(Class clazz) { + // 获取 handler 的泛型消息 + Type[] genericTypes = clazz.getGenericInterfaces(); + List types = new ArrayList<>(6); + for (Type genericType : genericTypes) { + List interfaceGenericTypes = parseGenericType(genericType.getTypeName()); + types.addAll(interfaceGenericTypes); + } + return types; + } + + private static List parseGenericType(String genericClass) { + int idx = genericClass.indexOf('<'); if (idx == -1) { // 父类没有泛型 return Collections.emptyList(); } - String genericName = typeName.substring(idx + 1, typeName.length() - 1); + String genericName = genericClass.substring(idx + 1, genericClass.length() - 1); // 父类只有一个泛型 if (!genericName.contains(",")) { return Collections.singletonList(genericName); diff --git a/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java b/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java index 2b764d7..6d37521 100644 --- a/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java +++ b/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java @@ -16,4 +16,8 @@ public class StringUtil { return (new UUID(random.nextLong(), random.nextLong())).toString().replace("-", ""); } + public static boolean isEmpty(String content) { + return content == null || content.length() == 0; + } + } diff --git a/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java b/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java index addf696..ce216ed 100644 --- a/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java +++ b/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java @@ -15,7 +15,7 @@ public abstract class NetUserMessageHandler implements MessageHandler { public final void exec(NetUser netUser, T msg) { MessageLite res = handle(netUser, msg); if (res != null) { - netUser.write(res); + netUser.writeNow(res); } } diff --git a/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java b/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java index 8ae305e..4a68907 100644 --- a/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java +++ b/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java @@ -41,7 +41,7 @@ public class ProtoMessageHandlerRegistry { Collection handlers = beansOfType.values(); for (MessageHandler handler : handlers) { // 获取 handler 泛型 - List genericTypes = Reflects.getSuperclassGenericTypes(handler.getClass()); + List genericTypes = Reflects.getSuperClassGenericTypes(handler.getClass()); try { Class type = genericTypes.size() == 0 ? Object.class : Class.forName(genericTypes.get(0)); MessageHandler existHandler = TYPE_HANDLER_MAP.putIfAbsent(type, handler); diff --git a/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java b/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java index d378283..4605f32 100644 --- a/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java +++ b/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java @@ -1,8 +1,11 @@ package net.sopod.soim.entry; +import com.alibaba.nacos.api.exception.NacosException; +import net.sopod.soim.entry.registry.RegistryService; import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; /** * EntryMain @@ -14,8 +17,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableDubbo public class EntryApplication { - public static void main(String[] args) { - SpringApplication.run(EntryApplication.class, args); + public static void main(String[] args) throws NacosException { + ConfigurableApplicationContext context = SpringApplication.run(EntryApplication.class, args); + + // 注册 im-entry 服务 + RegistryService registryService = context.getBean(RegistryService.class); + registryService.registryImEntry(); } } diff --git a/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java b/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java index 1336363..4de00cc 100644 --- a/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java +++ b/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java @@ -1,6 +1,7 @@ package net.sopod.soim.entry.config; import lombok.Data; +import net.sopod.soim.common.constant.AppConstant; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.stereotype.Component; @@ -17,13 +18,15 @@ import org.springframework.stereotype.Component; @Data public class EntryServerConfig { - private String name = "entry server"; + private String name = AppConstant.APP_IM_ENTRY_NAME; /** entry 所在服务器 ip */ private String ip = "127.0.0.1"; private Integer port = 8088; + private String nacosAddr; + /** 消息消费者线程数 */ private Integer workerSize; diff --git a/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java b/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java index ad5f97e..5821e3f 100644 --- a/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java +++ b/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; * ReqTokenAuthHandler * 连接用户携带 token 登录 * 1.调用 token 校验解析服务获取用户信息 - * 1.1 存储用户信息、entry节点信息 到 router + * 1.1 存储用户信息、entry 节点信息 到 router * 2. entry channel attr(UserInfo) / return false, channel close * * return ResTokenAuth(success/false) @@ -28,7 +28,10 @@ public class ReqTokenAuthHandler extends NetUserMessageHandlerim-common ${soim.version} + + net.sopod + im-data + ${soim.version} + org.springframework.boot spring-boot-starter diff --git a/pom.xml b/pom.xml index 55f22a7..9e016dc 100644 --- a/pom.xml +++ b/pom.xml @@ -72,7 +72,12 @@ com.google.inject guice - 4.1.0 + 4.2.3 + + + com.google.inject.extensions + guice-multibindings + 4.2.3 org.apache.commons