Eureka實現服務註冊與發現

weixin_34249678發表於2018-07-28

前言:

微服務化要配合自動化部署與自動化測試以實現快速交付
微服務化容易出現的問題有服務太多的情況下難以發現和治理、呼叫鏈過長難以定位問題、呼叫鏈過長響應時間隨之增加、系統過多難以部署和測試、系統間複雜度隨著服務增多而增大。
Eureka解決了服務註冊與發現問題。
程式碼:
https://github.com/KouLouYiMaSi/springcloud

1、服務註冊於發現

1.1:什麼是服務註冊與發現?

  • 服務發現:顧名思義,發現一個服務
  • 怎麼發現?就是找IP和埠啊
  • 傳統方式怎麼找?在呼叫方里面配置好啊。
  • 雲服務和docker等讓每次啟動服務的IP都不一樣怎麼辦?傳統方式就涼拌了,服務少還好,每次改改配置檔案,服務多呢?挨個改?不能夠
  • 服務註冊:給每個服務提供一個註冊中心,服務上線的時候都把自己的IP埠資訊註冊到註冊中心,有沒有發現原來每個服務的分散式配置都集中到註冊中心了?

1.2:Eureka的服務註冊與發現過程

  • EurekaServer啟動的時候註冊自己的IP埠服務名稱等資訊
  • EurekaClient作為java客戶端,在服務啟動後周期性的(預設30s)向EurekaServer傳送心跳
  • EurekaServer在一定時間(預設90s)沒有收到某個服務的心跳就會登出該例項,EurekaClient傳送canel命令後也會登出該例項
  • EurekaServer之間會相互複製登錄檔資訊
  • EurekaClient會快取登錄檔資訊


    12062369-354a77a6b21aeebb.png
    image.png

2、實戰Eureka

參見程式碼地址:https://github.com/KouLouYiMaSi/springcloud
工具:Intelij Idea

2.1、構建步驟

  • 構建一個主maven專案spring-cloud,pom如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huo</groupId>
    <artifactId>spring-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <module>eureka-server</module>
        <module>eureka-server-1</module>
        <module>eureka-server-2</module>
        <module>service-hi</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
    </parent>

    <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>Finchley.RELEASE</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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>
</project>
  • 構建3個maven module,eureka-server、eureka-server-1、eureka-server-2
    在springcloud專案上右鍵,點new,點Module


    12062369-788d0a8c0d816f1c.png
    image.png

    選擇spring initializer


    12062369-bfb054864638d006.png
    image.png

    填寫必要資訊後勾選
    12062369-4ee4b4a89203a610.png
    image.png

    構建完成開啟eureka-server這個子專案,刪除不必要資訊
    12062369-c7bca7fb23de2dc8.png
    image.png
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huo</groupId>
    <artifactId>eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>com.huo</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

</project>
  • 為了直觀,我們不用同一個起多個例項,而是通過複製2個eureka-server來實現直觀的叢集,點選eureka-server專案ctrl+c ctrl+v,改名字eureka-server-1和eureka-server-2
  • 修改每個server的yml檔案
----eureka-server,這行不要複製,下面資訊複製到eureka-server的yml,以此類推-----
server:
  port: 20001
eureka:
  instance:
    hostname: server1
  client:
    # 表示是否註冊自身到eureka伺服器,以供其他服務發現
    register-with-eureka: true
    # 是否從eureka上獲取註冊資訊
    fetch-registry: true
    # 表示自己的另外兩個同伴的IP和埠
    service-url:
      defaultZone: http://server2:20002/eureka/,http://server3:20003/eureka/
----eureka-server-1-----
server:
  port: 20002
eureka:
  instance:
    hostname: server2
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://server1:20001/eureka/,http://server3:20003/eureka/
----eureka-server-2-----
server:
  port: 20003
eureka:
  instance:
    hostname: server3
  client:
    # 表示是否註冊自身到eureka伺服器
    register-with-eureka: true
    # 是否從eureka上獲取註冊資訊
    fetch-registry: true
    service-url:
      defaultZone: http://server1:20001/eureka/,http://server2:20002/eureka/
  • 每個main檔案增加註解就可以了
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
  • 然後配置一下server1、server2、server3的host,使用switchhost或者直接去etc下面改host檔案
server1 127.0.0.1
server2 127.0.0.1
server3 127.0.0.1
  • 構建叢集完成開啟瀏覽器隨便輸入localhost:20001或者localhost:20002或者localhost:20003訪問就可以看到資訊了


    12062369-7620b39b65cd5878.png
    image.png

2.2、重要配置資訊說明

## eureka : 主要配置屬性在EurekaInstanceConfigBean和EurekaClientConfigBean中
eureka:
  instance:
    # hostname: 127.0.0.1
    # 使用IP註冊
    preferIpAddress: true
    # 心跳間隔
    lease-renewal-interval-in-seconds: 3
    # 服務失效時間: 如果多久沒有收到請求,則可以刪除服務
    lease-expiration-duration-in-seconds: 7
  client:
    # 關閉eureka client
    # enabled: false
    # 註冊自身到eureka伺服器
    registerWithEureka: true
    # 表示是否從eureka伺服器獲取註冊資訊
    fetchRegistry: false
    # 客戶端從Eureka Server叢集裡更新Eureka Server資訊的頻率
    eureka-service-url-poll-interval-seconds: 60
    # 定義從註冊中心獲取註冊服務的資訊
    registry-fetch-interval-seconds: 5
    # 設定eureka伺服器所在的地址,查詢服務和註冊服務都需要依賴這個地址
    serviceUrl:
      defaultZone: http://127.0.0.1:10761/eureka/
       # 設定eureka伺服器所在的地址,可以同時向多個服務註冊服務
       # defaultZone: http://192.168.21.3:10761/eureka/,http://192.168.21.4:10761/eureka/
  server:
     # renewal-percent-threshold: 0.1
     # 關閉自我保護模式
     enable-self-preservation: false
     # Eureka Server 自我保護係數,當enable-self-preservation=true時,啟作用
     # renewal-percent-threshold:
     # 設定清理間隔,單位為毫秒,預設為0
     eviction-interval-timer-in-ms: 3000
     # 設定如果Eureka Server啟動時無法從臨近Eureka Server節點獲取註冊資訊,它多久不對外提供註冊服務
     wait-time-in-ms-when-sync-empty: 6000000
     # 叢集之間相互更新節點資訊的時間頻率
     peer-eureka-nodes-update-interval-ms: 60000

2.3、服務註冊

  • 隨便建立一個spring boot專案
  • 修改下yml配置
server:
  port: 8770
  enable-self-preservation: false
spring:
  application:
    name: service-hi
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:20001/eureka/,http://localhost:20002/eureka/,http://localhost:20003/eureka/
  • 開啟localhost:20001,開啟20002和20003發現沒有這個SERVICE-HI


    12062369-e9441f6f68684ece.png
    image.png

總結:

當使用單節點模式的時候把registerWithEureka設定為false,叢集模式設定為true(預設),叢集模式設定為client可以保證自己被其他服務發現,同時也可以像客戶端一樣從其他server那裡同步登錄檔資訊

相關文章