Skip to content

Commit 4920a3f

Browse files
authored
Merge pull request #18 from codingapi/tx-lcn-foxdd
Tx lcn foxdd
2 parents 63cb5d7 + b78a5ae commit 4920a3f

6 files changed

Lines changed: 161 additions & 0 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.codingapi.ribbon.loadbalancer;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import com.codingapi.tx.Constants;
7+
import com.codingapi.tx.aop.bean.TxTransactionLocal;
8+
import com.netflix.loadbalancer.Server;
9+
10+
/**
11+
* created by foxdd 2017-12-05
12+
*/
13+
public class LcnLoadBalancerRule {
14+
15+
private Logger logger = LoggerFactory.getLogger(LcnLoadBalancerRule.class);
16+
17+
public Server proxy(Server server){
18+
logger.info("LCNloadBalancer proxy -> map-size -> " + Constants.cacheModelInfo.size());
19+
logger.info("The selected server info, host:" + server.getHost() + ", port:" + server.getPort());
20+
TxTransactionLocal txTransactionLocal = TxTransactionLocal.current();
21+
if(txTransactionLocal == null){
22+
return server;
23+
}
24+
25+
String groupId = txTransactionLocal.getGroupId();
26+
27+
//取出组件的appName
28+
String appName = server.getMetaInfo().getAppName();
29+
30+
String key = groupId + "_" + appName;
31+
32+
Server cachedServer = (Server) Constants.cacheModelInfo.get(key);
33+
if(cachedServer == null){
34+
logger.info("The server of key:" + key + " has not been cached yet!");
35+
Constants.cacheModelInfo.put(key, server);
36+
return server;
37+
} else{
38+
logger.info("The cached server info, host:" + cachedServer.getHost() + ", port:" + cachedServer.getPort());
39+
return cachedServer;
40+
}
41+
42+
}
43+
44+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.codingapi.ribbon.loadbalancer;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import com.netflix.loadbalancer.NoOpLoadBalancer;
7+
import com.netflix.loadbalancer.Server;
8+
9+
/**
10+
* created by foxdd 2017-12-05
11+
*/
12+
public class LcnNoOpLoadBalancerProxy extends NoOpLoadBalancer {
13+
14+
private Logger logger = LoggerFactory.getLogger(LcnNoOpLoadBalancerProxy.class);
15+
16+
LcnLoadBalancerRule lcnLoadBalancerRule = new LcnLoadBalancerRule();
17+
18+
public LcnNoOpLoadBalancerProxy(){
19+
super();
20+
}
21+
22+
@Override
23+
public Server chooseServer(Object key){
24+
logger.info("enter chooseServer method, key:" + key);
25+
return lcnLoadBalancerRule.proxy(super.chooseServer(key));
26+
}
27+
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.codingapi.ribbon.loadbalancer;
2+
3+
import org.springframework.context.annotation.Bean;
4+
import org.springframework.context.annotation.Configuration;
5+
6+
import com.netflix.client.config.IClientConfig;
7+
import com.netflix.loadbalancer.ILoadBalancer;
8+
import com.netflix.loadbalancer.IPing;
9+
import com.netflix.loadbalancer.IRule;
10+
import com.netflix.loadbalancer.Server;
11+
import com.netflix.loadbalancer.ServerList;
12+
import com.netflix.loadbalancer.ServerListFilter;
13+
import com.netflix.loadbalancer.ServerListUpdater;
14+
15+
@Configuration
16+
public class LcnRibbonConfiguration {
17+
18+
/**
19+
* 为ribbon的loadbalancer做代理,相比于重写IRULE,重写loadbalancer更有利于用户自选LB算法,而且有默认LB算法可用
20+
* @param config
21+
* @param serverList
22+
* @param serverListFilter
23+
* @param rule
24+
* @param ping
25+
* @param serverListUpdater
26+
* @return
27+
*/
28+
@Bean
29+
public ILoadBalancer ribbonLoadBalancer(IClientConfig config,
30+
ServerList<Server> serverList, ServerListFilter<Server> serverListFilter,
31+
IRule rule, IPing ping, ServerListUpdater serverListUpdater) {
32+
return new LcnZoneAwareLoadBalancerProxy<>(config, rule, ping, serverList,
33+
serverListFilter, serverListUpdater);
34+
}
35+
36+
/*@Bean
37+
public IRule ribbonRule(){
38+
return new LcnRandomRuleProxy();
39+
}*/
40+
41+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.codingapi.ribbon.loadbalancer;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import com.netflix.client.config.IClientConfig;
7+
import com.netflix.loadbalancer.IPing;
8+
import com.netflix.loadbalancer.IRule;
9+
import com.netflix.loadbalancer.Server;
10+
import com.netflix.loadbalancer.ServerList;
11+
import com.netflix.loadbalancer.ServerListFilter;
12+
import com.netflix.loadbalancer.ServerListUpdater;
13+
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
14+
15+
/**
16+
* created by foxdd 2017-12-05
17+
*/
18+
public class LcnZoneAwareLoadBalancerProxy<T extends Server> extends ZoneAwareLoadBalancer<T> {
19+
20+
private Logger logger = LoggerFactory.getLogger(LcnZoneAwareLoadBalancerProxy.class);
21+
22+
LcnLoadBalancerRule lcnLoadBalancerRule = new LcnLoadBalancerRule();
23+
24+
public LcnZoneAwareLoadBalancerProxy(IClientConfig clientConfig, IRule rule,
25+
IPing ping, ServerList<T> serverList, ServerListFilter<T> filter,
26+
ServerListUpdater serverListUpdater) {
27+
super(clientConfig, rule, ping, serverList, filter, serverListUpdater);
28+
}
29+
30+
@Override
31+
public Server chooseServer(Object key){
32+
logger.info("enter chooseServer method, key:" + key);
33+
return lcnLoadBalancerRule.proxy(super.chooseServer(key));
34+
}
35+
36+
}

transaction-springcloud/src/main/java/com/codingapi/tx/TransactionConfiguration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.codingapi.tx;
22

3+
import org.springframework.cloud.netflix.ribbon.RibbonClients;
34
import org.springframework.context.annotation.ComponentScan;
45
import org.springframework.context.annotation.Configuration;
56

7+
import com.codingapi.ribbon.loadbalancer.LcnRibbonConfiguration;
8+
69
/**
710
* Created by lorne on 2017/6/26.
811
*/
912

1013
@Configuration
1114
@ComponentScan
15+
@RibbonClients(defaultConfiguration=LcnRibbonConfiguration.class)
1216
public class TransactionConfiguration {
1317

1418

tx-client/src/main/java/com/codingapi/tx/Constants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.codingapi.tx;
22

3+
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
5+
36
import com.codingapi.tx.model.TxServer;
47

58
/**
@@ -25,6 +28,11 @@ public class Constants {
2528
* 模块唯一标示
2629
*/
2730
public static String uniqueKey;
31+
32+
/**
33+
* 用于优化ribbon负载
34+
*/
35+
public static Map<String, Object> cacheModelInfo = new ConcurrentHashMap<>();
2836

2937

3038
}

0 commit comments

Comments
 (0)