溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Eureka服務(wù)的注冊(cè)方法和拓展

發(fā)布時(shí)間:2021-06-26 09:14:33 來(lái)源:億速云 閱讀:239 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Eureka服務(wù)的注冊(cè)方法和拓展”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Eureka服務(wù)的注冊(cè)方法和拓展”吧!

SpringCloud從看不懂到放棄,第二章

一、Eureka服務(wù)的注冊(cè)與發(fā)現(xiàn)

Eureka

Netflix在設(shè)計(jì)Eureka時(shí)遵守的就是AP原則

CAP原則又稱CAP定理,指的是在一個(gè)分布式系統(tǒng)中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性),三者不可兼得

1、Eureka簡(jiǎn)介

	Eureka是Netflix的一個(gè)子模塊,是一個(gè)基于Rest的服務(wù),用于服務(wù)定位,已實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。
	
	服務(wù)注冊(cè)與發(fā)現(xiàn)對(duì)于微服務(wù)架構(gòu)來(lái)說(shuō)是非常重要的,有了服務(wù)發(fā)現(xiàn)與注冊(cè),只需要使用服務(wù)的標(biāo)識(shí)符,就可以訪問(wèn)到服務(wù),而不需要修改服務(wù)調(diào)用的配置文件了。

	功能類似于dubbo的注冊(cè)中心,比如zookeeper

Eureka基本架構(gòu)

	Spring Cloud 封裝了 Netflix 公司開(kāi)發(fā)的 Eureka 模塊來(lái)實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)(請(qǐng)對(duì)比Zookeeper)。

	Eureka 采用了 C-S 的設(shè)計(jì)架構(gòu)。Eureka Server 作為服務(wù)注冊(cè)功能的服務(wù)器,它是服務(wù)注冊(cè)中心。
 
	而系統(tǒng)中的其他微服務(wù),使用 Eureka 的客戶端連接到 Eureka Server并維持心跳連接。這樣系統(tǒng)的維護(hù)人員就可以通過(guò) Eureka Server 來(lái)監(jiān)控系統(tǒng)中各個(gè)微服務(wù)是否正常運(yùn)行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過(guò) Eureka Server 來(lái)發(fā)現(xiàn)系統(tǒng)中的其他微服務(wù),并執(zhí)行相關(guān)的邏輯。

	Eureka包含兩個(gè)組件:Eureka Server和Eureka Client
	Eureka Server提供服務(wù)注冊(cè)服務(wù)
	各個(gè)節(jié)點(diǎn)啟動(dòng)后,會(huì)在EurekaServer中進(jìn)行注冊(cè),這樣EurekaServer中的服務(wù)注冊(cè)表中將會(huì)存儲(chǔ)所有可用服務(wù)節(jié)點(diǎn)的信息,服務(wù)節(jié)點(diǎn)的信息可以在界面中直觀的看到
 
	EurekaClient是一個(gè)Java客戶端,用于簡(jiǎn)化Eureka Server的交互,客戶端同時(shí)也具備一個(gè)內(nèi)置的、使用輪詢(round-robin)負(fù)載算法的負(fù)載均衡器。在應(yīng)用啟動(dòng)后,將會(huì)向Eureka Server發(fā)送心跳(默認(rèn)周期為30秒)。如果Eureka Server在多個(gè)心跳周期內(nèi)沒(méi)有接收到某個(gè)節(jié)點(diǎn)的心跳,EurekaServer將會(huì)從服務(wù)注冊(cè)表中把這個(gè)服務(wù)節(jié)點(diǎn)移除(默認(rèn)90秒)

Eureka服務(wù)的注冊(cè)方法和拓展

三大結(jié)構(gòu)

1、Eureka server提供服務(wù)注冊(cè)與發(fā)現(xiàn)
2、service provide將自身服務(wù)注冊(cè)到Eureka,從而使服務(wù)消費(fèi)方能夠找到
3、service consumer從Eureka獲取注冊(cè)服務(wù)列表,從而能夠消費(fèi)服務(wù)

2、構(gòu)建項(xiàng)目

項(xiàng)目結(jié)構(gòu)

總父工程
通用模塊API
服務(wù)提供者Provider
服務(wù)消費(fèi)者Consumer
eureka服務(wù)注冊(cè)中心module
(1)、cloud-eureka-7001

POM

主要包含一個(gè)spring-cloud-starter-eureka-server

<?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">

    <parent>
        <artifactId>cloud</artifactId>
        <groupId>com.lee</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>cloud-eureka-7001</artifactId>

    <dependencies>
        <!--eureka-server服務(wù)端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- 修改后立即生效,熱部署 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>


</project>

注意:

基本上我們要引入cloud的一個(gè)新的技術(shù)組件,會(huì)有兩步

