Spring Cloud Eureka服務(wù)治理的實現(xiàn)
什么是Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud 中的一個組件,它是基于 Netflix Eureka 做了二次封裝,主要是負責(zé)完成微服務(wù)框架中服務(wù)治理的功能。Spring Cloud通過為 Eureka 增加了 Spring Boot 風(fēng)格的自動化配置,我們只需要通過簡單的引用依賴和注解就能讓 Spring Boot 夠?qū)⒌奈⒎?wù)應(yīng)用輕松的與 Eureka 服務(wù)治理體系進行整合。
服務(wù)治理
服務(wù)治理是微服務(wù)框架中最為核心和基礎(chǔ)的模塊,它主要是用來實現(xiàn)各個微服務(wù)實例的自動化注冊與發(fā)現(xiàn)。
最初開始,可能構(gòu)建的微服務(wù)系統(tǒng)服務(wù)并不是很多,我們可以通過一些靜態(tài)配置來完成服務(wù)的調(diào)用。比如有兩個服務(wù) A 和 B,其中 A 服務(wù)需要調(diào)用 B 服務(wù)來完成一個業(yè)務(wù)操作時,為了實現(xiàn) B 服務(wù)的高可用,無論我們采用服務(wù)端的復(fù)雜均衡,還是客戶端的負載均衡,我們都需要手工的來維護一份 B 的實例列表。但是隨著業(yè)務(wù)的發(fā)展,系統(tǒng)功能越來越復(fù)雜,相應(yīng)的微服務(wù)也是越來越多,這種靜態(tài)手工維護的難度會越來越高。
為了解決這種問題,產(chǎn)生了大量的服務(wù)治理的框架和產(chǎn)品。這些框架其實都是圍繞著服務(wù)注冊和服務(wù)發(fā)現(xiàn)機制來完成對微服務(wù)應(yīng)用實例的自動化管理。
服務(wù)注冊
在服務(wù)治理框架中,通常都會構(gòu)建一個服務(wù)注冊中心,每個服務(wù)實例單元向注冊中心登記自己的服務(wù),將實例主機位置、端口號、版本號、通信協(xié)議等一系列附加信息告訴注冊中心,注冊中心按服務(wù)名分類組織服務(wù)清單。
服務(wù)發(fā)現(xiàn)
由于在服務(wù)治理框架下操作,服務(wù)間的通信與調(diào)用不再是通過指定具體的實例地址來實現(xiàn),而是通過向服務(wù)名發(fā)起請求調(diào)用實現(xiàn)。所以,服務(wù)調(diào)用方在調(diào)用服務(wù)提供方的接口時,并不知道具體的服務(wù)實例位置。因此,需要先向注冊中心發(fā)起查詢請求,獲取實例清單,以實現(xiàn)對具體服務(wù)實例的訪問。
搭建 Eureka 注冊中心服務(wù)
搭建單中心Eureka
- Spring Cloud 版本:Finchley.BUILD-SNAPSHOT
- Spring Boot 版本:2.0.2.RELEASE
我們之后的所有開發(fā)都會基于以上版本進行操作,需要注意的是:Sring Cloud 使用的是 SNAPSHOT 版,所以需要在 pom 文件中指定倉庫的地址。
首先,我們新建一個 Spring Boot 工程,命名為:spring-cloud-eureka,并在 pom 中添加必要的依賴,具體 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>
<groupId>com.sagesource</groupId>
<artifactId>spring-cloud-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-cloud-eureka</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.version>
</properties>
<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-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-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
通過 @EnableEurekaServer 注解啟動一個服務(wù)注冊中心提供給其他應(yīng)用進行對話。這一步非常簡單,只需在一個普通的 Spring Boot 應(yīng)用中添加這個注解就能開啟此功能:
@SpringBootApplication
@EnableEurekaServer
public class ApplicationEurekaServer {
public static void main(String[] args) {
SpringApplication.run(ApplicationEurekaServer.class, args);
}
}
在默認的配置下,注冊中心服務(wù)端也會將自己作為一個客戶端來注冊自身,一般情況下,我們需要禁用這個功能,修改后的 application.yml 如下:
# spring config
spring:
application:
name: spring-boot-eureka
# server config
server:
port: 9871
# eureka config
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #不向注冊中心注冊自己
fetch-registry: false #不檢索服務(wù)
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
由于我們都是在本地運行,為了后續(xù)的服務(wù)區(qū)分,我們將服務(wù)注冊中心的端口通過 server.port 設(shè)置運行端口為:9871
在完成上述配置后,啟動應(yīng)用并訪問 http://localhost:9871??梢钥吹饺缦马撁?,其中 Instance currently registered with Eureka 的列表是空的,說明還沒有服務(wù)注冊到該注冊中心。

