1717package com .alibaba .nacos .console .handler .impl .remote .config ;
1818
1919import com .alibaba .nacos .api .common .Constants ;
20+ import com .alibaba .nacos .api .common .NodeState ;
2021import com .alibaba .nacos .api .config .model .SameConfigPolicy ;
2122import com .alibaba .nacos .api .exception .NacosException ;
2223import com .alibaba .nacos .api .exception .runtime .NacosRuntimeException ;
24+ import com .alibaba .nacos .api .model .response .NacosMember ;
2325import com .alibaba .nacos .api .model .v2 .Result ;
2426import com .alibaba .nacos .auth .config .NacosAuthConfig ;
2527import com .alibaba .nacos .auth .config .NacosAuthConfigHolder ;
2628import com .alibaba .nacos .common .http .HttpUtils ;
2729import com .alibaba .nacos .common .http .param .Query ;
30+ import com .alibaba .nacos .common .utils .CollectionUtils ;
2831import com .alibaba .nacos .common .utils .IoUtils ;
2932import com .alibaba .nacos .common .utils .JacksonUtils ;
3033import com .alibaba .nacos .common .utils .StringUtils ;
3134import com .alibaba .nacos .config .server .utils .RequestUtil ;
3235import com .alibaba .nacos .console .config .NacosConsoleAuthConfig ;
36+ import com .alibaba .nacos .console .handler .core .ClusterHandler ;
3337import com .alibaba .nacos .console .handler .impl .remote .EnabledRemoteHandler ;
3438import com .alibaba .nacos .core .cluster .Member ;
3539import com .alibaba .nacos .core .cluster .NacosMemberManager ;
6468import java .util .Collection ;
6569import java .util .List ;
6670import java .util .Map ;
71+ import java .util .stream .Collectors ;
6772
6873/**
6974 * Nacos config import and export service.
@@ -81,9 +86,12 @@ public class ConfigImportAndExportService {
8186 private static final String REMOTE_CONFIG_EXPORT_URL = "http://%s%s/v3/admin/cs/config/export" ;
8287
8388 private final NacosMemberManager memberManager ;
89+
90+ private final ClusterHandler remoteClusterHandler ;
8491
85- public ConfigImportAndExportService (NacosMemberManager memberManager ) {
92+ public ConfigImportAndExportService (NacosMemberManager memberManager , ClusterHandler remoteClusterHandler ) {
8693 this .memberManager = memberManager ;
94+ this .remoteClusterHandler = remoteClusterHandler ;
8795 }
8896
8997 /**
@@ -98,9 +106,9 @@ public ConfigImportAndExportService(NacosMemberManager memberManager) {
98106 * @return Maps of import success and failed count
99107 */
100108 public Result <Map <String , Object >> importConfig (String sourceUser , String namespaceId , SameConfigPolicy policy ,
101- MultipartFile importFile , String sourceIp , String sourceApp ) {
109+ MultipartFile importFile , String sourceIp , String sourceApp ) throws NacosException {
102110 String serverContextPath = getServerContextPath ();
103- Member serverMember = randomOneMember ();
111+ Member serverMember = randomOneHealthyMember ();
104112 String url = String .format (REMOTE_CONFIG_IMPORT_URL , serverMember .getAddress (), serverContextPath );
105113 try (CloseableHttpClient httpClient = HttpClients .createDefault ()) {
106114 Query query = Query .newInstance ().addParam ("namespaceId" , namespaceId ).addParam ("srcUser" , sourceUser );
@@ -145,7 +153,7 @@ public Result<Map<String, Object>> importConfig(String sourceUser, String namesp
145153 public ResponseEntity <byte []> exportConfig (String dataId , String group , String namespaceId , String appName ,
146154 List <Long > ids ) throws Exception {
147155 String serverContextPath = getServerContextPath ();
148- Member serverMember = randomOneMember ();
156+ Member serverMember = randomOneHealthyMember ();
149157 String url = String .format (REMOTE_CONFIG_EXPORT_URL , serverMember .getAddress (), serverContextPath );
150158 try (CloseableHttpClient httpClient = HttpClients .createDefault ()) {
151159 Query query = Query .newInstance ().addParam ("namespaceId" , namespaceId ).addParam ("dataId" , dataId )
@@ -176,8 +184,19 @@ private String getServerContextPath() {
176184 return EnvUtil .getProperty ("nacos.console.remote.server.context-path" , "/nacos" );
177185 }
178186
179- private Member randomOneMember () {
187+ private Member randomOneHealthyMember () throws NacosException {
188+ // all nodes in cluster.conf
180189 Collection <Member > allMembers = memberManager .allMembers ();
190+ // nodes with state in cluster
191+ Collection <? extends NacosMember > membersWithState = remoteClusterHandler .getNodeList ("" );
192+ Map <String , NodeState > nodeStateMap = membersWithState
193+ .stream ().collect (Collectors .toMap (NacosMember ::getAddress , NacosMember ::getState ));
194+ // remove unhealthy nodes
195+ allMembers .removeIf (node -> !NodeState .UP .equals (nodeStateMap .get (node .getAddress ())));
196+ if (CollectionUtils .isEmpty (allMembers )) {
197+ throw new NacosRuntimeException (NacosException .SERVER_ERROR , "No healthy server node found." );
198+ }
199+
181200 return allMembers .parallelStream ().findAny ().orElseThrow ();
182201 }
183202
0 commit comments