1、新增一個(gè)相關(guān)的maven坐標(biāo)
	<dependency>
		<groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
	</dependency>

2、在主啟動(dòng)類上標(biāo)注啟動(dòng)該新組件的相關(guān)注解標(biāo)簽
	@EnableEurekaServer 
	@EnableZuulProxy
	@EnableXXXXX
	...

APPLICATION.YML

主要暴露eureka端口和對(duì)外服務(wù)地址

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服務(wù)端的實(shí)例名稱
  client:
    register-with-eureka: false #false表示不向注冊(cè)中心注冊(cè)自己。
    fetch-registry: false #false表示自己端就是注冊(cè)中心,我的職責(zé)就是維護(hù)服務(wù)實(shí)例,并不需要去檢索服務(wù)
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設(shè)置與Eureka Server交互的地址查詢服務(wù)和注冊(cè)服務(wù)都需要依賴這個(gè)地址。

主啟動(dòng)類

package com.lee.cloud;

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

//EurekaServer服務(wù)器端啟動(dòng)類,接受其它微服務(wù)注冊(cè)進(jìn)來(lái)
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer7001_App {

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

測(cè)試

http://localhost:7001
(2)、將已有的部門微服務(wù)注冊(cè)進(jìn)Eureka服務(wù)中心

修改cloud-provider-dept-8001

POM - 新增 eureka客戶端 config配置中心

<!-- 將微服務(wù)provider側(cè)注冊(cè)進(jìn)eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

<!--注意:-->
<!--
	如果eureka下載不下來(lái)的話
	改成這個(gè)
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.6.RELEASE</version>
        </dependency>

-->

YML - 新增 eureka服務(wù)地址

 eureka:
  client: #客戶端注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)
    service-url: 
      defaultZone: http://localhost:7001/eureka

主啟動(dòng)類 - 新增 將本服務(wù)啟動(dòng)后自動(dòng)注冊(cè)進(jìn)eureka服務(wù)中

@EnableEurekaClient //本服務(wù)啟動(dòng)后會(huì)自動(dòng)注冊(cè)進(jìn)eureka服務(wù)中

測(cè)試:

1、啟動(dòng) cloud-eureka-7001
2、啟動(dòng) cloud-provider-dept-8001
3、http://localhost:7001

注意:暴露在eureka中的微服務(wù)名稱,即provider的yml中spring:application:name的名稱

如果找不到服務(wù)的話,大概率是應(yīng)為spring-cloud-starter-eureka和
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>

版本不一致導(dǎo)致的
(3)、actuator與注冊(cè)微服務(wù)信息完善---主機(jī)映射名稱修改

Eureka服務(wù)中的顯示

ApplicationAMIsAvailability ZonesStatus
CLOUD-DEPTn/a (1)(1)UP (1) - windows10.microdone.cn:cloud-dept:8001

目標(biāo):修改 windows10.microdone.cn:cloud-dept:8001的顯示

cloud-provider-dept-8001修改:

YML

eureka:
	instance:
    	instance-id: cloud-dept8001

結(jié)果:

ApplicationAMIsAvailability ZonesStatus
CLOUD-DEPTn/a (1)(1)UP (1) - cloud-dept8001
(4)、actuator與注冊(cè)微服務(wù)信息完善---主機(jī)IP信息提示

鼠標(biāo)移動(dòng)到上側(cè)超鏈接時(shí),瀏覽器左下角的鏈接顯示

cloud-provider-dept-8001修改:

YML

eureka:
	instance:
		prefer-ip-address: true  #訪問(wèn)路徑可以顯示IP地址
(5)、actuator與注冊(cè)微服務(wù)信息完善---Info內(nèi)容構(gòu)建

cloud-dept8001超了解點(diǎn)擊后內(nèi)容的構(gòu)建

cloud-provider-dept-8001修改:

POM

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

YML

info:									#內(nèi)容以info開(kāi)頭下邊隨便寫
  app.name: cloud
  author.name: lee
  app.function: 部門服務(wù)提供者
  build.artifactId: $project.artifactId$
  build.version: $project.version$

CLOUD父工程POM

<build><!--構(gòu)建-->
   <finalName>microservicecloud</finalName>
   <resources>	<!--可以訪問(wèn)src/main/resources下的文件-->
     <resource>
       <directory>src/main/resources</directory>
       <filtering>true</filtering>
     </resource>
   </resources>
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <configuration>
         <delimiters>
          <delimit>$</delimit>
         </delimiters>
       </configuration>
     </plugin>
   </plugins>
  </build>

結(jié)果:

訪問(wèn):http://192.168.101.39:8001/info
顯示:
{"app":
	{
		"name":"cloud",
		"function":"部門服務(wù)提供者"
	},
 "author":{"name":"lee"},
 "build":{
			"artifactId":"$project.artifactId$",
			"version":"$project.version$"
		  }
}

3、Eureka集群配置

(1)、仿照cloud-eureka-7001創(chuàng)建cloud-eureka-7002和cloud-eureka-7003

(2)、修改 映射

c:\Windows\System32\drivers\etc下的host文件
添加如下:
	127.0.0.1   eureka7001.com
	127.0.0.1   eureka7002.com
	127.0.0.1   eureka7003.com

(3)、三臺(tái)eureka服務(wù)的yml配置

eureka:
   instance:
		hostname: eureka7001.com  ##eureka服務(wù)端的實(shí)例名稱,知識(shí)localhost換了個(gè)名而已

eureka:
	client:
		defaultZone: http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
		##也可以是http://localhost:7002/eureka,http://localhost:7003/eureka

(4)、cloud-provider-dept-8001 YML服務(wù)地址修改

eureka:
	client:
		service-url:
			defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

測(cè)試:

http://eureka7001.com:7001
http://eureka7002.com:7002
http://eureka7003.com:7003

Eureka服務(wù)的注冊(cè)方法和拓展

4、Eureka自我保護(hù)機(jī)制

	某時(shí)刻某一個(gè)微服務(wù)不可用了,或者長(zhǎng)時(shí)間沒(méi)有被調(diào)用,eureka不會(huì)立刻清理,依舊會(huì)對(duì)該微服務(wù)的信息進(jìn)行保存。(網(wǎng)絡(luò)擁堵或者調(diào)用超時(shí))

	什么是自我保護(hù)模式?
  
	默認(rèn)情況下,如果EurekaServer在一定時(shí)間內(nèi)沒(méi)有接收到某個(gè)微服務(wù)實(shí)例的心跳,EurekaServer將會(huì)注銷該實(shí)例(默認(rèn)90秒)。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)生時(shí),微服務(wù)與EurekaServer之間無(wú)法正常通信,以上行為可能變得非常危險(xiǎn)了——因?yàn)槲⒎?wù)本身其實(shí)是健康的,此時(shí)本不應(yīng)該注銷這個(gè)微服務(wù)。Eureka通過(guò)“自我保護(hù)模式”來(lái)解決這個(gè)問(wèn)題——當(dāng)EurekaServer節(jié)點(diǎn)在短時(shí)間內(nèi)丟失過(guò)多客戶端時(shí)(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個(gè)節(jié)點(diǎn)就會(huì)進(jìn)入自我保護(hù)模式。一旦進(jìn)入該模式,EurekaServer就會(huì)保護(hù)服務(wù)注冊(cè)表中的信息,不再刪除服務(wù)注冊(cè)表中的數(shù)據(jù)(也就是不會(huì)注銷任何微服務(wù))。當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,該Eureka Server節(jié)點(diǎn)會(huì)自動(dòng)退出自我保護(hù)模式。
 
	在自我保護(hù)模式中,Eureka Server會(huì)保護(hù)服務(wù)注冊(cè)表中的信息,不再注銷任何服務(wù)實(shí)例。當(dāng)它收到的心跳數(shù)重新恢復(fù)到閾值以上時(shí),該Eureka Server節(jié)點(diǎn)就會(huì)自動(dòng)退出自我保護(hù)模式。它的設(shè)計(jì)哲學(xué)就是寧可保留錯(cuò)誤的服務(wù)注冊(cè)信息,也不盲目注銷任何可能健康的服務(wù)實(shí)例。一句話講解:好死不如賴活著
 
	綜上,自我保護(hù)模式是一種應(yīng)對(duì)網(wǎng)絡(luò)異常的安全保護(hù)措施。它的架構(gòu)哲學(xué)是寧可同時(shí)保留所有微服務(wù)(健康的微服務(wù)和不健康的微服務(wù)都會(huì)保留),也不盲目注銷任何健康的微服務(wù)。使用自我保護(hù)模式,可以讓Eureka集群更加的健壯、穩(wěn)定。

5、Eureka和Zookeeper對(duì)比

RDBS(mysql/oracle/sqlserver)---->ACID
NOSQL(redis/mongodb)----->CAP
---------------------------------------------------------
---------------------------------------------------------
ACID:   atomicity原子性、
		consistency一致性、
		isolation獨(dú)立性、
		durability持久性

CAP:	consistency強(qiáng)一致性、
		 availability高可用、
		 partition tolerance 分區(qū)容錯(cuò)性
---------------------------------------------------------
---------------------------------------------------------
Eureka遵守AP  Zookeeper遵守CP

 
 	作為服務(wù)注冊(cè)中心,Eureka比Zookeeper好在哪里
著名的CAP理論指出,一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C(一致性)、A(可用性)和P(分區(qū)容錯(cuò)性)。由于分區(qū)容錯(cuò)性P在是分布式系統(tǒng)中必須要保證的,因此我們只能在A和C之間進(jìn)行權(quán)衡。
因此
	Zookeeper保證的是CP,
	Eureka則是AP。
 
1. Zookeeper保證CP
	當(dāng)向注冊(cè)中心查詢服務(wù)列表時(shí),我們可以容忍注冊(cè)中心返回的是幾分鐘以前的注冊(cè)信息,但不能接受服務(wù)直接down掉不可用。也就是說(shuō),服務(wù)注冊(cè)功能對(duì)可用性的要求要高于一致性。但是zk會(huì)出現(xiàn)這樣一種情況,當(dāng)master節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障與其他節(jié)點(diǎn)失去聯(lián)系時(shí),剩余節(jié)點(diǎn)會(huì)重新進(jìn)行l(wèi)eader選舉。問(wèn)題在于,選舉leader的時(shí)間太長(zhǎng),30 ~ 120s, 且選舉期間整個(gè)zk集群都是不可用的,這就導(dǎo)致在選舉期間注冊(cè)服務(wù)癱瘓。在云部署的環(huán)境下,因網(wǎng)絡(luò)問(wèn)題使得zk集群失去master節(jié)點(diǎn)是較大概率會(huì)發(fā)生的事,雖然服務(wù)能夠最終恢復(fù),但是漫長(zhǎng)的選舉時(shí)間導(dǎo)致的注冊(cè)長(zhǎng)期不可用是不能容忍的。
 
2. Eureka保證AP
	Eureka看明白了這一點(diǎn),因此在設(shè)計(jì)時(shí)就優(yōu)先保證可用性。Eureka各個(gè)節(jié)點(diǎn)都是平等的,幾個(gè)節(jié)點(diǎn)掛掉不會(huì)影響正常節(jié)點(diǎn)的工作,剩余的節(jié)點(diǎn)依然可以提供注冊(cè)和查詢服務(wù)。而Eureka的客戶端在向某個(gè)Eureka注冊(cè)或時(shí)如果發(fā)現(xiàn)連接失敗,則會(huì)自動(dòng)切換至其它節(jié)點(diǎn),只要有一臺(tái)Eureka還在,就能保證注冊(cè)服務(wù)可用(保證可用性),只不過(guò)查到的信息可能不是最新的(不保證強(qiáng)一致性)。除此之外,Eureka還有一種自我保護(hù)機(jī)制,如果在15分鐘內(nèi)超過(guò)85%的節(jié)點(diǎn)都沒(méi)有正常的心跳,那么Eureka就認(rèn)為客戶端與注冊(cè)中心出現(xiàn)了網(wǎng)絡(luò)故障,此時(shí)會(huì)出現(xiàn)以下幾種情況: 

2.1、Eureka不再?gòu)淖?cè)列表中移除因?yàn)殚L(zhǎng)時(shí)間沒(méi)收到心跳而應(yīng)該過(guò)期的服務(wù) 
2.2、Eureka仍然能夠接受新服務(wù)的注冊(cè)和查詢請(qǐng)求,但是不會(huì)被同步到其它節(jié)點(diǎn)上(即保證當(dāng)前節(jié)點(diǎn)依然可用) 
2.3、當(dāng)網(wǎng)絡(luò)穩(wěn)定時(shí),當(dāng)前實(shí)例新的注冊(cè)信息會(huì)被同步到其它節(jié)點(diǎn)中
 
	因此, Eureka可以很好的應(yīng)對(duì)因網(wǎng)絡(luò)故障導(dǎo)致部分節(jié)點(diǎn)失去聯(lián)系的情況,而不會(huì)像zookeeper那樣使整個(gè)注冊(cè)服務(wù)癱瘓。	

拓展知識(shí)

#服務(wù)發(fā)現(xiàn)

@AutoWire
private DiscoveryClient client;

List<String> serviceList = client.getServices();//列出Eureka中所有的服務(wù)
List<ServiceInstance> instanceList = client.getInstances("CLOUD-DEPT");//查找服務(wù)實(shí)例
 
instance.getServiceId();//實(shí)例ID
instance.getHost();//實(shí)例主機(jī)
instance.getPort();//實(shí)例端口
instance.getUri();//實(shí)例Uri
    
@EnableDiscoveryClient //主啟動(dòng)類上+服務(wù)發(fā)現(xiàn)注解

感謝各位的閱讀,以上就是“Eureka服務(wù)的注冊(cè)方法和拓展”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Eureka服務(wù)的注冊(cè)方法和拓展這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI