您好,登錄后才能下訂單哦!
什么是Spring Cloud Eureka
Spring Cloud Eureka 是 Spring Cloud 中的一個組件,它是基于 Netflix Eureka 做了二次封裝,主要是負責完成微服務框架中服務治理的功能。Spring Cloud通過為 Eureka 增加了 Spring Boot 風格的自動化配置,我們只需要通過簡單的引用依賴和注解就能讓 Spring Boot 夠將的微服務應用輕松的與 Eureka 服務治理體系進行整合。
服務治理
服務治理是微服務框架中最為核心和基礎的模塊,它主要是用來實現各個微服務實例的自動化注冊與發現。
最初開始,可能構建的微服務系統服務并不是很多,我們可以通過一些靜態配置來完成服務的調用。比如有兩個服務 A 和 B,其中 A 服務需要調用 B 服務來完成一個業務操作時,為了實現 B 服務的高可用,無論我們采用服務端的復雜均衡,還是客戶端的負載均衡,我們都需要手工的來維護一份 B 的實例列表。但是隨著業務的發展,系統功能越來越復雜,相應的微服務也是越來越多,這種靜態手工維護的難度會越來越高。
為了解決這種問題,產生了大量的服務治理的框架和產品。這些框架其實都是圍繞著服務注冊和服務發現機制來完成對微服務應用實例的自動化管理。
服務注冊
在服務治理框架中,通常都會構建一個服務注冊中心,每個服務實例單元向注冊中心登記自己的服務,將實例主機位置、端口號、版本號、通信協議等一系列附加信息告訴注冊中心,注冊中心按服務名分類組織服務清單。
服務發現
由于在服務治理框架下操作,服務間的通信與調用不再是通過指定具體的實例地址來實現,而是通過向服務名發起請求調用實現。所以,服務調用方在調用服務提供方的接口時,并不知道具體的服務實例位置。因此,需要先向注冊中心發起查詢請求,獲取實例清單,以實現對具體服務實例的訪問。
搭建 Eureka 注冊中心服務
搭建單中心Eureka
我們之后的所有開發都會基于以上版本進行操作,需要注意的是: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 注解啟動一個服務注冊中心提供給其他應用進行對話。這一步非常簡單,只需在一個普通的 Spring Boot 應用中添加這個注解就能開啟此功能:
@SpringBootApplication @EnableEurekaServer public class ApplicationEurekaServer { public static void main(String[] args) { SpringApplication.run(ApplicationEurekaServer.class, args); } }
在默認的配置下,注冊中心服務端也會將自己作為一個客戶端來注冊自身,一般情況下,我們需要禁用這個功能,修改后的 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 #不檢索服務 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
由于我們都是在本地運行,為了后續的服務區分,我們將服務注冊中心的端口通過 server.port 設置運行端口為:9871
在完成上述配置后,啟動應用并訪問 http://localhost:9871。可以看到如下頁面,其中 Instance currently registered with Eureka 的列表是空的,說明還沒有服務注冊到該注冊中心。
我想大家都注意到上面那兩行醒目的紅字:
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在運行期間,會統計心跳失敗的比例在15分鐘之內是否低于85%,如果出現低于的情況(在單機調試的時候很容易滿足,實際在生產環境上通常是由于網絡不穩定導致),Eureka Server會將當前的實例注冊信息保護起來,同時提示這個警告。
由于在單機情況下很容易出現該問題,按照網上的配置關閉掉自我保護后,Eureka 仍會報警,提示安全模式關閉,無法保證實例正確性。所以,我們暫時忽略該問題,后期集群部署時即可解決。
注冊服務提供者
在完成了注冊中心服務的搭建后,接下來我們可以嘗試將一個既有的 Spring Boot 應用加入到Eureka 的服務治理體系中去。
我們仍然以之前的 spring-cloud-server 為例,我們只需要修改 application.yml以下配置:
# 應用名稱 spring: application: name: spring-cloud-server # eureka 注冊中心位置 eureka: client: service-url: defaultZone: http://localhost:9871/eureka/
修改完成后,即可啟動服務,這時我們在刷新 eureka 的管理頁面,看到Instance currently registered with Eureka的列表信息如下:
這表明,我們的服務已經成功注冊在注冊中心。
相關實例代碼:https://github.com/sagesource/spring-cloud-set
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。