├── .github ├── dependabot.yml └── workflows │ └── sonar.yml ├── .gitignore ├── Makefile ├── README-en.md ├── README.md ├── common ├── pom.xml └── src │ ├── main │ └── java │ │ └── me │ │ └── lawrenceli │ │ ├── constant │ │ └── GlobalConstant.java │ │ ├── hashring │ │ ├── ConsistentHashRouter.java │ │ ├── HashAlgorithm.java │ │ ├── Node.java │ │ └── VirtualNode.java │ │ ├── model │ │ ├── MessageType.java │ │ └── WebSocketMessage.java │ │ └── utils │ │ ├── JSON.java │ │ └── StringPattern.java │ └── test │ └── java │ └── me │ └── lawrenceli │ ├── hashring │ ├── ConsistentHashRouterTest.java │ └── VirtualNodeTest.java │ ├── model │ └── WebSocketMessageTest.java │ └── utils │ ├── JSONTest.java │ └── StringPatternTest.java ├── demo.gif ├── docker-compose.yml ├── gateway ├── Dockerfile ├── pom.xml └── src │ ├── main │ ├── java │ │ └── me │ │ │ └── lawrenceli │ │ │ └── gateway │ │ │ ├── GatewayApp.java │ │ │ ├── config │ │ │ ├── CorsConfig.java │ │ │ ├── GatewayHashRingConfig.java │ │ │ ├── NamingServiceConfig.java │ │ │ ├── RedisConfig.java │ │ │ └── WebSocketProperties.java │ │ │ ├── discovery │ │ │ └── DiscoveryController.java │ │ │ ├── docker │ │ │ ├── DockerController.java │ │ │ └── DockerService.java │ │ │ ├── filter │ │ │ ├── CustomLoadBalanceFilter.java │ │ │ ├── CustomReactiveLoadBalanceFilter.java │ │ │ └── WebSocketSessionLoadBalancer.java │ │ │ └── server │ │ │ ├── FanoutSender.java │ │ │ ├── RedisSubscriber.java │ │ │ └── ServiceNode.java │ └── resources │ │ └── application.yaml │ └── test │ └── java │ └── me │ └── lawrenceli │ └── gateway │ ├── config │ └── NamingServiceConfigTest.java │ ├── discovery │ └── DiscoveryControllerTest.java │ ├── docker │ ├── DockerControllerTest.java │ └── DockerServiceTest.java │ ├── filter │ └── CustomLoadBalanceFilterTest.java │ └── server │ ├── RedisSubscriberTest.java │ └── ServiceNodeTest.java ├── pom.xml └── websocket ├── Dockerfile ├── pom.xml └── src ├── main ├── java │ └── me │ │ └── lawrenceli │ │ └── websocket │ │ ├── WebSocketApp.java │ │ ├── config │ │ ├── MQConfig.java │ │ └── WebSocketConfig.java │ │ ├── controller │ │ └── WebSocketController.java │ │ ├── event │ │ ├── ServerDownEventHandler.java │ │ └── ServerUpEventHandler.java │ │ ├── server │ │ ├── FanoutReceiver.java │ │ └── WebSocketEndpoint.java │ │ └── spring │ │ └── BeanUtils.java └── resources │ └── application.yaml └── test └── java └── me └── lawrenceli └── websocket ├── config └── MQConfigTest.java ├── controller └── WebSocketControllerTest.java ├── event ├── ServerDownEventHandlerTest.java └── ServerUpEventHandlerTest.java └── server └── WebSocketEndpointTest.java /.github/dependabot.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/.github/dependabot.yml -------------------------------------------------------------------------------- /.github/workflows/sonar.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/.github/workflows/sonar.yml -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/.gitignore -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/Makefile -------------------------------------------------------------------------------- /README-en.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/README-en.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/README.md -------------------------------------------------------------------------------- /common/pom.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/pom.xml -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/constant/GlobalConstant.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/constant/GlobalConstant.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/hashring/ConsistentHashRouter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/hashring/ConsistentHashRouter.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/hashring/HashAlgorithm.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/hashring/HashAlgorithm.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/hashring/Node.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/hashring/Node.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/hashring/VirtualNode.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/hashring/VirtualNode.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/model/MessageType.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/model/MessageType.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/model/WebSocketMessage.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/model/WebSocketMessage.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/utils/JSON.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/utils/JSON.java -------------------------------------------------------------------------------- /common/src/main/java/me/lawrenceli/utils/StringPattern.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/main/java/me/lawrenceli/utils/StringPattern.java -------------------------------------------------------------------------------- /common/src/test/java/me/lawrenceli/hashring/ConsistentHashRouterTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/test/java/me/lawrenceli/hashring/ConsistentHashRouterTest.java -------------------------------------------------------------------------------- /common/src/test/java/me/lawrenceli/hashring/VirtualNodeTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/test/java/me/lawrenceli/hashring/VirtualNodeTest.java -------------------------------------------------------------------------------- /common/src/test/java/me/lawrenceli/model/WebSocketMessageTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/test/java/me/lawrenceli/model/WebSocketMessageTest.java -------------------------------------------------------------------------------- /common/src/test/java/me/lawrenceli/utils/JSONTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/test/java/me/lawrenceli/utils/JSONTest.java -------------------------------------------------------------------------------- /common/src/test/java/me/lawrenceli/utils/StringPatternTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/common/src/test/java/me/lawrenceli/utils/StringPatternTest.java -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/demo.gif -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/docker-compose.yml -------------------------------------------------------------------------------- /gateway/Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/Dockerfile -------------------------------------------------------------------------------- /gateway/pom.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/pom.xml -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/GatewayApp.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/GatewayApp.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/config/CorsConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/config/CorsConfig.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/config/GatewayHashRingConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/config/GatewayHashRingConfig.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/config/NamingServiceConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/config/NamingServiceConfig.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/config/RedisConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/config/RedisConfig.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/config/WebSocketProperties.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/config/WebSocketProperties.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/discovery/DiscoveryController.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/discovery/DiscoveryController.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/docker/DockerController.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/docker/DockerController.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/docker/DockerService.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/docker/DockerService.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/filter/CustomLoadBalanceFilter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/filter/CustomLoadBalanceFilter.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/filter/CustomReactiveLoadBalanceFilter.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/filter/CustomReactiveLoadBalanceFilter.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/filter/WebSocketSessionLoadBalancer.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/filter/WebSocketSessionLoadBalancer.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/server/FanoutSender.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/server/FanoutSender.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/server/RedisSubscriber.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/server/RedisSubscriber.java -------------------------------------------------------------------------------- /gateway/src/main/java/me/lawrenceli/gateway/server/ServiceNode.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/java/me/lawrenceli/gateway/server/ServiceNode.java -------------------------------------------------------------------------------- /gateway/src/main/resources/application.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/main/resources/application.yaml -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/config/NamingServiceConfigTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/config/NamingServiceConfigTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/discovery/DiscoveryControllerTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/discovery/DiscoveryControllerTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/docker/DockerControllerTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/docker/DockerControllerTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/docker/DockerServiceTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/docker/DockerServiceTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/filter/CustomLoadBalanceFilterTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/filter/CustomLoadBalanceFilterTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/server/RedisSubscriberTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/server/RedisSubscriberTest.java -------------------------------------------------------------------------------- /gateway/src/test/java/me/lawrenceli/gateway/server/ServiceNodeTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/gateway/src/test/java/me/lawrenceli/gateway/server/ServiceNodeTest.java -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/pom.xml -------------------------------------------------------------------------------- /websocket/Dockerfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/Dockerfile -------------------------------------------------------------------------------- /websocket/pom.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/pom.xml -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/WebSocketApp.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/WebSocketApp.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/config/MQConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/config/MQConfig.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/config/WebSocketConfig.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/config/WebSocketConfig.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/controller/WebSocketController.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/controller/WebSocketController.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/event/ServerDownEventHandler.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/event/ServerDownEventHandler.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/event/ServerUpEventHandler.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/event/ServerUpEventHandler.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/server/FanoutReceiver.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/server/FanoutReceiver.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/server/WebSocketEndpoint.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/server/WebSocketEndpoint.java -------------------------------------------------------------------------------- /websocket/src/main/java/me/lawrenceli/websocket/spring/BeanUtils.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/java/me/lawrenceli/websocket/spring/BeanUtils.java -------------------------------------------------------------------------------- /websocket/src/main/resources/application.yaml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/main/resources/application.yaml -------------------------------------------------------------------------------- /websocket/src/test/java/me/lawrenceli/websocket/config/MQConfigTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/test/java/me/lawrenceli/websocket/config/MQConfigTest.java -------------------------------------------------------------------------------- /websocket/src/test/java/me/lawrenceli/websocket/controller/WebSocketControllerTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/test/java/me/lawrenceli/websocket/controller/WebSocketControllerTest.java -------------------------------------------------------------------------------- /websocket/src/test/java/me/lawrenceli/websocket/event/ServerDownEventHandlerTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/test/java/me/lawrenceli/websocket/event/ServerDownEventHandlerTest.java -------------------------------------------------------------------------------- /websocket/src/test/java/me/lawrenceli/websocket/event/ServerUpEventHandlerTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/test/java/me/lawrenceli/websocket/event/ServerUpEventHandlerTest.java -------------------------------------------------------------------------------- /websocket/src/test/java/me/lawrenceli/websocket/server/WebSocketEndpointTest.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/la3rence/websocket-cluster/HEAD/websocket/src/test/java/me/lawrenceli/websocket/server/WebSocketEndpointTest.java --------------------------------------------------------------------------------