这周没写博客,写个例子吧
package com.xianjingxia.paymentclient.paycenter;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.EurekaInstanceConfig;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.MyDataCenterInstanceConfig;
import com.netflix.appinfo.providers.EurekaConfigBasedInstanceInfoProvider;
import com.netflix.discovery.DefaultEurekaClientConfig;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.EurekaClientConfig;
import com.netflix.loadbalancer.*;
import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList;
import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;
import javax.inject.Provider;
/**
* Created by xuehan on 2017/7/31.
*/
public class ServerProvider {
private static ApplicationInfoManager applicationInfoManager;
private static EurekaClient eurekaClient;
private static synchronized ApplicationInfoManager initializeApplicationInfoManager(EurekaInstanceConfig instanceConfig) {
if (applicationInfoManager == null) {
InstanceInfo instanceInfo = new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get();
applicationInfoManager = new ApplicationInfoManager(instanceConfig, instanceInfo);
}
return applicationInfoManager;
}
private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig clientConfig) {
if (eurekaClient == null) {
eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig);
}
return eurekaClient;
}
private static DiscoveryEnabledServer getServer(String serviceName) {
ApplicationInfoManager applicationInfoManager = initializeApplicationInfoManager(new MyDataCenterInstanceConfig());
final EurekaClient client = initializeEurekaClient(applicationInfoManager, new DefaultEurekaClientConfig());
Provider<EurekaClient> eurekaClientProvider = new Provider<EurekaClient>() {
public synchronized EurekaClient get() {
return client;
}
};
ServerList<DiscoveryEnabledServer> list = new DiscoveryEnabledNIWSServerList(serviceName, eurekaClientProvider);
IRule rule = new AvailabilityFilteringRule();
ServerListFilter<DiscoveryEnabledServer> filter = new ZoneAffinityServerListFilter<DiscoveryEnabledServer>();
ZoneAwareLoadBalancer<DiscoveryEnabledServer> lb = LoadBalancerBuilder.<DiscoveryEnabledServer>newBuilder()
.withDynamicServerList(list)
.withRule(rule)
.withServerListFilter(filter)
.buildDynamicServerListLoadBalancer();
DiscoveryEnabledServer server = (DiscoveryEnabledServer) lb.chooseServer();
return server;
}
public static ServerInfo getServerInfo(String serviceName){
DiscoveryEnabledServer server = getServer(serviceName);
ServerInfo serverInfo = null;
if(server != null){
serverInfo = new ServerInfo();
serverInfo.setIp(server.getHost());
serverInfo.setPort(server.getPort());
}
return serverInfo;
}
}
通过上面的方式可以动态的服务发现,注意需要在classpath下配置eureka-client.properties的配置文件
eureka.preferSameZone=true
eureka.shouldUseDns=false
eureka.serviceUrl.default=http://peer2:8762/sds/eureka/
eureka.decoderName=JacksonJson