SpringCloud學習記錄——2.註冊中心

1.前言

經過上一篇博客的理論知識儲備後,接下來我們正式開始Spring Cloud的學習。在微服務架構中,比較重要的組件就是分佈式協調中心,即註冊中心,目前常用的註冊中心有Zookeeper、Eureka、Nacos,這裏我們就重點來學習一下Eureka的使用。


開發環境

  • JDK1.8
  • Maven3
  • IntelliJ IDEA

使用技術

  • Spring Boot
  • Spring Cloud
  • Eureka

2.eureka-server的實現

既然被稱爲微服務項目,那麼在項目中自然會出現多個module(模塊),現在我們就來嘗試編寫一下。
首先,我們需要實現eureka-server,即服務註冊中心的邏輯。

  1. 創建一個普通的maven項目,不要勾選任何maven的可選模板,同時把src目錄刪除,因爲我們在這裏不需要它。
  2. 之後,創建服務註冊中心。在當前項目中新建模塊eureka-server,如圖所示:
    在這裏插入圖片描述
    在這裏插入圖片描述
    注意,如果這裏你的網絡不好,點擊Next後可能會彈錯,這是因爲鏈接超時了,只需要再多重試幾次即可。
  3. 編寫模塊的相應信息,讓Group與父項目的包名一致,再設置Artifact爲eureka-server,如圖所示:(爲了簡略篇幅,以後在新建模塊時Group都默認爲你的父項目名,而Artifact爲該段博客的標題,就不再貼出截圖了)
    在這裏插入圖片描述
  4. 點擊Next後,選擇對應依賴,這裏只選擇Eureka Server即可,如圖所示:
    在這裏插入圖片描述
  5. 創建該模塊完成後,修改該模塊的啓動類,添加相應註解@EnableEurekaServer,表示這個類是Eureka的服務器端,代碼如下:
package com.springclouddemo.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  1. 修改resources目錄下的application.properties,這裏爲了格式整潔用了yml的格式,可以根據自己的需要進行選擇,代碼如下:
server:
  port: 18761
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

這裏簡單地介紹一下配置文件的編寫格式
使用eureka節點配置hostname(可以認爲是IP或者域名),然後最主要是設置service-url,這裏需要說下,對應的configuration類裏面,service-url是一個Map類型的,因爲註冊中心可以搭建集羣,所以它的地址不是唯一的,當然,我們使用單機模式即可。
添加defaultZone是因爲它需要一個默認的註冊中心地址。
我們先來說下fetch-registryregister-with-eurekaregister-with-eureka這個配置意思就是註冊中心不把自己註冊爲服務提供者,因爲本身註冊中心是提供服務註冊功能,並沒有對外提供什麼服務。
fetch-registry當註冊中心不把自己註冊爲服務後,也不需要從註冊中心(自己)來同步服務消息了,所以也要設置爲false。

  1. 以上的配置完成後,啓動項目,使用瀏覽器訪問http://localhost:18761/,若能夠看到如下界面,說明服務啓動成功
    在這裏插入圖片描述

3.eureka-client的實現

我們在上面實現了eureka-server,接下來我們需要實現eureka-client,即服務提供者的邏輯。

  1. 同樣創建一個新的模塊,前面的步驟都相同,記得修改相應的Group和Artifact,即將Artifact改爲eureka-client
  2. 在選擇相應的依賴時,我們這次選擇Web和Eureka Discovery Client,如圖所示:
    在這裏插入圖片描述
  3. 創建好了該模塊之後,修改啓動類,添加註解@EnableDiscoveryClient表示這是一個客戶端,然後實現一個顯示當前端口的簡單接口方法,代碼如下:
package com.springclouddemo.eurekaclient;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class EurekaClientApplication {

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

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String hi(){
        return "IP:" + port;
    }

}
  1. 修改application.yml(這裏默認爲properties,以下的描述全都爲yml),注意區別端口,代碼如下:
server:
  port: 18762
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
  application:
    name: service-hi
  1. 先啓動eureka-server,再啓動eureka-client,訪問註冊中心,可以看到我們註冊的服務已經上線了,如圖所示:
    在這裏插入圖片描述
    SERVICE-HI 即是我們在配置文件中定義的服務名,Eureka是用服務名作爲唯一的標識,後邊可以看到我們服務的地址信息
    除此之外,我們還發現註冊中心出現了一部分紅色字體。
    在這裏插入圖片描述
    這個原因是Eureka註冊中心在設置的閥值時間內,沒有檢測到活動的服務,則自己會進入保護機制(內部是15分鐘心跳續約低於85%)。在生產環境下,因爲網絡延遲等原因,心跳失敗實例的比例很有可能超標,但是此時就把服務剔除列表並不妥當,因爲服務可能沒有宕機。Eureka在這段時間內不會剔除任何服務實例,直到網絡恢復正常。生產環境下這很有效,保證了大多數服務依然可用,不過也有可能獲取到失敗的服務實例,因此服務調用者必須做好服務的失敗容錯,可以通過在yml中配置來關停自我保護。
    在這裏插入圖片描述
    接下來,看看我們註冊的服務在註冊中心中是什麼形式體現的。
    在這裏插入圖片描述
    主要關注Status狀態,UP表示服務正常,DOWN表示服務在那時異常,但是如果在閥值時間內,還沒有檢測到心跳,則會剔除這個服務。
    我們在SERVICE-HI服務中,提供一個REST接口,通過網頁來訪問。

  2. 訪問http://localhost:18762/hi,可以訪問到剛纔實現的方法,如圖所示:
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章