1717
1818package org .apache .servicecomb .registry .sc ;
1919
20+ import java .util .ArrayList ;
21+ import java .util .Collections ;
2022import java .util .HashMap ;
2123import java .util .List ;
2224import java .util .Map ;
25+ import java .util .concurrent .ConcurrentHashMap ;
2326
2427import org .apache .http .HttpHost ;
2528import org .apache .http .auth .AuthScope ;
5053public class SCClientUtils {
5154 private static final Logger LOGGER = LoggerFactory .getLogger (SCClientUtils .class );
5255
53- private static volatile ServiceCenterAddressManager serviceAddressManager ;
56+ // Compatible chassis multi-registration center
57+ private static final Map <String , ServiceCenterAddressManager > serviceAddressManagers = new ConcurrentHashMap <>();
5458
5559 public static ServiceCenterAddressManager createAddressManager (SCConfigurationProperties discoveryProperties ,
5660 Environment environment ) {
@@ -70,18 +74,35 @@ public static ServiceCenterAddressManager createAddressManager(SCConfigurationPr
7074 */
7175 public static ServiceCenterAddressManager createAddressManager (String projectName , List <String > addresses ,
7276 Environment environment ) {
73- if (serviceAddressManager == null ) {
77+ String region = environment .getProperty ("servicecomb.datacenter.region" );
78+ String availableZone = environment .getProperty ("servicecomb.datacenter.availableZone" );
79+ if (getServiceCenterAddressManager (addresses ) == null ) {
7480 synchronized (SCClientUtils .class ) {
75- if (serviceAddressManager == null ) {
81+ if (getServiceCenterAddressManager (addresses ) == null ) {
82+ String key = String .join ("," , addresses );
7683 LOGGER .info ("initialize discovery server={}" , addresses );
77- String region = environment . getProperty ( "servicecomb.datacenter.region" );
78- String availableZone = environment . getProperty ( "servicecomb.datacenter. availableZone" );
79- serviceAddressManager = new ServiceCenterAddressManager ( projectName , addresses , EventManager . getEventBus (),
80- region , availableZone ) ;
84+ ServiceCenterAddressManager addressManager = new ServiceCenterAddressManager ( projectName , addresses ,
85+ EventManager . getEventBus (), region , availableZone );
86+ serviceAddressManagers . put ( key , addressManager );
87+ return addressManager ;
8188 }
8289 }
8390 }
84- return serviceAddressManager ;
91+ return getServiceCenterAddressManager (addresses );
92+ }
93+
94+ private static ServiceCenterAddressManager getServiceCenterAddressManager (List <String > addresses ) {
95+ String forwardKey = String .join ("," , addresses );
96+ List <String > tempAddr = new ArrayList <>(addresses );
97+ Collections .reverse (tempAddr );
98+ String reverseKey = String .join ("," , addresses );
99+ if (serviceAddressManagers .get (forwardKey ) != null ) {
100+ return serviceAddressManagers .get (forwardKey );
101+ }
102+ if (serviceAddressManagers .get (reverseKey ) != null ) {
103+ return serviceAddressManagers .get (reverseKey );
104+ }
105+ return null ;
85106 }
86107
87108 // add other headers needed for registration by new ServiceCenterClient(...)
0 commit comments