Browse Source

im-entry-http monitor

master
tangmingyou 4 years ago
parent
commit
4b04f85111
  1. 10
      im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java
  2. 4
      im-das-api/im-das-message-api/pom.xml
  3. 65
      im-entry-http/src/main/java/net/sopod/soim/entry/http/config/ApplicationOnReady.java
  4. 4
      im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java
  5. 6
      im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAPIExporterListener.java
  6. 47
      im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppContext.java
  7. 33
      im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppContextHolder.java
  8. 52
      im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppOnReady.java
  9. 26
      im-entry/src/main/java/net/sopod/soim/entry/config/SpringApplicationContextInitialed.java
  10. 4
      im-entry/src/main/java/net/sopod/soim/entry/handlers/auth/ReqTokenAuthHandler.java
  11. 1
      im-entry/src/main/java/net/sopod/soim/entry/registry/RegistryService.java
  12. 8
      im-entry/src/main/java/net/sopod/soim/entry/server/EntryServer.java
  13. 3
      im-entry/src/main/java/net/sopod/soim/entry/server/EntryServerRunner.java
  14. 4
      im-entry/src/main/java/net/sopod/soim/entry/service/TextChatServiceImpl.java
  15. 12
      im-service-api/im-logic-message-api/pom.xml
  16. 8
      im-service/im-router/pom.xml
  17. 22
      im-service/im-router/src/main/java/net/sopod/soim/router/config/ImRouterAppContext.java
  18. 22
      im-service/im-router/src/main/java/net/sopod/soim/router/config/ImRouterAppOnReady.java
  19. 8
      im-service/im-router/src/main/java/net/sopod/soim/router/config/listener/ImRouterAPIExportListener.java
  20. 4
      im-service/im-router/src/main/java/net/sopod/soim/router/datasync/SyncLogByHashPusher.java
  21. 6
      im-service/im-router/src/main/java/net/sopod/soim/router/datasync/SyncLogMigrateService.java
  22. 4
      im-service/im-router/src/main/java/net/sopod/soim/router/datasync/server/handler/SyncCmdClientHandler.java
  23. 14
      im-service/im-router/src/main/java/net/sopod/soim/router/service/UserRouteServiceImpl.java

10
im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java

@ -20,4 +20,14 @@ public interface AppConstant {
String APP_IM_HTTP_ENTRY_NAME = "im-http-entry";
String APP_IM_DAS_USER_NAME = "im-das-user";
/**
* im-entry 端口偏移量
*/
int IM_ENTRY_SERVER_OFFSET = 1000;
/**
* im-router 端口偏移量
*/
int IM_ROUTER_SYNC_SERVER_OFFSET = 1000;
}

4
im-das-api/im-das-message-api/pom.xml

@ -40,6 +40,10 @@
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
</dependencies>
</project>

65
im-entry-http/src/main/java/net/sopod/soim/entry/http/config/ApplicationOnReady.java