我想大家都注意到上面那兩行醒目的紅字:
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.
原因:自我保護機制。Eureka Server在運行期間,會統(tǒng)計心跳失敗的比例在15分鐘之內(nèi)是否低于85%,如果出現(xiàn)低于的情況(在單機調(diào)試的時候很容易滿足,實際在生產(chǎn)環(huán)境上通常是由于網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致),Eureka Server會將當(dāng)前的實例注冊信息保護起來,同時提示這個警告。
由于在單機情況下很容易出現(xiàn)該問題,按照網(wǎng)上的配置關(guān)閉掉自我保護后,Eureka 仍會報警,提示安全模式關(guān)閉,無法保證實例正確性。所以,我們暫時忽略該問題,后期集群部署時即可解決。
注冊服務(wù)提供者
在完成了注冊中心服務(wù)的搭建后,接下來我們可以嘗試將一個既有的 Spring Boot 應(yīng)用加入到Eureka 的服務(wù)治理體系中去。
我們?nèi)匀灰灾暗?spring-cloud-server 為例,我們只需要修改 application.yml以下配置:
# 應(yīng)用名稱 spring: application: name: spring-cloud-server # eureka 注冊中心位置 eureka: client: service-url: defaultZone: http://localhost:9871/eureka/
修改完成后,即可啟動服務(wù),這時我們在刷新 eureka 的管理頁面,看到Instance currently registered with Eureka的列表信息如下:

這表明,我們的服務(wù)已經(jīng)成功注冊在注冊中心。
相關(guān)實例代碼:https://github.com/sagesource/spring-cloud-set
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringCloud Eureka 服務(wù)注冊實現(xiàn)過程
- springboot2.0和springcloud Finchley版項目搭建(包含eureka,gateWay,F(xiàn)reign,Hystrix)
- Spring-cloud-eureka使用feign調(diào)用服務(wù)接口
- 詳解spring-cloud與netflixEureka整合(注冊中心)
- SpringCloud Eureka實現(xiàn)服務(wù)注冊與發(fā)現(xiàn)
- 單臺Spring Cloud Eureka升級到三臺Eureka高可用集群
- 細說Springcloud eureka的幾種主動下線服務(wù)的方式
- SpringCloud Eureka自我保護機制原理解析
相關(guān)文章
springboot?aop配合反射統(tǒng)一簽名驗證實踐
這篇文章主要介紹了springboot?aop配合反射統(tǒng)一簽名驗證實踐,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java使用ArrayList實現(xiàn)撲克牌的示例代碼
學(xué)習(xí)了關(guān)于集合類的知識,我們可以做一個小項目來加深對集合類知識的學(xué)習(xí)!本文就來利用ArrayList實現(xiàn)撲克牌發(fā)牌洗牌效果,需要的可以參考一下2022-10-10
EasyUi+Spring Data 實現(xiàn)按條件分頁查詢的實例代碼
這篇文章主要介紹了EasyUi+Spring Data 實現(xiàn)按條件分頁查詢的實例代碼,非常具有實用價值,需要的朋友可以參考下2017-07-07

