SpringCloud-服務註冊中心

1. 什麼服務註冊中心

所謂服務註冊中心就是在整個的微服務架構中單獨提出一個服務,這個服務不完成系統的任何的業務功能,僅僅用來完成對整個微服務系統的服務註冊和服務發現,以及對服務健康狀態的監控和管理功能。java

服務註冊中心node

  • 能夠對全部的微服務的信息進行存儲,如微服務的名稱、IP、端口等
  • 能夠在進行服務調用時經過服務發現查詢可用的微服務列表及網絡地址進行服務調用
  • 能夠對全部的微服務進行心跳檢測,如發現某實例長時間沒法訪問,就會從服務註冊表移除該實例。

2. 經常使用的註冊中心

springcloud支持的多種註冊中心Eureka(netflix)、Consul、Zookeeper、以及阿里巴巴推出Nacos組件。git

這些註冊中心在本質上都是用來管理服務的註冊和發現以及服務狀態的檢查的。github

3.Eureka

# 0.簡介
- https://github.com/Netflix/eureka/wiki
- Eureka是Netflix開發的服務發現框架,自己是一個基於REST的服務。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務註冊和發現功能。
	Eureka包含兩個組件:Eureka Server和Eureka Client。

單體應用 ------> 分類服務 商品服務 訂單服務 用戶服務......web

Eureka Server 組件 : 服務註冊中心組件 管理全部服務 支持全部服務註冊算法

Eureka Client 組件 : 分類服務 商品服務 訂單服務(微服務)spring

開發Eureka Serverapache

1.建立項目並引入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 https://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.2.5.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.md</groupId>
	<artifactId>02-eurekaserver8761</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>02-eurekaserver8761</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<!--定義springcloud使用版本號-->
		<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
	</properties>

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

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

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

	<!--全局管理springcloud版本,並不會引入具體依賴-->
	<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>

2.編寫配置application.properties

server.port=8761				#執行服務端口
spring.application.name=eurekaserver 	#指定服務名稱 惟一標識
eureka.client.service-url.defaultZone=http://localhost:8761/eureka  #指定服務註冊中心的地址

3.開啓Eureka Server,入口類加入註解

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

4.訪問Eureka的服務註冊頁面

5.雖然能看到管理界面爲何項目啓動控制檯報錯?

eureka server 服務註冊中心 & client 微服務windows

  • 出現上述問題緣由:eureka組件包含 eurekaserver 和 eurekaclient。server是一個服務註冊中心,用來接受客戶端的註冊。client的特性會讓當前啓動的服務把本身做爲eureka的客戶端進行服務中心的註冊,當項目啓動時服務註冊中心尚未建立好,因此找不到服務的客戶端組件就直接報錯了,當啓動成功服務註冊中心建立好了,往後client也能進行註冊,就再也不報錯啦!

6.關閉Eureka本身註冊本身

仍是在application.properties瀏覽器

server.port=8761
spring.application.name=eurekaserver
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
eureka.client.register-with-eureka=false    #再也不將本身同時做爲客戶端進行註冊  
eureka.client.fetch-registry=false				  #關閉做爲客戶端時從eureka server獲取服務信息

7.再次啓動,當前應用就是一個單純Eureka Server,控制器也再也不報錯

開發Eureka Client

項目拆分出來的一個個微服務

1.建立新的boot項目並引入eureka client依賴

<?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 https://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.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.md</groupId>
    <artifactId>02-eurekaserver8888</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>02-eurekaserver8888</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <!--定義springcloud使用版本號-->
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

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

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

        <!--引入eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <!--全局管理springcloud版本,並不會引入具體依賴-->
    <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>

2.編寫配置application.properties

server.port=8888									
spring.application.name=eurekaclient8888	#服務名稱惟一標識
eureka.client.service-url.defaultZone=http://localhost:8761/eureka  #eureka註冊中心地址

3.開啓eureka客戶端加入註解

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

4.啓動以前的8761的服務註冊中心,再啓動eureka客戶端服務

5.查看eureka server的服務註冊狀況

6.eureka自我保護機制

# 0.服務頻繁啓動時 EurekaServer出現警告
- EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

1.自我保護機制

  • 官網地址: https://github.com/Netflix/eureka/wiki/Server-Self-Preservation-Mode
  • 默認狀況下,若是Eureka Server在必定時間內(默認90秒)沒有接收到某個微服務實例的心跳,Eureka Server將會移除該實例。可是當網絡分區故障發生時,微服務與Eureka Server之間沒法正常通訊,而微服務自己是正常運行的,此時不該該移除這個微服務,因此引入了自我保護機制。
  • Eureka Server在運行期間會去統計心跳失敗比例在 15 分鐘以內是否低於 85%,若是低於 85%,Eureka Server 會將這些實例保護起來,讓這些實例不會過時。這種設計的哲學原理就是"寧肯信其有不可信其無!"。自我保護模式正是一種針對網絡異常波動的安全保護措施,使用自我保護模式能使Eureka集羣更加的健壯、穩定的運行。

2.在eureka server端關閉自我保護機制

eureka.server.enable-self-preservation=false  #關閉自我保護
eureka.server.eviction-interval-timer-in-ms=3000 #超時3s自動清除

