作者 crossoverJie

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

1 package com.crossoverjie.cim.common.route.algorithm; 1 package com.crossoverjie.cim.common.route.algorithm;
2 2
  3 +import java.util.List;
  4 +
3 /** 5 /**
4 * Function: 6 * Function:
5 * 7 *
@@ -9,5 +11,5 @@ package com.crossoverjie.cim.common.route.algorithm; @@ -9,5 +11,5 @@ package com.crossoverjie.cim.common.route.algorithm;
9 */ 11 */
10 public interface RouteHandle { 12 public interface RouteHandle {
11 13
12 - String selectServer() ; 14 + String selectServer(List<String> values) ;
13 } 15 }
@@ -2,6 +2,8 @@ package com.crossoverjie.cim.common.route.algorithm.consistenthash; @@ -2,6 +2,8 @@ package com.crossoverjie.cim.common.route.algorithm.consistenthash;
2 2
3 import com.crossoverjie.cim.common.route.algorithm.RouteHandle; 3 import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
4 4
  5 +import java.util.List;
  6 +
5 /** 7 /**
6 * Function: 8 * Function:
7 * 9 *
@@ -15,7 +17,7 @@ public class ConsistentHashHandle implements RouteHandle { @@ -15,7 +17,7 @@ public class ConsistentHashHandle implements RouteHandle {
15 17
16 18
17 @Override 19 @Override
18 - public String selectServer() { 20 + public String selectServer(List<String> values) {
19 return null; 21 return null;
20 } 22 }
21 } 23 }
  1 +package com.crossoverjie.cim.common.route.algorithm.loop;
  2 +
  3 +import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
  4 +
  5 +import java.util.List;
  6 +import java.util.concurrent.atomic.AtomicLong;
  7 +
  8 +/**
  9 + * Function:
  10 + *
  11 + * @author crossoverJie
  12 + * Date: 2019-02-27 15:13
  13 + * @since JDK 1.8
  14 + */
  15 +public class LoopHandle implements RouteHandle {
  16 + private AtomicLong index = new AtomicLong();
  17 +
  18 + @Override
  19 + public String selectServer(List<String> values) {
  20 + if (values.size() == 0) {
  21 + throw new RuntimeException("CIM 服务器可用服务列表为空");
  22 + }
  23 + Long position = index.incrementAndGet() % values.size();
  24 + if (position < 0) {
  25 + position = 0L;
  26 + }
  27 +
  28 + return values.get(position.intValue());
  29 + }
  30 +}
1 package com.crossoverjie.cim.route.config; 1 package com.crossoverjie.cim.route.config;
2 2
  3 +import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
  4 +import com.crossoverjie.cim.common.route.algorithm.loop.LoopHandle;
3 import com.google.common.cache.CacheBuilder; 5 import com.google.common.cache.CacheBuilder;
4 import com.google.common.cache.CacheLoader; 6 import com.google.common.cache.CacheLoader;
5 import com.google.common.cache.LoadingCache; 7 import com.google.common.cache.LoadingCache;
@@ -73,4 +75,9 @@ public class BeanConfig { @@ -73,4 +75,9 @@ public class BeanConfig {
73 .retryOnConnectionFailure(true); 75 .retryOnConnectionFailure(true);
74 return builder.build(); 76 return builder.build();
75 } 77 }
  78 +
  79 + @Bean
  80 + public RouteHandle buildRouteHandle(){
  81 + return new LoopHandle() ;
  82 + }
76 } 83 }
@@ -5,6 +5,7 @@ import com.crossoverjie.cim.common.exception.CIMException; @@ -5,6 +5,7 @@ import com.crossoverjie.cim.common.exception.CIMException;
5 import com.crossoverjie.cim.common.pojo.CIMUserInfo; 5 import com.crossoverjie.cim.common.pojo.CIMUserInfo;
6 import com.crossoverjie.cim.common.res.BaseResponse; 6 import com.crossoverjie.cim.common.res.BaseResponse;
7 import com.crossoverjie.cim.common.res.NULLBody; 7 import com.crossoverjie.cim.common.res.NULLBody;
  8 +import com.crossoverjie.cim.common.route.algorithm.RouteHandle;
8 import com.crossoverjie.cim.route.cache.ServerCache; 9 import com.crossoverjie.cim.route.cache.ServerCache;
9 import com.crossoverjie.cim.route.service.AccountService; 10 import com.crossoverjie.cim.route.service.AccountService;
10 import com.crossoverjie.cim.route.service.UserInfoCacheService; 11 import com.crossoverjie.cim.route.service.UserInfoCacheService;
@@ -48,6 +49,10 @@ public class RouteController { @@ -48,6 +49,10 @@ public class RouteController {
48 @Autowired 49 @Autowired
49 private UserInfoCacheService userInfoCacheService ; 50 private UserInfoCacheService userInfoCacheService ;
50 51
  52 +
  53 + @Autowired
  54 + private RouteHandle routeHandle ;
  55 +
51 @ApiOperation("群聊 API") 56 @ApiOperation("群聊 API")
52 @RequestMapping(value = "groupRoute", method = RequestMethod.POST) 57 @RequestMapping(value = "groupRoute", method = RequestMethod.POST)
53 @ResponseBody() 58 @ResponseBody()
@@ -145,7 +150,8 @@ public class RouteController { @@ -145,7 +150,8 @@ public class RouteController {
145 //登录校验 150 //登录校验
146 StatusEnum status = accountService.login(loginReqVO); 151 StatusEnum status = accountService.login(loginReqVO);
147 if (status == StatusEnum.SUCCESS) { 152 if (status == StatusEnum.SUCCESS) {
148 - String server = serverCache.selectServer(); 153 +
  154 + String server = routeHandle.selectServer(serverCache.getAll());
149 String[] serverInfo = server.split(":"); 155 String[] serverInfo = server.split(":");
150 CIMServerResVO vo = new CIMServerResVO(serverInfo[0], Integer.parseInt(serverInfo[1]),Integer.parseInt(serverInfo[2])); 156 CIMServerResVO vo = new CIMServerResVO(serverInfo[0], Integer.parseInt(serverInfo[1]),Integer.parseInt(serverInfo[2]));
151 157