@ -0,0 +1,65 @@
package net.sopod.soim.entry.http.config;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
import net.sopod.soim.common.constant.AppConstant;
import org.apache.dubbo.common.URL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.util.List;
import java.util.Properties;
/**
* ApplicationOnReady
*
* @author tmy
* @date 2022-06-09 11:16
*/
@Configuration
public class ApplicationOnReady implements ApplicationListener<ApplicationReadyEvent>, Ordered {
private static final Logger logger = LoggerFactory.getLogger(ApplicationOnReady.class);
private final String serverAddress;
public ApplicationOnReady(@Value("${dubbo.registry.address}") String serverAddress) {
this.serverAddress = URL.valueOf(serverAddress).getAddress();
}
@Override
public void onApplicationEvent(ApplicationReadyEvent readyEvent) {
// NamingServer 获取 im-entry 实例,连接上,
Properties properties = new Properties();
properties.put("serverAddr", serverAddress);
NamingService namingService = null;
try {
namingService = NacosFactory.createNamingService(properties);
List<Instance> allInstances = namingService.getAllInstances(AppConstant.APP_IM_ENTRY_NAME);
logger.info("im-entry instance...: {}", allInstances);
namingService.subscribe(AppConstant.APP_IM_ENTRY_NAME, (Event event) -> {
NamingEvent ne = (NamingEvent) event;
logger.info("namingEvent: {}", ne);
});
} catch (NacosException e) {
e.printStackTrace();
}
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}

4
im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java

@ -23,6 +23,10 @@ public class EntryServerConfig {
/** entry 所在服务器 ip */
private String ip = "127.0.0.1";
/**
* 使用dubbo服务端口偏移量
*/
@Deprecated
private Integer port = 8088;
private String nacosAddr;

6
im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAPIExporterListener.java

@ -23,9 +23,9 @@ public class ImEntryAPIExporterListener implements ExporterListener {
public void exported(Exporter<?> exporter) throws RpcException {
URL invokerUrl = exporter.getInvoker().getUrl();
if (!InjvmProtocol.NAME.equals(invokerUrl.getProtocol())) {
if (ImEntryAppContextHolder.getDubboAppServiceAddr() == null) {
ImEntryAppContextHolder.setDubboAppServiceAddr(invokerUrl.getAddress());
logger.info("im-entry registry serverAddr: {}", invokerUrl.getAddress());
if (ImEntryAppContext.getEntryAppAddr() == null) {
ImEntryAppContext.setAppServiceAddr(invokerUrl.getHost(), invokerUrl.getPort());
logger.info("im-entry dubbo service addr: {}", invokerUrl.getAddress());
}
}
}

47
im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppContext.java

@ -0,0 +1,47 @@
package net.sopod.soim.entry.config;
import org.springframework.context.ApplicationContext;
/**
* ContextHandler
*
* @author tmy
* @date 2022-04-28 15:06
*/
public class ImEntryAppContext {
private static ApplicationContext applicationContext;
private static String appAddr;
private static String appHost;
private static int appPort;
public static void setContext(ApplicationContext applicationContext) {
ImEntryAppContext.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> beanType) {
return applicationContext.getBean(beanType);
}
public static void setAppServiceAddr(String host, int port) {
ImEntryAppContext.appAddr = host + ":" + port;
ImEntryAppContext.appHost = host;
ImEntryAppContext.appPort = port;
}
public static String getEntryAppAddr() {
return appAddr;
}
public static String getAppHost() {
return appHost;
}
public static int getAppPort() {
return appPort;
}
}

33
im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppContextHolder.java

@ -1,33 +0,0 @@
package net.sopod.soim.entry.config;
import org.springframework.context.ApplicationContext;
/**
* ContextHandler
*
* @author tmy
* @date 2022-04-28 15:06
*/
public class ImEntryAppContextHolder {
private static ApplicationContext applicationContext;
private static String dubboAppServiceAddr;
public static void setContext(ApplicationContext applicationContext) {
ImEntryAppContextHolder.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> beanType) {
return applicationContext.getBean(beanType);
}
public static void setDubboAppServiceAddr(String dubboAppServiceAddr) {
ImEntryAppContextHolder.dubboAppServiceAddr = dubboAppServiceAddr;
}
public static String getDubboAppServiceAddr() {
return dubboAppServiceAddr;
}
}

52
im-entry/src/main/java/net/sopod/soim/entry/config/ImEntryAppOnReady.java

@ -0,0 +1,52 @@
package net.sopod.soim.entry.config;
import net.sopod.soim.common.constant.AppConstant;
import net.sopod.soim.entry.registry.ProtoMessageHandlerRegistry;
import net.sopod.soim.entry.server.EntryServer;
import net.sopod.soim.entry.worker.WorkerGroup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
/**
* ImEntryAppOnReady
*
* @author tmy
* @date 2022-06-09 10:45
*/
@Configuration
public class ImEntryAppOnReady implements ApplicationListener<ApplicationReadyEvent>, Ordered {
private static final Logger logger = LoggerFactory.getLogger(ImEntryAppOnReady.class);
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
ImEntryAppContext.setContext(event.getApplicationContext());
// 注册 protobuf 消息 handler
ProtoMessageHandlerRegistry.registerHandlerWithApplicationContext(event.getApplicationContext());
// 启动 entry-server
EntryServerConfig config = ImEntryAppContext.getBean(EntryServerConfig.class);
EntryServer entryServer = new EntryServer(
config.getName(),
// 使用dubbo 服务端口偏移量
ImEntryAppContext.getAppPort() + AppConstant.IM_ENTRY_SERVER_OFFSET);
entryServer.startServer(err -> {
logger.error("EntryServer 启动失败:", err);
});
Runtime.getRuntime().addShutdownHook(new Thread(entryServer::shutdown));
// 启动消息消费队列组
WorkerGroup.init(config.getWorkerSize());
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}

26
im-entry/src/main/java/net/sopod/soim/entry/config/SpringApplicationContextInitialed.java

@ -1,26 +0,0 @@
package net.sopod.soim.entry.config;
import net.sopod.soim.entry.registry.ProtoMessageHandlerRegistry;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
/**
* ApplicationContextInitialed
*
* @author tmy
* @date 2022-04-10 22:20
*/
@Configuration
public class SpringApplicationContextInitialed implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ImEntryAppContextHolder.setContext(applicationContext);
// 注册 protobuf 消息 handler
ProtoMessageHandlerRegistry.registerHandlerWithApplicationContext(applicationContext);
}
}

4
im-entry/src/main/java/net/sopod/soim/entry/handlers/auth/ReqTokenAuthHandler.java

@ -1,7 +1,7 @@
package net.sopod.soim.entry.handlers.auth;
import com.google.protobuf.MessageLite;
import net.sopod.soim.entry.config.ImEntryAppContextHolder;
import net.sopod.soim.entry.config.ImEntryAppContext;
import net.sopod.soim.entry.server.handler.ImContext;
import net.sopod.soim.entry.server.handler.NetUserMessageHandler;
import net.sopod.soim.entry.server.session.Account;
@ -49,7 +49,7 @@ public class ReqTokenAuthHandler extends NetUserMessageHandler<Auth.ReqTokenAuth
// 校验 token,
// TODO 更新 router 状态成功后再升级为 account,主动关闭时发送一个消息到客户端,校验错误/超时
String imRouterId = userAuthService.validateToken(msg.getToken(),
ImEntryAppContextHolder.getDubboAppServiceAddr());
ImEntryAppContext.getEntryAppAddr());
if (imRouterId == null) {
return Auth.ResTokenAuth.newBuilder()

1
im-entry/src/main/java/net/sopod/soim/entry/registry/RegistryService.java

@ -32,6 +32,7 @@ public class RegistryService {
private NamingService namingService;
@Deprecated
public void registryImEntry() throws NacosException {
Properties properties = new Properties();
properties.put("serverAddr", entryServerConfig.getNacosAddr());

8
im-entry/src/main/java/net/sopod/soim/entry/server/EntryServer.java

@ -85,4 +85,12 @@ public class EntryServer {
logger.info("netty reactor group already shutdown!");
}
public String getName() {
return name;
}
public int getPort() {
return port;
}
}

3
im-entry/src/main/java/net/sopod/soim/entry/server/EntryServerRunner.java

@ -14,7 +14,8 @@ import org.springframework.stereotype.Component;
* @author tmy
* @date 2022-03-29 00:22
*/
@Component
// @Component
@Deprecated
public class EntryServerRunner implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger(EntryServerRunner.class);

4
im-entry/src/main/java/net/sopod/soim/entry/service/TextChatServiceImpl.java

@ -3,7 +3,7 @@ package net.sopod.soim.entry.service;
import net.sopod.soim.entry.server.session.Account;
import net.sopod.soim.data.msg.chat.Chat;
import net.sopod.soim.entry.api.service.TextChatService;
import net.sopod.soim.entry.config.ImEntryAppContextHolder;
import net.sopod.soim.entry.config.ImEntryAppContext;
import net.sopod.soim.entry.server.AccountRegistry;
import net.sopod.soim.logic.common.model.TextChat;
import org.apache.dubbo.config.annotation.DubboService;
@ -30,7 +30,7 @@ public class TextChatServiceImpl implements TextChatService {
public Boolean sendTextChat(TextChat chat) {
Long receiverUid = chat.getReceiverUid();
Account account = accountRegistry.get(receiverUid);
logger.info("uid: {}, account: {}, {}", receiverUid, account, ImEntryAppContextHolder.getDubboAppServiceAddr());
logger.info("uid: {}, account: {}, {}", receiverUid, account, ImEntryAppContext.getEntryAppAddr());
if (account == null) {
return Boolean.FALSE;
}

12
im-service-api/im-logic-message-api/pom.xml

@ -16,6 +16,18 @@
<artifactId>im-logic-common</artifactId>
<version>${soim.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-amqp</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.msgpack</groupId>-->
<!-- <artifactId>jackson-dataformat-msgpack</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.xerial.snappy</groupId>-->
<!-- <artifactId>snappy-java</artifactId>-->
<!-- </dependency>-->
</dependencies>

8
im-service/im-router/pom.xml

@ -89,10 +89,10 @@
<!-- <groupId>org.msgpack</groupId>-->
<!-- <artifactId>jackson-dataformat-msgpack</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.xerial.snappy</groupId>-->
<!-- <artifactId>snappy-java</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-amqp</artifactId>-->

22
im-service/im-router/src/main/java/net/sopod/soim/router/config/AppContextHolder.java → im-service/im-router/src/main/java/net/sopod/soim/router/config/ImRouterAppContext.java

@ -32,9 +32,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
* @author tmy
* @date 2022-05-04 09:21
*/
public class AppContextHolder {
public class ImRouterAppContext {
private static final Logger logger = LoggerFactory.getLogger(AppContextHolder.class);
private static final Logger logger = LoggerFactory.getLogger(ImRouterAppContext.class);
private static ApplicationContext applicationContext;
@ -55,7 +55,7 @@ public class AppContextHolder {
}
public static void setApplicationContext(ApplicationContext applicationContext) {
AppContextHolder.applicationContext = applicationContext;
ImRouterAppContext.applicationContext = applicationContext;
}
public static <T> T getBean(Class<T> type) {
@ -71,13 +71,13 @@ public class AppContextHolder {
}
public static void setAppServiceAddr(String host, int port) {
AppContextHolder.appAddr = host + ":" + port;
AppContextHolder.appHost = host;
AppContextHolder.appPort = port;
ImRouterAppContext.appAddr = host + ":" + port;
ImRouterAppContext.appHost = host;
ImRouterAppContext.appPort = port;
}
public static void setServiceDiscoveryRegistryAddr(String discoveryAddr) {
AppContextHolder.discoveryAddr = discoveryAddr;
ImRouterAppContext.discoveryAddr = discoveryAddr;
}
public static String getDiscoveryAddr() {
@ -104,11 +104,11 @@ public class AppContextHolder {
*/
public static List<Instance> getClusterImRouterInstance() {
String discoveryAddr;
if (null == (discoveryAddr = AppContextHolder.getDiscoveryAddr())) {
if (null == (discoveryAddr = ImRouterAppContext.getDiscoveryAddr())) {
return Collections.emptyList();
}
if (namingService == null) {
synchronized (AppContextHolder.class) {
synchronized (ImRouterAppContext.class) {
if (namingService == null) {
Properties properties = new Properties();
properties.put("serverAddr", discoveryAddr);
@ -143,7 +143,7 @@ public class AppContextHolder {
RegistryManager registryManager = ApplicationModel.defaultModel().getBeanFactory()
.getBean(RegistryManager.class);
Collection<Registry> registries = registryManager.getRegistries();
List<URL> registryInvokerUrls = AppContextHolder.getRegistryInvokerUrls();
List<URL> registryInvokerUrls = ImRouterAppContext.getRegistryInvokerUrls();
if (Collects.isNotEmpty(registries)
&& Collects.isNotEmpty(registryInvokerUrls)) {
for (Registry registry : registries) {
@ -151,7 +151,7 @@ public class AppContextHolder {
// 添加 im-router 服务id参数,生成新的 url
URL url = invokerUrl.addParameter(
DubboConstant.IM_ROUTER_ID_KEY,
AppContextHolder.IM_ROUTER_ID
ImRouterAppContext.IM_ROUTER_ID
);
registry.register(url);
}

22
im-service/im-router/src/main/java/net/sopod/soim/router/config/ImRouterAppOnReady.java

@ -5,7 +5,6 @@ import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import net.sopod.soim.common.constant.AppConstant;
import net.sopod.soim.common.constant.DubboConstant;
import net.sopod.soim.common.util.Collects;
import net.sopod.soim.router.api.route.UidConsistentHashSelector;
import net.sopod.soim.router.cache.RouterUser;
@ -14,7 +13,6 @@ import net.sopod.soim.router.datasync.SyncLogMigrateService;
import net.sopod.soim.router.datasync.server.session.SyncServerSession;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.registry.Registry;
import org.apache.dubbo.registry.support.RegistryManager;
import org.apache.dubbo.rpc.model.ApplicationModel;
@ -29,7 +27,6 @@ import org.springframework.core.Ordered;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
@ -45,14 +42,12 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
private static final Logger logger = LoggerFactory.getLogger(ImRouterAppOnReady.class);
private static final int SYNC_SERVER_PORT_OFFSET = 1000;
/**
* 同步一致性hash临近节点数据
*/
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
AppContextHolder.setApplicationContext(event.getApplicationContext());
ImRouterAppContext.setApplicationContext(event.getApplicationContext());
this.init();
// 启动数据同步服务
@ -65,7 +60,7 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
// 服务已可用立即进行注册
if (registryNow) {
// this.createMockData();
AppContextHolder.doRegistry();
ImRouterAppContext.doRegistry();
}
}
@ -108,20 +103,20 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
if (registry.isAvailable()
&& registry.isServiceDiscovery()) {
String discoveryAddr = registry.getUrl().getAddress();
AppContextHolder.setServiceDiscoveryRegistryAddr(discoveryAddr);
ImRouterAppContext.setServiceDiscoveryRegistryAddr(discoveryAddr);
logger.info("service discovery registry addr: {}", discoveryAddr);
break;
}
}
}
if (AppContextHolder.getDiscoveryAddr() == null) {
if (ImRouterAppContext.getDiscoveryAddr() == null) {
logger.info("未解析到服务注册中心: 将直接启动不进行数据迁移");
}
}
private void startSyncServer() {
SyncServerSession.getInstance()
.start(AppContextHolder.getAppPort() + SYNC_SERVER_PORT_OFFSET);
.start(ImRouterAppContext.getAppPort() + AppConstant.IM_ROUTER_SYNC_SERVER_OFFSET);
}
@ -137,7 +132,7 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
public boolean checkClusterEnvironment(SyncLogMigrateService syncLogMigrateService) {
// TODO 加分布式锁,同一时间单一节点进行数据同步
List<Instance> clusterImEntryInstance = AppContextHolder.getClusterImRouterInstance();
List<Instance> clusterImEntryInstance = ImRouterAppContext.getClusterImRouterInstance();
if (Collects.isEmpty(clusterImEntryInstance)) {
logger.info("当前集群无{}节点,直接启动", AppConstant.APP_IM_ROUTER_NAME);
return true;
@ -153,7 +148,7 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
new HashMap<>(Collects.mapCapacity(clusterImEntryInstance.size()))
);
UidConsistentHashSelector<Instance> selector = new UidConsistentHashSelector<>(addrInstanceMap, addrInstanceMap.hashCode());
Set<Instance> migrateNodes = selector.selectMigrateNodes(AppContextHolder.getAppAddr());
Set<Instance> migrateNodes = selector.selectMigrateNodes(ImRouterAppContext.getAppAddr());
logger.info("需迁移数据{}节点: {} of {}",
AppConstant.APP_IM_ROUTER_NAME,
migrateNodes.size(),
@ -163,7 +158,7 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
}
// 发起客户端连接,开始同步数据
List<Pair<String, Integer>> migrateHosts = migrateNodes.stream()
.map(instance -> ImmutablePair.of(instance.getIp(), instance.getPort() + SYNC_SERVER_PORT_OFFSET))
.map(instance -> ImmutablePair.of(instance.getIp(), instance.getPort() + AppConstant.IM_ROUTER_SYNC_SERVER_OFFSET))
.collect(Collectors.toList());
// 开始同步数据
syncLogMigrateService.migrateSyncLog(migrateHosts);
@ -186,6 +181,7 @@ public class ImRouterAppOnReady implements ApplicationListener<ApplicationReadyE
*
* 关闭时检查默认有备份注册备份无备份推送尝试数据到其他节点
*/
@Deprecated
private void nameServerTestCode() {
String serverAddr = "124.222.131.236:3848";
Properties properties = new Properties();

8
im-service/im-router/src/main/java/net/sopod/soim/router/config/listener/ImRouterAPIExportListener.java

@ -1,6 +1,6 @@
package net.sopod.soim.router.config.listener;
import net.sopod.soim.router.config.AppContextHolder;
import net.sopod.soim.router.config.ImRouterAppContext;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.ExporterListener;
@ -24,10 +24,10 @@ public class ImRouterAPIExportListener implements ExporterListener {
public void exported(Exporter<?> exporter) throws RpcException {
URL invokerUrl = exporter.getInvoker().getUrl();
if (!InjvmProtocol.NAME.equals(invokerUrl.getProtocol())) {
AppContextHolder.addRegistryInvokerUrl(invokerUrl);
if (AppContextHolder.getAppAddr() == null) {
ImRouterAppContext.addRegistryInvokerUrl(invokerUrl);
if (ImRouterAppContext.getAppAddr() == null) {
// 保存服务注册地址
AppContextHolder.setAppServiceAddr(invokerUrl.getHost(), invokerUrl.getPort());
ImRouterAppContext.setAppServiceAddr(invokerUrl.getHost(), invokerUrl.getPort());
logger.info("im-router registry serverAddr: {}:{}", invokerUrl.getHost(), invokerUrl.getPort());
}
}

4
im-service/im-router/src/main/java/net/sopod/soim/router/datasync/SyncLogByHashPusher.java

@ -4,7 +4,7 @@ import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
import net.sopod.soim.common.util.Collects;
import net.sopod.soim.router.api.route.UidConsistentHashSelector;
import net.sopod.soim.router.config.AppContextHolder;
import net.sopod.soim.router.config.ImRouterAppContext;
import net.sopod.soim.router.datasync.server.data.SyncCmd;
import net.sopod.soim.router.datasync.server.data.SyncLog;
import org.slf4j.Logger;
@ -41,7 +41,7 @@ public class SyncLogByHashPusher extends DataChangeTrigger.DataKeySyncLogSubscri
// 构建hash环匹配要迁移的数据
Map<String, String> twoNodes = new HashMap<>();
twoNodes.put(newNodeAddr, newNodeAddr);
twoNodes.put(AppContextHolder.getAppAddr(), AppContextHolder.getAppAddr());
twoNodes.put(ImRouterAppContext.getAppAddr(), ImRouterAppContext.getAppAddr());
selector = new UidConsistentHashSelector<>(twoNodes, twoNodes.hashCode());
// 添加数据变化监听

6
im-service/im-router/src/main/java/net/sopod/soim/router/datasync/SyncLogMigrateService.java

@ -5,7 +5,7 @@ import net.sopod.soim.common.constant.AppConstant;
import net.sopod.soim.common.util.Jackson;
import net.sopod.soim.router.cache.RouterUser;
import net.sopod.soim.router.cache.RouterUserStorage;
import net.sopod.soim.router.config.AppContextHolder;
import net.sopod.soim.router.config.ImRouterAppContext;
import net.sopod.soim.router.datasync.server.SyncClient;
import net.sopod.soim.router.datasync.server.data.SyncCmd;
import org.apache.commons.lang3.tuple.Pair;
@ -64,7 +64,7 @@ public class SyncLogMigrateService {
try {
this.curClient = new SyncClient();
this.curClient.connect(nextHost.getLeft(), nextHost.getRight());
this.curClient.syncLogByHash(AppContextHolder.getAppAddr());
this.curClient.syncLogByHash(ImRouterAppContext.getAppAddr());
} catch (InterruptedException e) {
logger.error("节点{}:{}连接失败, 跳过!", nextHost.getLeft(), nextHost.getRight(), e);
// 同步下一个节点
@ -92,7 +92,7 @@ public class SyncLogMigrateService {
*/
private void allHostSyncFinish() {
logger.info("所有节点数据同步完成:执行注册服务....");
AppContextHolder.doRegistry();
ImRouterAppContext.doRegistry();
logger.info("注册服务成功");
// 通知服务端同步结束,关闭服务端连接
for (SyncClient migrateClient : migrateClients) {

4
im-service/im-router/src/main/java/net/sopod/soim/router/datasync/server/handler/SyncCmdClientHandler.java

@ -2,7 +2,7 @@ package net.sopod.soim.router.datasync.server.handler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import net.sopod.soim.router.config.AppContextHolder;
import net.sopod.soim.router.config.ImRouterAppContext;
import net.sopod.soim.router.datasync.SyncLogMigrateService;
import net.sopod.soim.router.datasync.server.data.SyncCmd;
import org.slf4j.Logger;
@ -46,7 +46,7 @@ public class SyncCmdClientHandler extends SimpleChannelInboundHandler<SyncCmd> {
private void handleSyncEnd(ChannelHandlerContext ctx, SyncCmd syncCmd) {
logger.info("sync end: {}", ctx.channel());
SyncLogMigrateService migrateService = AppContextHolder.getBean(SyncLogMigrateService.class);
SyncLogMigrateService migrateService = ImRouterAppContext.getBean(SyncLogMigrateService.class);
migrateService.curHostSyncEnd();
}

14
im-service/im-router/src/main/java/net/sopod/soim/router/service/UserRouteServiceImpl.java

@ -3,23 +3,18 @@ package net.sopod.soim.router.service;
import net.sopod.soim.common.constant.DubboConstant;
import net.sopod.soim.common.util.ImClock;
import net.sopod.soim.common.util.StringUtil;
import net.sopod.soim.das.common.config.LogicTables;
import net.sopod.soim.das.message.api.entity.ImMessage;
import net.sopod.soim.das.user.api.model.entity.ImUser;
import net.sopod.soim.das.message.api.service.DasMQMessagePersistentService;
import net.sopod.soim.das.user.api.service.FriendDas;
import net.sopod.soim.das.user.api.service.UserDas;
import net.sopod.soim.entry.api.service.OnlineUserService;
import net.sopod.soim.entry.api.service.TextChatService;
import net.sopod.soim.logic.api.segmentid.core.SegmentIdGenerator;
import net.sopod.soim.logic.common.model.TextChat;
import net.sopod.soim.logic.common.model.UserInfo;
import net.sopod.soim.logic.common.util.RpcContextUtil;
import net.sopod.soim.router.api.model.RegistryRes;
import net.sopod.soim.router.cache.RouterUser;
import net.sopod.soim.router.api.service.UserRouteService;
import net.sopod.soim.router.cache.RouterUser;
import net.sopod.soim.router.cache.RouterUserStorage;
import net.sopod.soim.router.config.AppContextHolder;
import net.sopod.soim.router.config.ImRouterAppContext;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.apache.dubbo.rpc.RpcContext;
@ -58,9 +53,6 @@ public class UserRouteServiceImpl implements UserRouteService {
@Resource
private SegmentIdGenerator segmentIdGenerator;
@Resource
private DasMQMessagePersistentService dasMQMessagePersistentService;
@Override
public RegistryRes registryUserEntry(Long uid, String imEntryAddr) {
ImUser imUser = userDas.getUserById(uid);
@ -74,7 +66,7 @@ public class UserRouteServiceImpl implements UserRouteService {
// 接口返回 im_router_id,后续调用 im-router 负载均衡指向当前router服务
return new RegistryRes()
.setSuccess(true)
.setImRouterId(AppContextHolder.IM_ROUTER_ID);
.setImRouterId(ImRouterAppContext.IM_ROUTER_ID);
}
@Override

Loading…
Cancel
Save