作者 crossoverJie

:sparkles: Introducing new features.两种一致性hash 算法+轮询

package com.crossoverjie.cim.common.route.algorithm;
import java.util.List;
/**
* Function:
*
... ... @@ -9,5 +11,5 @@ package com.crossoverjie.cim.common.route.algorithm;
*/
public interface RouteHandle {
String selectServer() ;
String selectServer(List<String> values) ;
}
... ...
... ... @@ -2,6 +2,8 @@ package com.crossoverjie.cim.common.route.algorithm.consistenthash;
import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
import java.util.List;
/**
* Function:
*
... ... @@ -15,7 +17,7 @@ public class ConsistentHashHandle implements RouteHandle {
@Override
public String selectServer() {
public String selectServer(List<String> values) {
return null;
}
}
... ...
package com.crossoverjie.cim.common.route.algorithm.loop;
import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
* Function:
*
* @author crossoverJie
* Date: 2019-02-27 15:13
* @since JDK 1.8
*/
public class LoopHandle implements RouteHandle {
private AtomicLong index = new AtomicLong();
@Override
public String selectServer(List<String> values) {
if (values.size() == 0) {
throw new RuntimeException("CIM 服务器可用服务列表为空");
}
Long position = index.incrementAndGet() % values.size();
if (position < 0) {
position = 0L;
}
return values.get(position.intValue());
}
}
... ...
package com.crossoverjie.cim.route.config;
import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
import com.crossoverjie.cim.common.route.algorithm.loop.LoopHandle;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
... ... @@ -73,4 +75,9 @@ public class BeanConfig {
.retryOnConnectionFailure(true);
return builder.build();
}
@Bean
public RouteHandle buildRouteHandle(){
return new LoopHandle() ;
}
}
... ...
... ... @@ -5,6 +5,7 @@ import com.crossoverjie.cim.common.exception.CIMException;
import com.crossoverjie.cim.common.pojo.CIMUserInfo;
import com.crossoverjie.cim.common.res.BaseResponse;
import com.crossoverjie.cim.common.res.NULLBody;
import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
import com.crossoverjie.cim.route.cache.ServerCache;
import com.crossoverjie.cim.route.service.AccountService;
import com.crossoverjie.cim.route.service.UserInfoCacheService;
... ... @@ -48,6 +49,10 @@ public class RouteController {
@Autowired
private UserInfoCacheService userInfoCacheService ;
@Autowired
private RouteHandle routeHandle ;
@ApiOperation("群聊 API")
@RequestMapping(value = "groupRoute", method = RequestMethod.POST)
@ResponseBody()
... ... @@ -145,7 +150,8 @@ public class RouteController {
//登录校验
StatusEnum status = accountService.login(loginReqVO);
if (status == StatusEnum.SUCCESS) {
String server = serverCache.selectServer();
String server = routeHandle.selectServer(serverCache.getAll());
String[] serverInfo = server.split(":");
CIMServerResVO vo = new CIMServerResVO(serverInfo[0], Integer.parseInt(serverInfo[1]),Integer.parseInt(serverInfo[2]));
... ...