SpringCloud-Eureka

原文:https://xsxy007.github.io/2019/10/SpringCloud-Eureka/
Eureka 是Netflix開源的一款提供服務註冊和發現的產品,提供了完整的Service Registery和Service Discovery實現,也是SpringCloud體系中最核心的組件之一java

Eureka

eureka-overview
由上邊的圖能夠看出,Eureka由客戶端和服務端組成,服務用用於服務的註冊服務器,客戶端用做服務的提供者和發現者git

案例

git@github.com:xsxy007/springcloud-demo.gitgithub

Eureka Server

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裏邊並無內容

1571143069922

集羣配置

簡單的集羣,只要將各個註冊中心相互配置便可
eureka.client.serviceUrl.defaultZone=http://域名:/${server.port}/eureka/,http://域名:/${server.port}/eureka/ 請其餘註冊中心的地址配置的defaultZone中

源碼分析

從啓動類註解開始 @EnableEurekaServer

  • 能夠注意註釋中的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 {

}
  • 再看上邊註解類上有一個 @Import(EurekaServerMarkerConfiguration.class),進入該類查看
// 能夠看到,該類並無什麼實現,該類的做用:是爲了控制 `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

相關文章
相關標籤/搜索