东莞网站建设制作公司排名,网页设计软件介绍,网站维护都要做什么,无锡建设招标网站Eureka启动#xff0c;原生启动与SpringCloudEureka启动异同
我们先看看作为原生的EurekaServer启动的过程#xff0c;作为一个Servlet应用#xff0c;他的启动入口就是他的主要ServletContextListener类#xff08;这里是EurekaBootStrap#xff09;的contextInitialize…Eureka启动原生启动与SpringCloudEureka启动异同
我们先看看作为原生的EurekaServer启动的过程作为一个Servlet应用他的启动入口就是他的主要ServletContextListener类这里是EurekaBootStrap的contextInitialized方法 EurekaServerBootstrap
Override public void contextInitialized(ServletContextEvent event) { try { initEurekaEnvironment(); initEurekaServerContext(); ServletContext sc event.getServletContext();sc.setAttribute(EurekaServerContext.class.getName(), serverContext);
} catch (Throwable e) {logger.error(Cannot bootstrap eureka server :, e);throw new RuntimeException(Cannot bootstrap eureka server :, e);
}}
可以看出主要做了两件事initEurekaEnvironment()与initEurekaServerContext() 对于initEurekaEnvironment()只是初始化一些必要的环境变量由于Eureka配置基于Spring的配置中间件Archaius这些环境变量都是针对这个配置中间件使用的。 initEurekaServerContext()是我们重点需要关心的它初始化了EurekaServer需要的所有组件
protected void initEurekaServerContext() throws Exception { EurekaServerConfig eurekaServerConfig new DefaultEurekaServerConfig();
//设置json与xml序列化工具
JsonXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
XmlXStream.getInstance().registerConverter(new V1AwareInstanceInfoConverter(), XStream.PRIORITY_VERY_HIGH);
logger.info(Initializing the eureka client...);
logger.info(eurekaServerConfig.getJsonCodecName());
ServerCodecs serverCodecs new DefaultServerCodecs(eurekaServerConfig);ApplicationInfoManager applicationInfoManager null;//初始化EurekaClientEurekaClient用来与其他EurekaServer进行交互
//有可能通过guice初始化Eureka这时eurekaClient和ApplicationInfoManager通过依赖注入先被初始化
if (eurekaClient null) {EurekaInstanceConfig instanceConfig isCloud(ConfigurationManager.getDeploymentContext())? new CloudInstanceConfig(): new MyDataCenterInstanceConfig();applicationInfoManager new ApplicationInfoManager(instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get());EurekaClientConfig eurekaClientConfig new DefaultEurekaClientConfig();eurekaClient new DiscoveryClient(applicationInfoManager, eurekaClientConfig);
} else {applicationInfoManager eurekaClient.getApplicationInfoManager();
}//初始化PeerAwareInstanceRegistry, 这个类里面的方法就是与集群内其他EurekaServer实例保持业务同步的机制
PeerAwareInstanceRegistry registry;
if (isAws(applicationInfoManager.getInfo())) {registry new AwsInstanceRegistry(eurekaServerConfig,eurekaClient.getEurekaClientConfig(),serverCodecs,eurekaClient);awsBinder new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager);awsBinder.start();
} else {registry new PeerAwareInstanceRegistryImpl(eurekaServerConfig,eurekaClient.getEurekaClientConfig(),serverCodecs,eurekaClient);
}//初始化PeerEurekaNodes里面有定时维护Eureka集群的业务逻辑
PeerEurekaNodes peerEurekaNodes getPeerEurekaNodes(registry,eurekaServerConfig,eurekaClient.getEurekaClientConfig(),serverCodecs,applicationInfoManager
);//初始化EurekaServer上下文
serverContext new DefaultEurekaServerContext(eurekaServerConfig,serverCodecs,registry,peerEurekaNodes,applicationInfoManager
);EurekaServerContextHolder.initialize(serverContext);serverContext.initialize();
logger.info(Initialized server context);//从其他节点中读取注册信息并开放服务注册
// Copy registry from neighboring eureka node
int registryCount registry.syncUp();
registry.openForTraffic(applicationInfoManager, registryCount);// Register all monitoring statistics.
EurekaMonitors.registerAllStats();}
总结下来总共如下几点
1.初始化并设置序列化反序列化工具 2.初始化通信客户端EurekaClient 3.初始化集群通信类PeerAwareInstanceRegistry与PeerEurekaNodes 4.初始化EurekaServer上下文serverContext 5.从其他节点中读取注册信息并开放服务注册
然后由于原生的EurekaServer利用Jersey框架初始化restApi这里还有 6.载入Jersey初始化Restful服务api
对于胶水代码实现了大致同样的但是略微有些区别的功能 一、 Server 有哪些功能:
提供服务注册功能。
消费者可以获取服务列表。
服务可以续约。
Server 集群之间的数据共享二、 提供服务注册功能
我们使用 EurekaServer 的时候需要在启动类上加入 EnableEurekaServer注解这个注解肯定就是我们研究的入口。EnableEurekaServer 类
/**
Annotation to activate Eureka Server related configuration.{link EurekaServerAutoConfiguration}author Dave Syerauthor Biju Kunjummen
*/
Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Import(EurekaServerMarkerConfiguration.class) public interface EnableEurekaServer {
}
EurekaServerAutoConfiguration
Configuration Import(EurekaServerInitializerConfiguration.class) ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class) EnableConfigurationProperties({ EurekaDashboardProperties.class, InstanceRegistryProperties.class }) PropertySource(“classpath:/eureka/server.properties”) public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter{ … }
EurekaServerInitializerConfiguration 由于实现了SmartLifecycle, 初始化启动start()方法 额外新创建一个线程初始化initEurekaServerContext() , 发布事件等工作
Configuration public class EurekaServerInitializerConfiguration implements ServletContextAware, SmartLifecycle, Ordered { Override public void start() { new Thread(new Runnable() { Override public void run() { try { // TODO: is this class even needed now? eurekaServerBootstrap.contextInitialized( EurekaServerInitializerConfiguration.this.servletContext); log.info(“Started Eureka Server”); publish(new EurekaRegistryAvailableEvent(getEurekaServerConfig()));EurekaServerInitializerConfiguration.this.running true;publish(new EurekaServerStartedEvent(getEurekaServerConfig()));}catch (Exception ex) {// Help!log.error(Could not initialize Eureka servlet context, ex);}}}).start();
}}
EurekaServerAutoConfiguration 中注入EurekaServerContext
Bean
public EurekaServerContext eurekaServerContext(ServerCodecs serverCodecs,PeerAwareInstanceRegistry registry, PeerEurekaNodes peerEurekaNodes) {return new DefaultEurekaServerContext(this.eurekaServerConfig, serverCodecs,registry, peerEurekaNodes, this.applicationInfoManager);
}在初始化化DefaultEurekaServerContext 类的时候会初始化initialize方法是因为在此方法上面PostConstruct注解. peerEurekaNodes.start() 中。使用单定时任务线程池维护eureka节点
PostConstruct
Override
public void initialize() {logger.info(Initializing ...);peerEurekaNodes.start();try {registry.init(peerEurekaNodes);} catch (Exception e) {throw new RuntimeException(e);}logger.info(Initialized);
}