天天看點

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

一. Spring Cloud 簡介

Spring Cloud 為開發者提供了快熟建構分布式系統的一些工具,包括配置管理,服務發現,斷路器,路由,微代理,事件總線,全局鎖,決策競選,分布式會話,叢集狀态等。協調分布式系統導緻樣闆模式,并且Spring Cloud的開發人員可以快速建立實作這些模式的服務和應用程式。他們适用于任何分布式環境,包括開發人員的筆記本,裸機資料中心和Cloud Foundry等托管平台。此外Spring Cloud基于Spring Boot,需要對Spring Boot 有一定的了解,可參見SpringBoot非官方教程

link

二. Eureka 簡介

Eureka 是Spring Cloud Netflix微服務套件中的一部分,易于和Spring Boot 建構的微服務整合起來。

Eureka包含了服務端和用戶端元件。服務端也被稱作為服務注冊中心,用于提供服務的注冊和發現。Eureka支援高可用的配置,當叢集中有分片出現故障時,Eureka就會轉入自動保護模式,它允許分片故障期間繼續提供服務的發現和注冊,當故障分片恢複正常時,叢集中其他分片會把他們的狀态再次同步回來。用戶端元件包含服務消費者與服務提供者。在應用程式運作時,Eureka用戶端向注冊中心注冊自身提供的服務并周期性的發送心跳來更新它的服務租約。同時也可以從服務端查詢目前注冊的服務資訊并把他們緩存到本地并周期性的重新整理服務狀态。

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現
三. 建構服務注冊中心

  • 建立主maven工程

    首先建立一個主Maven工程,在其pom檔案引入依賴,Spring Boot版本為2.1.3.RELEASE,Spring Cloud版本為Greenwich.RELEASE。這個pom檔案作為父pom檔案,起到依賴版本控制的作用,其他module工程繼承該pom。這一系列文章全部采用這種模式。主pom代碼如下:

    <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>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.kimframework</groupId>
    <artifactId>eureka-cloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    
    <modules>
        <module>eureka-server</module>
        <module>eureka-client</module>
    </modules>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</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>
    </project>           
  • 建立Eureka Server

    建立一個Eureka Server 為服務注冊中心

右鍵工程-->New Module-->Spring Initializr 如下圖:

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

下一步-->Cloud Discovery-->Eureka Server-->下一步

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

建立完成後的Module(eureka-server) 其 pom繼承主pom 檔案,并引入spring-cloud-starter-netflix-eureka-server, 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>
  <parent>
      <groupId>com.kimframework</groupId>
      <artifactId>eureka-cloud</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.kimframework</groupId>
  <artifactId>eureka-server</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-server</name>
  <description>Eureka Server</description>

  <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  </properties>

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

  </dependencies>

</project>           

在eureka-server的啟動類上添加注解@EnableEurekaServer,開啟服務注冊中心的功能,代碼如下:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}           

配置application.yml

server:
  port: 8000

spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/           

在預設情況下,服務注冊中心也會把自己當做是一個服務,将自己注冊進服務注冊中心,是以我們可以通過配置來禁用他的用戶端注冊行為。

配置說明:

server.port : 服務端口

spring.application.name : 應用名稱

eureka.instance.hostname: eureka服務執行個體名稱

eureka.client.fetch-registry : 禁用用戶端服務檢索功能

eureka.client.register-with-eureka: 表示不向服務注冊中心注冊自己

eureka.client.service-ur.defaultZone: 指定服務注冊中心的位址

啟動工程,浏覽器通路eureka-server的主界面:

http://localhost:8000/

界面如下:

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

No application available 沒有服務被發現 ……,因為還沒有服務注冊,是以暫時沒有服務資訊

- 建立Eureka Client

當client向server注冊時,它會提供一些中繼資料,例如主機和端口,URL,首頁等。Eureka server 從每個client執行個體接收心跳消息。 如果心跳逾時,則通常将該執行個體從注冊server中删除。

建立一個Module(eureka-client),建立過程通eureka-server相同, 選擇引入Eureka Discovery 和Web

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

其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>
  <parent>
      <groupId>com.kimframework</groupId>
      <artifactId>eureka-cloud</artifactId>
      <version>1.0-SNAPSHOT</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.kimframework</groupId>
  <artifactId>eureka-client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>eureka-client</name>
  <description>Eureka Client</description>

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

  </dependencies>
</project>
           

配置eureka-client的啟動類,配置@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

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

}           

application.yml :

server:
  port: 8001
spring:
  application:
    name: eureka-client
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka  # 服務注冊中心位址           

需要指明spring.application.name,這個很重要,這在以後的服務與服務之間互相調用一般都是根據這個name 。

啟動eureka-client工程,打開

http://localhost:8000

,即eureka server 的網址:

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

發現eureka-client已經注冊在服務注冊中心了。服務名為:EUREKA-CLIENT 端口為:8001

Spring Cloud 學習之路 | 第一章 :Eureka 服務的注冊和發現

該警告就是發出了Eureka的自我保護機制!服務注冊到Eureka伺服器後,會向其發送心跳,Eureka在運作期間,會統計心跳失敗的比率在15分鐘是否低于85%,如果低于,Eureka伺服器會将這些服務保護起來,不會剔除。

四: 參考資料

https://blog.csdn.net/forezp/article/details/81040925
https://blog.csdn.net/qq_27046951/article/details/82880609