Skip to content
lorne edited this page Feb 27, 2019 · 6 revisions

Socket Delivery Server

该框架是提供TCP Socket长连接的高可用方案。核心方案参考 socket负载均衡方案。框架采用的核心技术框架:netty springcloud redis eureka

框架主要是为了提供一个可以负载大量socket tcp长连接的通讯服务。分为两部分delivery分发负载模块、socketServer通讯模块。 模块delivery依赖redis共享数据,提供双服务提高高可用性能;socketServer基于eureka负载可提供无上限的拓展支持,提供海量socket长连接请求业务。

SDS的架构图:

目录介绍

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说明

详细请下载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

Clone this wiki locally