原文:https://xsxy007.github.io/2019/10/SpringCloud-Eureka/
Eureka 是Netflix開源的一款提供服務註冊和發現的產品,提供了完整的Service Registery和Service Discovery實現,也是SpringCloud體系中最核心的組件之一java
由上邊的圖能夠看出,Eureka
由客戶端和服務端組成,服務用用於服務的註冊服務器,客戶端用做服務的提供者和發現者git
git@github.com:xsxy007/springcloud-demo.gitgithub
springboot 已經很好的支持了Eureka,只須要在pom中加入Eureka依賴,並在Application啓動類中加上相關注解便可spring
一、pom依賴添加springboot
本次使用的springboot版本爲2.1.9;springcloud版本爲Greenwich.RELEASE服務器
如下列出了全部的依賴(ps:一開始由於springcloud和springboot的版本依賴問題,致使項目一直啓動報錯)app
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
二、在啓動類上加註解@EnableEurekaServer
註解maven
@SpringBootApplication @EnableEurekaServer public class SpringcloudDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudDemoApplication.class, args); } }
三、配置文件ide
在默認配置下,該註冊中心會將本身做爲客戶端嘗試註冊本身,所以在單機的註冊中心時,須要將此機制關閉掉spring-boot
server: port: 8761 # 使用的是默認的端口 spring: application: name: eureka-server eureka: client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://localhost:${server.port}/eureka/
eureka.client.register-with-eureka
:表示是否將本身註冊的eureka server,默認爲true
eureka.client.fetch-registry
:表示是否從eureka server上拉取註冊信息,默認爲true
eureka.client.service-url.defaultZone
:表示註冊中心的地址(默認爲localhost:8761/eureka/)
四、啓動項目
啓動項目後訪問localhost:8761
便可顯示以下頁面,此時 Instances current Registers裏邊並無內容
簡單的集羣,只要將各個註冊中心相互配置便可
eureka.client.serviceUrl.defaultZone=http://域名:/${server.port}/eureka/,http://域名:/${server.port}/eureka/
請其餘註冊中心的地址配置的defaultZone中
EurekaServerAutoConfiguration
,該類就是EurekaServer的自動配置類/** * Annotation to activate Eureka Server related configuration {@link EurekaServerAutoConfiguration} * @author Dave Syer * @author Biju Kunjummen */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(EurekaServerMarkerConfiguration.class) public @interface EnableEurekaServer { }
// 能夠看到,該類並無什麼實現,該類的做用:是爲了控制 `EurekaServerAutoConfiguration` 類是否加載 @Configuration public class EurekaServerMarkerConfiguration { @Bean public Marker eurekaServerMarkerBean() { return new Marker(); } class Marker { } }
EurekaServerAutoConfiguration
(該類是在經過Springboot的@EnableAutoconfiguration 來加載spring.factories中的類的)// 省略了部分代碼 @Configuration @Import(EurekaServerInitializerConfiguration.class) @ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class) // 當存在 EurekaServerMarkerConfiguration 類是才初始化當前文件 @EnableConfigurationProperties({ EurekaDashboardProperties.class, InstanceRegistryProperties.class }) @PropertySource("classpath:/eureka/server.properties") public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter { // 實例化一個配置類,該配置類在 EurekaServerInitializerConfiguration 中會使用到 @Configuration protected static class EurekaServerConfigBeanConfiguration { @Bean @ConditionalOnMissingBean public EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) { EurekaServerConfigBean server = new EurekaServerConfigBean(); if (clientConfig.shouldRegisterWithEureka()) { // Set a sensible default if we are supposed to replicate server.setRegistrySyncRetries(5); } return server; } } // eurekaServer的上下文 @Bean public EurekaServerContext eurekaServerContext(ServerCodecs serverCodecs, PeerAwareInstanceRegistry registry, PeerEurekaNodes peerEurekaNodes) { return new DefaultEurekaServerContext(this.eurekaServerConfig, serverCodecs, registry, peerEurekaNodes, this.applicationInfoManager); } // eurekaServer的啓動 @Bean public EurekaServerBootstrap eurekaServerBootstrap(PeerAwareInstanceRegistry registry, EurekaServerContext serverContext) { return new EurekaServerBootstrap(this.applicationInfoManager, this.eurekaClientConfig, this.eurekaServerConfig, registry, serverContext); } }
EurekaServerInitializerConfiguration
類,該類實現了lifecycle接口,因此會被spring容器毀掉start方法@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(); // 調用 start 方法啓動線程 }
參考: https://blog.csdn.net/cuixhao110/article/details/88353714