NodeBalanceRule.java 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package com.shawn.rule;
  2. import java.net.InetAddress;
  3. import java.net.UnknownHostException;
  4. import java.util.List;
  5. import java.util.Optional;
  6. import java.util.concurrent.ThreadLocalRandom;
  7. import org.apache.commons.lang.math.RandomUtils;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.context.annotation.Scope;
  10. import org.springframework.stereotype.Component;
  11. import com.netflix.client.config.IClientConfig;
  12. import com.netflix.loadbalancer.AbstractLoadBalancerRule;
  13. import com.netflix.loadbalancer.ILoadBalancer;
  14. import com.netflix.loadbalancer.RandomRule;
  15. import com.netflix.loadbalancer.Server;
  16. import java.net.*;
  17. import java.util.*;
  18. import lombok.extern.slf4j.Slf4j;
  19. /**
  20. *
  21. * @ClassName: GameCenterBalanceRule
  22. * @Description: 根据node对服务进行负载均衡。
  23. */
  24. @Component
  25. @Scope("prototype")
  26. @Slf4j
  27. public class NodeBalanceRule extends RandomRule {
  28. @Override
  29. public Server choose(Object key) {
  30. if (key == null) {
  31. return super.choose(null);
  32. }
  33. List<Server> servers = getLoadBalancer().getReachableServers();
  34. // log.info("server size is : {} , serverList is : {}" , servers.size() ,servers);
  35. Optional<Server> serverOpt = servers.stream().filter(server -> server.getId().contains(String.valueOf(key))).findFirst();
  36. if(serverOpt.isPresent()) {
  37. log.info("choose rule..." + key);
  38. return serverOpt.get();
  39. }
  40. // 根据本机ip,走本机的子服务
  41. // 获取本机ip
  42. String localIp = getLocalIP();
  43. // log.info("localIp:" + localIp);
  44. Optional<Server> opt_local = servers.stream().filter(server -> server.getId().contains(localIp)).findFirst();
  45. if(opt_local.isPresent()) { // 优先走本机
  46. // log.info("choose local server: {}" , opt_local.get());
  47. return opt_local.get();
  48. }else{ // 走同网段
  49. String localIp2 = localIp.substring(0,localIp.lastIndexOf("."));
  50. Optional<Server> opt_local2 = servers.stream().filter(server -> server.getId().contains(localIp2)).findFirst();
  51. if(opt_local2.isPresent()){
  52. // log.info("choose same segment: {}" , opt_local2.get());
  53. return opt_local2.get();
  54. }
  55. }
  56. // log.info("choose Random server");
  57. return super.choose(null);
  58. }
  59. /**
  60. * 获取本机ip
  61. * @return
  62. */
  63. public static String getLocalIP() {
  64. String localIP = "127.0.0.1";
  65. try {
  66. OK:
  67. for (Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements(); ) {
  68. NetworkInterface networkInterface = interfaces.nextElement();
  69. if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
  70. continue;
  71. }
  72. Enumeration<InetAddress> addresses = networkInterface.getInetAddresses();
  73. while (addresses.hasMoreElements()) {
  74. InetAddress address = addresses.nextElement();
  75. if (address instanceof Inet4Address) {
  76. localIP = address.getHostAddress();
  77. break OK;
  78. }
  79. }
  80. }
  81. } catch (SocketException e) {
  82. e.printStackTrace();
  83. }
  84. return localIP;
  85. }
  86. }