springcloud之Eureka註冊中心

參考博客:https://www.cnblogs.com/ityouknow/p/6854805.htmlhtml

背景:

  Eureka是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的組件之一。java

  RPC遠程調用框架的核心設計思想:在於註冊中心,由於註冊中心是管理每一個服務與服務之間的一種依賴關係(服務治理的概念)。spring

  什麼是服務治理?apache

  服務中心:後端

  

  服務中心又稱註冊中心,管理各類服務功能包括服務的註冊、發現、熔斷、負載、降級等,好比dubbo admin後臺的各類功能。有了服務中心調用關係會有什麼變化,畫幾個簡圖來幫忙理解:瀏覽器

  一、項目A調用項目B緩存

  正常調用項目A請求項目B:springboot

 

  有了服務中心以後,任何一個服務都不能直接去掉用,都須要經過服務中心來調用:服務器

 

  二、項目A調用項目B,項目B在調用項目C架構

  這時候調用的步驟就會爲兩步:第一步,項目A首先從服務中心請求項目B服務器,而後項目B在從服務中心請求項目C服務。

  上面的項目只是兩三個相互之間的簡單調用,可是若是項目超過20個30個呢,在15年末的時候我司分佈式的項目就達到了二十幾個,畫一張圖來描述幾十個項目之間的相互調用關係全是線條,任何其中的一個項目改動,就會牽連好幾個項目跟着重啓,巨麻煩並且容易出錯。經過服務中心來獲取服務你不須要關注你調用的項目IP地址,由幾臺服務器組成,每次直接去服務中心獲取可使用的服務去調用既可。

  因爲各類服務都註冊到了服務中心,就有了去作不少高級功能條件。好比幾臺服務提供相同服務來作均衡負載;監控服務器調用成功率來作熔斷,移除服務列表中的故障點;監控服務調用時間來對不一樣的服務器設置不一樣的權重等等。

 

1、Eureka簡介

  Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現。Eureka 採用了 C-S 的設計架構。Eureka Server 做爲服務註冊功能的服務器,它是服務註冊中心。而系統中的其餘微服務,使用 Eureka 的客戶端鏈接到 Eureka Server,並維持心跳鏈接。這樣系統的維護人員就能夠經過 Eureka Server 來監控系統中各個微服務是否正常運行。Spring Cloud 的一些其餘模塊(好比Zuul)就能夠經過 Eureka Server 來發現系統中的其餘微服務,並執行相關的邏輯。

  Eureka由兩個組件組成:Eureka服務器和Eureka客戶端。Eureka服務器用做服務註冊服務器。Eureka客戶端是一個java客戶端,用來簡化與服務器的交互、做爲輪詢負載均衡器,並提供服務的故障切換支持。Netflix在其生產環境中使用的是另外的客戶端,它提供基於流量、資源利用率以及出錯狀態的加權負載均衡。

上圖簡要描述了Eureka的基本架構,由3個角色組成:

一、Eureka Server

  • 提供服務註冊和發現

二、Service Provider

  • 服務提供方
  • 將自身服務註冊到Eureka,從而使服務消費方可以找到

三、Service Consumer

  • 服務消費方
  • 從Eureka獲取註冊服務列表,從而可以消費服務

  Spring Cloud官網的定義比較抽象,咱們能夠從簡單的東西開始。Spring Cloud是基於Spring Boot的, 最適合用於管理Spring Boot建立的各個微服務應用。要管理分佈式環境下的各個Spring Boot微服務,必然存在服務的註冊問題。因此咱們先從服務的註冊談起。既然是註冊,必然有個管理註冊中心的服務器,各個在Spring Cloud管理下的Spring Boot應用就是須要註冊的client。

  Spring Cloud使用erureka server,  而後全部須要訪問配置文件的應用都做爲一個erureka client註冊上去。eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳,在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。

2、實例展現

項目架構:

 

 

  一、 建立Eureka Server

  (1)、工程的maven依賴(建立工程時候選中Eureka後,自動關聯)

<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dyh</groupId>
    <artifactId>springcloud_eurekaclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud_eurekaclient</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>
View Code

  (2)、啓動一個服務註冊中心,只須要一個註解@EnableEurekaServer,這個註解須要在springboot工程的啓動application類上加:

@EnableEurekaServer @SpringBootApplication public class SpringcloudOneApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudOneApplication.class, args); } }

  (3)、eureka是一個高可用的組件,它沒有後端緩存,每個實例註冊以後須要向註冊中心發送心跳(所以能夠在內存中完成),在默認狀況下erureka server也是一個eureka client ,必需要指定一個 server。eureka server的配置文件application.yml

server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

  配置文件簡介:

  • register-with-eureka :表示是否將本身註冊到Eureka Server,默認爲true。
  • fetch-registry :表示是否從Eureka Server獲取註冊信息,默認爲true。

  注意:只有上面兩個屬性都設置爲false,才能是Eureka service。

  • serviceUrl.defaultZone :設置與Eureka Server交互的地址,查詢服務和註冊服務都須要依賴這個地址。默認是http://localhost:8761/eureka ;多個地址可以使用 , 分隔。

  (4)、eureka server 是有界面的,啓動工程,打開瀏覽器訪問:http://localhost:8761,界面以下:因爲尚未註冊服務,因此沒有發現服務。
  

 

 

   二、建立Eureka Client(當client向server註冊時,它會提供一些元數據,例如主機和端口,URL,主頁等。Eureka server 從每一個client實例接收心跳消息。 若是心跳超時,則一般將該實例從註冊server中刪除。)

  (1)、工程的maven依賴(建立工程後自動生成)

 

<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dyh</groupId>
    <artifactId>springcloud_eurekaclient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud_eurekaclient</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <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-client</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>

    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/milestone</url>
        </repository>
    </repositories>

</project>
View Code

  (2)、經過註解@EnableEurekaClient 代表本身是一個eurekaclient。

@EnableEurekaClient @SpringBootApplication @RestController public class SpringcloudEurekaclientApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudEurekaclientApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi "+name+",i am from port:" +port; } }

  (3)、僅僅@EnableEurekaClient是不夠的,還須要在配置文件中註明本身的服務註冊中心的地址,application.yml配置文件以下:

    注意:須要指明spring.application.name,這個很重要,這在之後的服務與服務之間相互調用通常都是根據這個name 。

eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: service-hi

 

  啓動工程,打開http://localhost:8761 ,即eureka server 的網址:

  

  能夠看到,發現了一個服務註冊到了服務上了(首先這個服務必須是運行的)。

 

  這時打開 http://localhost:8762/hi?name=forezp ,你會在瀏覽器上看到 :

  

三、springcloud默認負載均衡

3、集羣的使用

  註冊中心這麼關鍵的服務,若是是單點話,遇到故障就是毀滅性的。在一個分佈式系統中,服務註冊中心是最重要的基礎部分,理應隨時處於能夠提供服務的狀態。爲了維持其可用性,使用集羣是很好的解決方案。Eureka經過互相註冊的方式來實現高可用的部署,因此咱們只須要將Eureke Server配置其餘可用的serviceUrl就能實現高可用部署。

  一、高可用配置是「你中有我,我中有你」,最重要是配置時候名字必須相同。

  二、集羣配置

  

  在註冊過程當中,保證只有一臺註冊中心服務,有對應服務信息數據,當高可用的服務掛掉,對應的服務信息數據,會轉移同步到另外高可用的服務器上。

 4、Eureka的自我保護機制

  參考博客:https://www.jianshu.com/p/ee4785a212f6

  一下是Server與Client端的配置(關閉自我保護機制,默認是開啓的)

相關文章
相關標籤/搜索