Zuul2.1 sample程序启动篇
- 问题
- UML
- 解决
问题
不使用AWS环境,Zuul2.1的sample程序是无法启动的。报错如下:
WARN com.netflix.discovery.internal.util.Archaius1Utils [main] Cannot find the properties specified : eureka-client. This may be okay if there are other environment specific properties or the configuration is installed with a different mechanism.
WARN com.netflix.discovery.internal.util.Archaius1Utils [main] Cannot find the properties specified : eureka-client. This may be okay if there are other environment specific properties or the configuration is installed with a different mechanism.
WARN com.netflix.appinfo.AmazonInfo$Builder [main] Skipping the rest of AmazonInfo init as we were not able to load instanceId after the configured number of retries: 3, per fail fast configuration: true
INFO com.netflix.appinfo.RefreshableAmazonInfoProvider [main] Datacenter is: Amazon
分析一下源码,eureka支持三种数据中心:Netflix、Amazon和MyOwn。
BaseServerStartup类使用google inject实现依赖注入。
BaseServerStartup依赖ServerStatusManager和ApplicationInfoManager。
@Injectpublic ServerStatusManager(ApplicationInfoManager applicationInfoManager, DiscoveryClient discoveryClient) {}@Injectpublic ApplicationInfoManager(EurekaInstanceConfig config, InstanceInfo instanceInfo, OptionalArgs optionalArgs) {}
ApplicationInfoManager依赖EurekaInstanceConfig接口的实现。
@ImplementedBy(CloudInstanceConfig.class)
public interface EurekaInstanceConfig { }@Singleton
@ProvidedBy(CloudInstanceConfigProvider.class)
public class CloudInstanceConfig extends PropertiesInstanceConfig implements RefreshableInstanceConfig {public CloudInstanceConfig(String namespace) {this(namespace, new Archaius1AmazonInfoConfig(namespace), null, true);}
}public class RefreshableAmazonInfoProvider implements Provider<AmazonInfo> {private static AmazonInfo init(AmazonInfoConfig amazonInfoConfig, FallbackAddressProvider fallbackAddressProvider) {AmazonInfo info;try {info = AmazonInfo.Builder.newBuilder().withAmazonInfoConfig(amazonInfoConfig).autoBuild(amazonInfoConfig.getNamespace());logger.info("Datacenter is: {}", DataCenterInfo.Name.Amazon);} catch (Throwable e) {logger.error("Cannot initialize amazon info :", e);throw new RuntimeException(e);}......}
}
所以,官方的sample程序,必须使用AWS环境。
没有AWS环境怎么办呢?
UML
解决
public class LSBootStrap {private static Logger logger = Logger.getLogger(LSBootStrap.class);public static void main(String[] args) {new LSBootStrap().start();}public void start() {logger.info("Leishu Zuul Sample: starting up.");long startTime = System.currentTimeMillis();int exitCode = 0;Server server = null;try {ConfigurationManager.loadCascadedPropertiesFromResources("leishu");Injector injector = InjectorBuilder.fromModule(new LSZuulModule()).createInjector();BaseServerStartup serverStartup = injector.getInstance(BaseServerStartup.class);server = serverStartup.server();long startupDuration = System.currentTimeMillis() - startTime;logger.info("Zuul Sample: finished startup. Duration = " + startupDuration + " ms");server.start(true);} catch (Throwable t) {logger.error("###############");logger.error("Zuul Sample: initialization failed. Forcing shutdown now.", t);logger.error("###############");exitCode = 1;} finally {// server shutdownif (server != null) server.stop();System.exit(exitCode);}}
}public class LSZuulModule extends ZuulSampleModule {@Overrideprotected void configure() {//DataCenterInfobind(EurekaInstanceConfig.class).toProvider(MyDataCenterInstanceConfigProvider.class).in(Scopes.SINGLETON);super.configure();}
}
eureka.registration.enabled = false## configuration related to reaching the eureka servers
eureka.preferSameZone = true
eureka.shouldUseDns = falseeureka.serviceUrl.default = http://localhost:8761/eureka# Loading Filters
zuul.filters.root = src/main/groovy/com/netflix/zuul/sample/filters
zuul.filters.locations = ${zuul.filters.root}/inbound,${zuul.filters.root}/outbound,${zuul.filters.root}/endpoint
zuul.filters.packages = com.netflix.zuul.filters.commonapi.ribbon.NIWSServerListClassName = com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList
api.ribbon.DeploymentContextBasedVipAddresses = 192.168.100.232:7001
这样,就可以使用MyOwn类型的数据中心了。
此时,注入ApplicationInfoManager的时候,config是null,instanceInfo就是MyDataCenterInstanceConfig的实例了。
看日志,启动正常。
INFO com.netflix.discovery.DiscoveryClient [main] Getting all instance registry info from the eureka server
INFO com.netflix.discovery.DiscoveryClient [main] The response status is 200WARN com.netflix.zuul.netty.server.BaseServerStartup [main] Configured port: 7001
INFO ls.sample.LSBootStrap [main] Zuul Sample: finished startup. Duration = 3475 ms
WARN com.netflix.zuul.netty.server.Server [main] Proxy listening with TCP transport using NIO
INFO com.netflix.zuul.netty.server.Server [main] Binding to port: 7001