服務(wù)發(fā)現(xiàn):Spring Cloud Netflix Eureka

聲明:入門級(jí)文檔,更多內(nèi)容會(huì)持續(xù)更新,不足之處,望不吝指點(diǎn)


一、服務(wù)(注冊(cè))中心
  • 依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
  • 啟用當(dāng)前應(yīng)用為Eureka服務(wù)中心@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class ServiceRegistryAndDiscoverServerEndApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
    }
}
  • 配置
#不向注冊(cè)中心注冊(cè)自己
eureka.client.register-with-eureka=false
#注冊(cè)中心本身不需要拉去服務(wù)列表
eureka.client.fetch-registry=false
  • 額外-心跳機(jī)制與保護(hù)模式
    Eureka通過設(shè)置心跳機(jī)制來判斷注冊(cè)的服務(wù)是否還存在,Renews threshold值表示一分鐘應(yīng)當(dāng)收到的心跳數(shù),Renews (last min)表示上一分鐘實(shí)際收到的心跳數(shù),如果實(shí)際收到的心跳數(shù)小于閾值,則Eureka認(rèn)為是網(wǎng)絡(luò)出現(xiàn)了波動(dòng),此時(shí)Eureka將會(huì)開啟保護(hù)模式,保護(hù)模式期間所有的服務(wù)信息將不會(huì)被刪除,不論該服務(wù)是否真的不可用了。如果實(shí)際心跳數(shù)高于閾值,但某個(gè)服務(wù)在一定時(shí)間內(nèi)還是沒有發(fā)來心跳數(shù)據(jù),則Eureka將該服務(wù)注銷。這一塊涉及的配置有
#是否開啟保護(hù)模式
eureka.server.enableSelfPreservation = true
#設(shè)置應(yīng)收心跳數(shù)與實(shí)際心跳數(shù)的比值,其實(shí)就是根據(jù)理論實(shí)際心跳數(shù)來設(shè)置閾值
eureka.server.renewal-percent-threshold=0.85
#設(shè)置Eureka清理無效服務(wù)的間隔
eureka.server.eviction-interval-timer-in-ms=60000
  • 額外-敏感界面加密
    默認(rèn)情況下,Eureka的服務(wù)中心是可以直接在瀏覽器上訪問的,為了將該界面加密,可以引入spring security為其加密,具體步驟如下:
    • 依賴
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    
    • 配置
    spring.security.user.name=username
    spring.security.user.password=password
    
    • 開啟WebSecurity
    @SpringBootApplication
    @EnableEurekaServer
    @EnableWebSecurity
    public class ServiceRegistryAndDiscoverServerEndApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceRegistryAndDiscoverServerEndApplication.class, args);
        }
    
        @Bean
        public WebSecurityConfigurerAdapter webSecurityConfiguration(){
            return new WebSecurityConfigurerAdapter() {
                @Override
                public void configure(HttpSecurity http) throws Exception {
                    //關(guān)閉csrf防護(hù),避免其他服務(wù)無法訪問服務(wù)中心
                    http.csrf().disable();
                    http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
                }
            };
        }
    
    }
    
    • 實(shí)際效果


      spring-security-login.PNG
  • 額外-Eureka狀態(tài)監(jiān)聽器
    Eureka提供了一些列事件來滿足對(duì)特定事件監(jiān)聽的需求,比如注冊(cè)中心的啟動(dòng),服務(wù)的上線與下線等等。
    • EurekaInstanceCanceledEvent --- 服務(wù)下線事件
    • EurekaInstanceRegisteredEvent --- 服務(wù)注冊(cè)事件
    • EurekaInstanceRenewedEvent --- 服務(wù)續(xù)約事件
    • EurekaRegistryAvailableEvent Eureka --- 注冊(cè)中心啟動(dòng)事件
    • EurekaServerStartedEvent --- Eureka Server啟動(dòng)事件
@EventListener
public void listen(EurekaRegistryAvailableEvent event){
    System.out.println("注冊(cè)中心啟動(dòng)");
}

二、客戶端(服務(wù))
  • 依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 啟動(dòng)當(dāng)前應(yīng)用為Eureka客戶端(服務(wù))
@SpringBootApplication
@EnableEurekaClient
public class ServiceRegistryAndDiscoverApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceRegistryAndDiscoverApplication.class, args);
    }

}
  • 配置
# 應(yīng)用(服務(wù))的名字
spring.application.name=server-client-1
#Eureka 注冊(cè)中心的地址
eureka.client.service-url.defaultZone=http://username:password@localhost:8761/eureka/

實(shí)際上注冊(cè)中心的配置是eureka.client.service-url,defaultZone不過是個(gè)鍵名罷了

  • 額外-使用ip地址進(jìn)行服務(wù)的注冊(cè)
    開啟該配置后Eureka將會(huì)使用ip地址來注冊(cè)該服務(wù),而不是使用主機(jī)名來注冊(cè)
eureka.instance.prefer-ip-address=true
  • 額外-設(shè)置服務(wù)的實(shí)例id顯示格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
  • 額外-心跳相關(guān)設(shè)置
#每隔多少秒發(fā)送一次心跳信息
eureka.instance.lease-renewal-interval-in-seconds=30
#自上次發(fā)送心跳數(shù)據(jù)后,多少秒后未接到該服務(wù)的心跳數(shù)據(jù),可以認(rèn)為該服務(wù)下線并可以進(jìn)行刪除
eureka.instance.lease-expiration-duration-in-seconds=90
#是否啟用/actuator/health來進(jìn)行服務(wù)的健康檢查而不是使用心跳數(shù)據(jù)
eureka.client.healthcheck.enabled=false
  • 額外-使用安全的https協(xié)議來進(jìn)行與Eureka之間的交互
eureka.instance.non-secure-port-enabled=false
eureka.instance.secure-port-enabled=true
  • 額外-使用RestTemplate而不是Jersey來進(jìn)行Rest服務(wù)的訪問
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-apache-client4</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 額外-客戶端配置刷新機(jī)制
    Eureka Client會(huì)定時(shí)進(jìn)行配置的檢查并刷新,當(dāng)刷新行為發(fā)生時(shí),將會(huì)導(dǎo)致服務(wù)暫時(shí)的不可用??梢酝ㄟ^下列配置來關(guān)閉該功能
eureka.client.refresh.enable=false
  • 額外-配置服務(wù)的狀態(tài)和健康信息頁面(如果你沒有使用actuator的話)
#配置服務(wù)的狀態(tài)信息頁面,第一個(gè)是絕對(duì)路徑,第二個(gè)是相對(duì)路徑
#eureka.instance.status-page-url
eureka.instance.status-page-url-path=${server.servletPath}/info
#配置服務(wù)的健康信息頁面,第一個(gè)是絕對(duì)路徑,第二個(gè)是相對(duì)路徑
#eureka.instance.health-check-url
eureka.instance.health-check-url-path=${server.servletPath}/health
  • 額外-使用DiscoveryClient(org.springframework.cloud.client.discovery.DiscoveryClient)類來手動(dòng)拉去服務(wù)中心的服務(wù)信息
    • DiscoveryClient#getServices拉去服務(wù)中心的服務(wù)名列表
    • DiscoveryClient#getInstances獲取指定服務(wù)的服務(wù)實(shí)例對(duì)象
    List<ServiceInstance> list = discoveryClient.getInstances(instanceId);
    

參考文檔:
[1] Spring Cloud Netflix

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容