diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfiguration.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfiguration.java index e543846aa..9b41d2aa4 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfiguration.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.cloud.alibaba.nacos.ribbon; import com.netflix.client.config.IClientConfig; -import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ServerList; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -33,7 +32,7 @@ public class NacosRibbonClientConfiguration { @Bean @ConditionalOnMissingBean - public ServerList ribbonServerList(IClientConfig config) { + public ServerList ribbonServerList(IClientConfig config) { NacosServerList serverList = new NacosServerList(config.getClientName()); return serverList; } diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java new file mode 100644 index 000000000..4618bd9d9 --- /dev/null +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServer.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.alibaba.nacos.ribbon; + +import java.util.Map; + +import com.alibaba.nacos.api.naming.pojo.Instance; + +import com.netflix.loadbalancer.Server; + +/** + * @author xiaojing + */ +public class NacosServer extends Server { + + private final MetaInfo metaInfo; + private final Instance instance; + private final Map metadata; + + public NacosServer(Instance instance) { + super(instance.getIp(), instance.getPort()); + this.instance = instance; + this.metaInfo = new MetaInfo() { + @Override + public String getAppName() { + return instance.getService().getName(); + } + + @Override + public String getServerGroup() { + return null; + } + + @Override + public String getServiceIdForDiscovery() { + return null; + } + + @Override + public String getInstanceId() { + return instance.getInstanceId(); + } + }; + this.metadata = instance.getMetadata(); + } + + @Override + public MetaInfo getMetaInfo() { + return metaInfo; + } + + public Instance getInstance() { + return instance; + } + + public Map getMetadata() { + return metadata; + } +} diff --git a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServerList.java b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServerList.java index cec545b84..540e71363 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServerList.java +++ b/spring-cloud-alibaba-nacos-discovery/src/main/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosServerList.java @@ -16,8 +16,8 @@ package org.springframework.cloud.alibaba.nacos.ribbon; -import com.netflix.loadbalancer.Server; -import com.netflix.loadbalancer.ServerList; +import com.netflix.client.config.IClientConfig; +import com.netflix.loadbalancer.AbstractServerList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.alibaba.nacos.registry.NacosRegistration; @@ -29,58 +29,51 @@ import com.alibaba.nacos.api.naming.pojo.Instance; /** * @author xiaojing */ -public class NacosServerList implements ServerList { +public class NacosServerList extends AbstractServerList { @Autowired private NacosRegistration registration; - private String service; + private String serviceId; - public NacosServerList() { - } - public NacosServerList(String service) { - this.service = service; + public NacosServerList(String serviceId) { + this.serviceId = serviceId; } @Override - public List getInitialListOfServers() { + public List getInitialListOfServers() { try { - List instances = registration.getNacosNamingService().selectInstances(service,true); - return hostsToServerList(instances); + List instances = registration.getNacosNamingService().selectInstances(serviceId,true); + return instancesToServerList(instances); } catch (Exception e) { - throw new IllegalStateException("Can not get nacos hosts, service=" + service, e); + throw new IllegalStateException("Can not get service instances from nacos, serviceId=" + serviceId, e); } } @Override - public List getUpdatedListOfServers() { + public List getUpdatedListOfServers() { return getInitialListOfServers(); } - private Server hostToServer(Instance instance) { - Server server = new Server(instance.getIp(), instance.getPort()); - return server; - } - - private List hostsToServerList(List instances) { - List result = new ArrayList(instances.size()); + private List instancesToServerList(List instances) { + List result = new ArrayList<>(instances.size()); for (Instance instance : instances) { if (instance.isHealthy()) { - result.add(hostToServer(instance)); + result.add(new NacosServer(instance)); } } return result; } - public String getService() { - return service; + public String getServiceId() { + return serviceId; } - public void setService(String service) { - this.service = service; + @Override + public void initWithNiwsConfig(IClientConfig iClientConfig) { + this.serviceId = iClientConfig.getClientName(); } - } diff --git a/spring-cloud-alibaba-nacos-discovery/src/test/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfigurationTests.java b/spring-cloud-alibaba-nacos-discovery/src/test/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfigurationTests.java index d401e26a2..8c6da4290 100644 --- a/spring-cloud-alibaba-nacos-discovery/src/test/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfigurationTests.java +++ b/spring-cloud-alibaba-nacos-discovery/src/test/java/org/springframework/cloud/alibaba/nacos/ribbon/NacosRibbonClientConfigurationTests.java @@ -15,7 +15,7 @@ import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.Assertions.assertThat; /** - * Created by yizhan on 2018/9/14. + * @author xiaojing */ public class NacosRibbonClientConfigurationTests { @@ -36,7 +36,7 @@ public class NacosRibbonClientConfigurationTests { this.contextRunner.run(context -> { NacosServerList serverList = context.getBean(NacosServerList.class); - assertThat(serverList.getService()).isEqualTo("myapp"); + assertThat(serverList.getServiceId()).isEqualTo("myapp"); }); }