服務註冊中心是服務實現服務化管理的核心組件,相似於目錄服務的做用,主要用來存儲服務信息,譬如提供者 url 串、路由信息等。服務註冊中心是微服務架構中最基礎的設施之一。java
在微服務架構流行以前,註冊中心就已經開始出如今分佈式架構的系統中。好比 Dubbo 是一個在國內比較流行的分佈式框架,被大量的中小型互聯網公司所採用,它提供了比較完善的服務治理功能,而服務治理的實現主要依靠的就是註冊中心。web
註冊中心能夠說是微服務架構中的「通信錄」,它記錄了服務和服務地址的映射關係。在分佈式架構中,服務會註冊到這裏,當服務須要調用其它服務時,就到這裏找到服務的地址,進行調用。spring
舉個現實生活中的例子,好比說,咱們手機中的通信錄的兩個使用場景:apache
當我想給張三打電話時,那我須要在通信錄中按照名字找到張三,而後就能夠找到他的手機號撥打電話。—— 服務發現李四辦了手機號並把手機號告訴了我,我把李四的號碼存進通信錄,後續,我就能夠從通信錄找到他。—— 服務註冊api
通信錄 —— ?什麼角色(提示:服務註冊中心)安全
總結:服務註冊中心的做用就是服務的註冊和服務的發現。服務器
特性 | Eureka | Nacos | Consul | Zookeeper |
---|---|---|---|---|
CAP | AP | CP + AP | CP | CP |
健康檢查 | Client Beat | TCP/HTTP/MYSQL/Client Beat | TCP/HTTP/gRPC/Cmd | Keep Alive |
雪崩保護 | 有 | 有 | 無 | 無 |
自動註銷實例 | 支持 | 支持 | 不支持 | 支持 |
訪問協議 | HTTP | HTTP/DNS | HTTP/DNS | TCP |
監聽支持 | 支持 | 支持 | 支持 | 支持 |
多數據中心 | 支持 | 支持 | 支持 | 不支持 |
跨註冊中心同步 | 不支持 | 支持 | 支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 支持 |
瞭解了什麼是註冊中心,那麼咱們繼續談談,爲何須要註冊中心。在分佈式系統中,咱們不單單是須要在註冊中心找到服務和服務地址的映射關係這麼簡單,咱們還須要考慮更多更復雜的問題:架構
這些問題的解決都依賴於註冊中心。簡單看,註冊中心的功能有點相似於 DNS 服務器或者負載均衡器,而實際上,註冊中心做爲微服務的基礎組件,可能要更加複雜,也須要更多的靈活性和時效性。因此咱們還須要學習更多 Spring Cloud 微服務組件協同完成應用開發。app
Eureka 是 Netflix 開發的服務發現組件,自己是一個基於 REST 的服務。Spring Cloud 將它集成在其子項目 Spring Cloud Netflix 中,實現 Spring Cloud 的服務註冊與發現,同時還提供了負載均衡、故障轉移等能力。負載均衡
經過 Register、Get、Renew 等接口提供服務的註冊和發現。
服務提供方,把自身的服務實例註冊到 Eureka Server 中。
服務調用方,經過 Eureka Server 獲取服務列表,消費服務。
點擊連接觀看:Eureka 入門案例視頻(獲取更多請關注公衆號「哈嘍沃德先生」)
eureka-demo
聚合工程。SpringBoot 2.2.4.RELEASE
、Spring Cloud Hoxton.SR1
。
咱們建立聚合項目來說解 Eureka,首先建立一個 pom 父工程。
pom.xml
<?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.example</groupId> <!-- 項目模塊名稱 --> <artifactId>eureka-demo</artifactId> <!-- 項目版本名稱 快照版本SNAPSHOT、正式版本RELEASE --> <version>1.0-SNAPSHOT</version> <!-- 繼承 spring-boot-starter-parent 依賴 --> <!-- 使用繼承方式,實現複用,符合繼承的均可以被使用 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.4.RELEASE</version> </parent> <!-- 集中定義依賴組件版本號,但不引入, 在子工程中用到聲明的依賴時,能夠不加依賴的版本號, 這樣能夠統一管理工程中用到的依賴版本 --> <properties> <!-- Spring Cloud Hoxton.SR1 依賴 --> <spring-cloud.version>Hoxton.SR1</spring-cloud.version> </properties> <!-- 項目依賴管理 父項目只是聲明依賴,子項目須要寫明須要的依賴(能夠省略版本信息) --> <dependencyManagement> <dependencies> <!-- spring cloud 依賴 --> <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> </project>
在剛纔的父工程下建立 eureka-server
註冊中心的項目。
pom.xml
<?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.example</groupId> <artifactId>eureka-server</artifactId> <version>1.0-SNAPSHOT</version> <!-- 繼承父依賴 --> <parent> <groupId>com.example</groupId> <artifactId>eureka-demo</artifactId> <version>1.0-SNAPSHOT</version> </parent> <!-- 項目依賴 --> <dependencies> <!-- netflix eureka server 依賴 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- spring boot web 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring boot test 依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
application.yml
server: port: 8761 # 端口 spring: application: name: eureka-server # 應用名稱 # 配置 Eureka Server 註冊中心 eureka: instance: hostname: localhost # 主機名,不配置的時候將根據操做系統的主機名來獲取 client: register-with-eureka: false # 是否將本身註冊到註冊中心,默認爲 true fetch-registry: false # 是否從註冊中心獲取服務註冊信息,默認爲 true service-url: # 註冊中心對外暴露的註冊地址 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
此時若是直接啓動項目是會報錯的,錯誤信息:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
,這是由於 Eureka 默認開啓了將本身註冊至註冊中心和從註冊中心獲取服務註冊信息的配置,若是該應用的角色是註冊中心並是單節點的話,要關閉這兩個配置項。
EurekaServerApplication.java
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication // 開啓 EurekaServer 註解 @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
訪問:http://localhost:8761/
下一篇咱們講解 Eureka 集羣、架構原理、自我保護、優雅停服、安全認證等功能實現。記得關注噢~
本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議
。
你們能夠經過 分類
查看更多關於 Spring Cloud
的文章。
? 您的點贊
和轉發
是對我最大的支持。
? 掃碼關注 哈嘍沃德先生
「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~