From f6a623266bc1598cb767a57ff6d3bf3405453687 Mon Sep 17 00:00:00 2001 From: foxshooting Date: Sat, 9 Dec 2017 00:29:55 +0800 Subject: [PATCH 1/5] align with the loadbalance method of master branch --- .../loadbalancer/LcnLoadBalancerRule.java | 50 +++++++++++++++++-- .../LcnNoOpLoadBalancerProxy.java | 6 ++- .../loadbalancer/LcnRibbonConfiguration.java | 2 +- .../LcnZoneAwareLoadBalancerProxy.java | 21 ++++---- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java index 837ccb17f..3210d39bf 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java @@ -1,5 +1,7 @@ package com.codingapi.ribbon.loadbalancer; +import com.lorne.core.framework.utils.encode.MD5Util; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -7,6 +9,8 @@ import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.netflix.loadbalancer.Server; +import java.util.List; + /** * created by foxdd 2017-12-05 */ @@ -14,7 +18,7 @@ public class LcnLoadBalancerRule { private Logger logger = LoggerFactory.getLogger(LcnLoadBalancerRule.class); - public Server proxy(Server server){ + public Server proxy(List qualifiedServers, Server server){ logger.info("LCNloadBalancer proxy -> map-size -> " + Constants.cacheModelInfo.size()); logger.info("The selected server info, host:" + server.getHost() + ", port:" + server.getPort()); TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); @@ -26,10 +30,13 @@ public Server proxy(Server server){ //取出组件的appName String appName = server.getMetaInfo().getAppName(); + + logger.info("The model named " + appName + " is going to be called, groupId:" + groupId); + + String key = MD5Util.md5((groupId + "_" + appName).getBytes()); - String key = groupId + "_" + appName; - - Server cachedServer = (Server) Constants.cacheModelInfo.get(key); + Server cachedServer = getInvoker(txTransactionLocal, qualifiedServers, key); + if(cachedServer == null){ logger.info("The server of key:" + key + " has not been cached yet!"); Constants.cacheModelInfo.put(key, server); @@ -40,5 +47,40 @@ public Server proxy(Server server){ } } + + + private void putInvoker(String key,TxTransactionLocal txTransactionLocal,Server server){ + String appName = server.getMetaInfo().getAppName(); + + String address = server.getHost() + ":" + server.getPort(); + + String md5 = MD5Util.md5((address+appName).getBytes()); + + logger.info("putServer->address->"+address+",md5-->"+md5); + + txTransactionLocal.putLoadBalance(key,md5); + } + + + private Server getInvoker(TxTransactionLocal txTransactionLocal, List servers,String key){ + String val = txTransactionLocal.getLoadBalance(key); + if(StringUtils.isEmpty(val)){ + return null; + } + for(Server server:servers){ + String appName = server.getMetaInfo().getAppName(); + //格式统一为host:port + String address = server.getHost() + ":" + server.getPort(); + + String md5 = MD5Util.md5((address+appName).getBytes()); + + logger.info("getServer->address->"+address+",md5-->"+md5); + + if(val.equals(md5)){ + return server; + } + } + return null; + } } diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnNoOpLoadBalancerProxy.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnNoOpLoadBalancerProxy.java index e05e852dd..af9357329 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnNoOpLoadBalancerProxy.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnNoOpLoadBalancerProxy.java @@ -6,6 +6,9 @@ import com.netflix.loadbalancer.NoOpLoadBalancer; import com.netflix.loadbalancer.Server; +import java.util.ArrayList; +import java.util.List; + /** * created by foxdd 2017-12-05 */ @@ -22,7 +25,8 @@ public LcnNoOpLoadBalancerProxy(){ @Override public Server chooseServer(Object key){ logger.info("enter chooseServer method, key:" + key); - return lcnLoadBalancerRule.proxy(super.chooseServer(key)); + List serverList = new ArrayList(); + return lcnLoadBalancerRule.proxy(serverList, super.chooseServer(key)); } } diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnRibbonConfiguration.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnRibbonConfiguration.java index 9b726015f..1f4df4724 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnRibbonConfiguration.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnRibbonConfiguration.java @@ -29,7 +29,7 @@ public class LcnRibbonConfiguration { public ILoadBalancer ribbonLoadBalancer(IClientConfig config, ServerList serverList, ServerListFilter serverListFilter, IRule rule, IPing ping, ServerListUpdater serverListUpdater) { - return new LcnZoneAwareLoadBalancerProxy<>(config, rule, ping, serverList, + return new LcnZoneAwareLoadBalancerProxy(config, rule, ping, serverList, serverListFilter, serverListUpdater); } diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java index cb2e4da53..a8391bffd 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java @@ -1,28 +1,24 @@ package com.codingapi.ribbon.loadbalancer; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.IPing; -import com.netflix.loadbalancer.IRule; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; -import com.netflix.loadbalancer.ServerListFilter; -import com.netflix.loadbalancer.ServerListUpdater; -import com.netflix.loadbalancer.ZoneAwareLoadBalancer; +import java.util.ArrayList; +import java.util.List; /** * created by foxdd 2017-12-05 */ -public class LcnZoneAwareLoadBalancerProxy extends ZoneAwareLoadBalancer { +public class LcnZoneAwareLoadBalancerProxy extends ZoneAwareLoadBalancer { private Logger logger = LoggerFactory.getLogger(LcnZoneAwareLoadBalancerProxy.class); LcnLoadBalancerRule lcnLoadBalancerRule = new LcnLoadBalancerRule(); public LcnZoneAwareLoadBalancerProxy(IClientConfig clientConfig, IRule rule, - IPing ping, ServerList serverList, ServerListFilter filter, + IPing ping, ServerList serverList, ServerListFilter filter, ServerListUpdater serverListUpdater) { super(clientConfig, rule, ping, serverList, filter, serverListUpdater); } @@ -30,7 +26,10 @@ public LcnZoneAwareLoadBalancerProxy(IClientConfig clientConfig, IRule rule, @Override public Server chooseServer(Object key){ logger.info("enter chooseServer method, key:" + key); - return lcnLoadBalancerRule.proxy(super.chooseServer(key)); + List serverList = new ArrayList(); + serverList = super.getServerListImpl().getUpdatedListOfServers(); + serverList = super.getFilter().getFilteredListOfServers(serverList); + return lcnLoadBalancerRule.proxy(serverList, super.chooseServer(key)); } } From dfcc29d83200cae790a74ad6fe1871ec11b3ceb1 Mon Sep 17 00:00:00 2001 From: foxshooting Date: Sat, 9 Dec 2017 00:31:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=B3=A8=E9=87=8A=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java index a8391bffd..2c1daa25d 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnZoneAwareLoadBalancerProxy.java @@ -27,7 +27,9 @@ public LcnZoneAwareLoadBalancerProxy(IClientConfig clientConfig, IRule rule, public Server chooseServer(Object key){ logger.info("enter chooseServer method, key:" + key); List serverList = new ArrayList(); + //获取处理之后的serverlist serverList = super.getServerListImpl().getUpdatedListOfServers(); + //获取过滤之后的serverlist serverList = super.getFilter().getFilteredListOfServers(serverList); return lcnLoadBalancerRule.proxy(serverList, super.chooseServer(key)); } From 074666da71e035e1cabb72bc19a06933909539a2 Mon Sep 17 00:00:00 2001 From: foxshooting Date: Sat, 9 Dec 2017 00:33:25 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java index 3210d39bf..307e10ff6 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java @@ -39,7 +39,7 @@ public Server proxy(List qualifiedServers, Server server){ if(cachedServer == null){ logger.info("The server of key:" + key + " has not been cached yet!"); - Constants.cacheModelInfo.put(key, server); + putInvoker(key, txTransactionLocal, server); return server; } else{ logger.info("The cached server info, host:" + cachedServer.getHost() + ", port:" + cachedServer.getPort()); From 23821ec194f71b45efd4bd99c5e4583bf93c6820 Mon Sep 17 00:00:00 2001 From: foxshooting Date: Mon, 11 Dec 2017 18:30:12 +0800 Subject: [PATCH 4/5] constants log deleted --- .../codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java index 307e10ff6..42f0c257a 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java @@ -1,14 +1,12 @@ package com.codingapi.ribbon.loadbalancer; +import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.lorne.core.framework.utils.encode.MD5Util; +import com.netflix.loadbalancer.Server; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.codingapi.tx.Constants; -import com.codingapi.tx.aop.bean.TxTransactionLocal; -import com.netflix.loadbalancer.Server; - import java.util.List; /** @@ -19,7 +17,6 @@ public class LcnLoadBalancerRule { private Logger logger = LoggerFactory.getLogger(LcnLoadBalancerRule.class); public Server proxy(List qualifiedServers, Server server){ - logger.info("LCNloadBalancer proxy -> map-size -> " + Constants.cacheModelInfo.size()); logger.info("The selected server info, host:" + server.getHost() + ", port:" + server.getPort()); TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); if(txTransactionLocal == null){ From a8dbdb21026d972b2138997affc4850fcb481580 Mon Sep 17 00:00:00 2001 From: foxshooting Date: Mon, 11 Dec 2017 22:36:47 +0800 Subject: [PATCH 5/5] coding style aligned with master --- .../loadbalancer/LcnLoadBalancerRule.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java index 42f0c257a..7874da49d 100644 --- a/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java +++ b/transaction-springcloud/src/main/java/com/codingapi/ribbon/loadbalancer/LcnLoadBalancerRule.java @@ -1,5 +1,6 @@ package com.codingapi.ribbon.loadbalancer; +import com.alibaba.fastjson.JSONObject; import com.codingapi.tx.aop.bean.TxTransactionLocal; import com.lorne.core.framework.utils.encode.MD5Util; import com.netflix.loadbalancer.Server; @@ -16,42 +17,46 @@ public class LcnLoadBalancerRule { private Logger logger = LoggerFactory.getLogger(LcnLoadBalancerRule.class); - public Server proxy(List qualifiedServers, Server server){ - logger.info("The selected server info, host:" + server.getHost() + ", port:" + server.getPort()); + public Server proxy(List servers,Server server){ + TxTransactionLocal txTransactionLocal = TxTransactionLocal.current(); - if(txTransactionLocal == null){ + if(txTransactionLocal==null){ return server; } - - String groupId = txTransactionLocal.getGroupId(); - //取出组件的appName - String appName = server.getMetaInfo().getAppName(); + try{ + logger.info("LCNBalanceProxy - > start"); + + String groupId = txTransactionLocal.getGroupId(); + + //取出组件的appName + String appName = server.getMetaInfo().getAppName(); + - logger.info("The model named " + appName + " is going to be called, groupId:" + groupId); + String key = MD5Util.md5((groupId + "_" + appName).getBytes()); + + Server oldServer =getServer(txTransactionLocal,servers,key); + if(oldServer != null){ + logger.info("LCNBalanceProxy - > load old server "); + return server; + } - String key = MD5Util.md5((groupId + "_" + appName).getBytes()); - - Server cachedServer = getInvoker(txTransactionLocal, qualifiedServers, key); + putServer(key, txTransactionLocal, server); + logger.info("LCNBalanceProxy - > load new server "); - if(cachedServer == null){ - logger.info("The server of key:" + key + " has not been cached yet!"); - putInvoker(key, txTransactionLocal, server); return server; - } else{ - logger.info("The cached server info, host:" + cachedServer.getHost() + ", port:" + cachedServer.getPort()); - return cachedServer; + }finally { + logger.info("LCNBalanceProxy - > end"); } - } - private void putInvoker(String key,TxTransactionLocal txTransactionLocal,Server server){ - String appName = server.getMetaInfo().getAppName(); - String address = server.getHost() + ":" + server.getPort(); + private void putServer(String key,TxTransactionLocal txTransactionLocal,Server server){ + String serviceName = server.getMetaInfo().getAppName(); + String address = server.getHostPort(); - String md5 = MD5Util.md5((address+appName).getBytes()); + String md5 = MD5Util.md5((address+serviceName).getBytes()); logger.info("putServer->address->"+address+",md5-->"+md5); @@ -59,17 +64,16 @@ private void putInvoker(String key,TxTransactionLocal txTransactionLocal,Server } - private Server getInvoker(TxTransactionLocal txTransactionLocal, List servers,String key){ + private Server getServer(TxTransactionLocal txTransactionLocal, List servers, String key){ String val = txTransactionLocal.getLoadBalance(key); if(StringUtils.isEmpty(val)){ return null; } for(Server server:servers){ - String appName = server.getMetaInfo().getAppName(); - //格式统一为host:port - String address = server.getHost() + ":" + server.getPort(); + String serviceName = server.getMetaInfo().getAppName(); + String address = server.getHostPort(); - String md5 = MD5Util.md5((address+appName).getBytes()); + String md5 = MD5Util.md5((address+serviceName).getBytes()); logger.info("getServer->address->"+address+",md5-->"+md5);