-
Notifications
You must be signed in to change notification settings - Fork 17
Home
lorne edited this page Feb 27, 2019
·
6 revisions
该框架是提供TCP Socket长连接的高可用方案。核心方案参考 socket负载均衡方案。框架采用的核心技术框架:netty springcloud redis eureka
框架主要是为了提供一个可以负载大量socket tcp长连接的通讯服务。分为两部分delivery分发负载模块、socketServer通讯模块。 模块delivery依赖redis共享数据,提供双服务提高高可用性能;socketServer基于eureka负载可提供无上限的拓展支持,提供海量socket长连接请求业务。
delivery 分发服务库
socket socket通讯服务库
demo 演示案例
框架将delivery与socketServer均以第三方库的方式做的封装。在使用时只需要依赖他们就可以。
//分发服务maven
<dependency>
<groupId>com.github.1991wangliang</groupId>
<artifactId>sds-delivery</artifactId>
<version>1.2.1</version>
</dependency>
//socket服务maven
<dependency>
<groupId>com.github.1991wangliang</groupId>
<artifactId>sds-socket</artifactId>
<version>1.2.1</version>
</dependency>
详细请下载demo文件夹下的代码
主要业务实现
socket-demo 主要实现SocketEventService
接口
@Override
public void onReadListener(ChannelHandlerContext ctx, String uniqueKey, Object msg) {
//读取数据事件
System.out.println(msg);
}
@Override
public void onConnectionListener(ChannelHandlerContext ctx, String uniqueKey) {
//连接服务事件
System.out.println(uniqueKey);
}
@Override
public void onDisConnectionListener(ChannelHandlerContext ctx, String uniqueKey) {
//断开连接事件
}
@Override
public void onHeartNoWriteDataListener(ChannelHandlerContext ctx, String uniqueKey) {
//心跳写入超时监听
}
@Override
public void onHeartNoReadDataListener(ChannelHandlerContext ctx, String uniqueKey) {
//心跳读取超时监听
}
@Override
public boolean hasOpenHeartCheck() {
//是否开启心跳检查
return true;
}
delivery-demo 主要实现DeliveryServerSendEventService
接口
@Service
public class DeliveryServerSendEventServiceImpl implements DeliveryServerSendEventService {
@Autowired
private DeliveryServerService deliveryServerService;
@Override
public void onDeliveryListener(ChannelHandlerContext ctx, Object msg) {
//均为演示demo 实际业务还需要自己处理
//todo msg 业务消息处理
//通过SDS获取有效的Socket服务
Server server = deliveryServerService.getOkServer();
//发送分配的负载均衡信息给客户端
SocketUtils.send(ctx.channel(),server.toString().getBytes());
}
@Override
public void onConnectionListener(ChannelHandlerContext ctx) {
//建立连接业务
}
@Override
public void onDisConnectionListener(ChannelHandlerContext ctx) {
//断开连接业务
}
}
框架依赖eureka和redis,在启动项目之前要确保这两个服务已开启。
然后在运行两个demo。
demo配置请参看application.properties
的参数说明.
# 名称不能修改
spring.application.name = delivery
server.port = 8090
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
#redis
#redis主机地址
spring.redis.host=127.0.0.1
#redis主机端口
spring.redis.port=6379
#redis链接密码
spring.redis.password=
spring.redis.pool.maxActive=10
spring.redis.pool.maxWait=-1
spring.redis.pool.maxIdle=5
spring.redis.pool.minIdle=0
spring.redis.timeout=0
# 分发服务端口
delivery.port = 8899
# 循环检查模块是否在线的间隔时间(分钟)
delivery.check.time = 10
访问delivery模块后台地址:http://ip:port/index.html