3.微服務修改減短服務心跳的時間

eureka.instance.lease-expiration-duration-in-seconds=10 #用來修改eureka server默認接受心跳的最大時間 默認是90s
eureka.instance.lease-renewal-interval-in-seconds=5     #指定客戶端多久向eureka server發送一次心跳 默認是30s

4.儘管如此關閉自我保護機制仍是會出現警告

  • THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
  • `官方並不建議在生產狀況下關閉

7.eureka 中止更新

# 1.官方中止更新說明
- https://github.com/Netflix/eureka/wiki
- 在1.x版本項目仍是活躍的,可是在2.x版本中中止維護,出現問題後果自負!!!

4.Consul

consul 服務註冊中心 啓動consul服務註冊中心 運行

consul 客戶端 將springcloud 客戶端(微服務)

consul 簡介

  • https://www.consul.io
  • consul是一個能夠提供服務發現,健康檢查,多數據中心,Key/Value存儲等功能的分佈式服務框架,用於實現分佈式系統的服務發現與配置。與其餘分佈式服務註冊與發現的方案,使用起來也較爲簡單。Consul用Golang實現,所以具備自然可移植性(支持Linux、Windows和Mac OS X);安裝包僅包含一個可執行文件,方便部署。

1.安裝consul

windows下啓動consul

  1. 下載而且解壓https://www.consul.io/downloads
  2. 找到有exe文件那個地址(不要雙擊!!!不要雙擊!!!不要雙擊!!!)
  3. 在路徑的地方輸出cmd,也就是這個文件所在的地址欄輸入cmd
  4. 在cmd窗口裏面輸入consul.exe(這會兒只是安裝完畢了,並無啓動,或許沒反應直接下一步)
  5. 仍是在安裝好consul的cmd窗口裏面輸入:consul agent -dev
  6. 啓動完畢,在瀏覽器輸入http://localhost:8500/
  7. 完成啦

consul的服務端

2.開發consul 客戶端即微服務

# 1.建立boot項目並引入consul客戶端依賴
<?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 https://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.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.md</groupId>
    <artifactId>03-consulclient8889</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>03-consulclient8889</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <!--定義springcloud使用版本號-->
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--引入consul依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
    </dependencies>


    <!--全局管理springcloud版本,並不會引入具體依賴-->
    <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>

# 2.編寫properties配置
server.port=8889
spring.application.name=consulclient8889
spring.cloud.consul.host=localhost					#註冊consul服務的主機
spring.cloud.consul.port=8500						#註冊consul服務的端口號

# 3.啓動服務查看consul界面服務信息

3.consul 開啓健康監控檢查

# 1.開啓consul健康監控
- 默認狀況加consul監控健康是開啓的,可是必須依賴健康監控依賴才能正確監控健康狀態因此直接啓動會顯示錯誤,引入健康監控依賴以後服務正常
<!-- 這個包是用作健康度監控的-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

4.consul 關閉健康監控檢查

server.port=8889
spring.application.name=consulclient8889
spring.cloud.consul.host=localhost			#註冊consul服務的主機
spring.cloud.consul.port=8500				#註冊consul服務的端口號
spring.cloud.consul.discovery.register-health-check=false	    #關閉consu了服務的健康檢查[不推薦]
spring.cloud.consul.discovery.service-name=${spring.application.name} #指定註冊的服務名稱 默認就是應用名

5.不一樣註冊中心區別

1.CAP定理

服務註冊中心集羣 node1 node2 node3 ... eureka(AP) consul zk(CP)

  • CAP定理:CAP定理又稱CAP原則,指的是在一個分佈式系統中,一致性(Consistency)、可用性(Availability)、分區容錯性(Partition tolerance)。CAP 原則指的是,這三個要素最多隻能同時實現兩點,不可能三者兼顧。
  1. 一致性(C):在分佈式系統中的全部數據備份,在同一時刻是否一樣的值。(等同於全部節點訪問同一份最新的數據副本)
  2. 可用性(A):在集羣中一部分節點故障後,集羣總體是否還能響應客戶端的讀寫請求。(對數據更新具有高可用性)
  3. 分區容忍性(P),就是高可用性,一個節點崩了,並不影響其它的節點(100個節點,掛了幾個,不影響服務,越多機器越好)

2.Eureka特色

  • Eureka中沒有使用任何的數據強一致性算法保證不一樣集羣間的Server的數據一致,僅經過數據拷貝的方式爭取註冊中心數據的最終一致性,雖然放棄數據強一致性可是換來了Server的可用性,下降了註冊的代價,提升了集羣運行的健壯性。

3.Consul特色

  • 基於Raft算法,Consul提供強一致性的註冊中心服務,可是因爲Leader節點承擔了全部的處理工做,勢必加大了註冊和發現的代價,下降了服務的可用性。經過Gossip協議,Consul能夠很好地監控Consul集羣的運行,同時能夠方便通知各種事件,如Leader選擇發生、Server地址變動等。

4.zookeeper特色

  • 基於Zab協議,Zookeeper能夠用於構建具有數據強一致性的服務註冊與發現中心,而與此相對地犧牲了服務的可用性和提升了註冊須要的時間。
相關文章
相關標籤/搜索