什么是服務注冊與發(fā)現(xiàn)
服務消費者找到服務提供者的這種機制稱為服務發(fā)現(xiàn),又或者服務注冊。
服務提供者矾缓、服務消費者怀酷、服務發(fā)現(xiàn)組件這三者之間的關(guān)系大致如下:
各個微服務在啟動時,將自己的網(wǎng)絡(luò)地址等信息注冊到服務發(fā)現(xiàn)組件中而账,服務發(fā)現(xiàn)組件會存儲這些信息胰坟;
服務消費者可從服務發(fā)現(xiàn)組件查詢服務提供者的網(wǎng)絡(luò)地址,并使用該地址調(diào)用服務提供者的接口泞辐;
各個微服務與服務發(fā)現(xiàn)組件使用一定機制(例如心跳)通信笔横。服務發(fā)現(xiàn)組件如長時間無法與某微服務實例通信,就會自動注銷(即:刪除)該實例咐吼;
當微服務網(wǎng)絡(luò)地址發(fā)生變更(例如實例增減或者IP端口發(fā)生變化等)時吹缔,會重新注冊到服務發(fā)現(xiàn)組件;
客戶端緩存:各個微服務將需要調(diào)用服務的地址緩存在本地锯茄,并使用一定機制更新(例如定時任務更新厢塘、事件推送更新等)。這樣既能降低服務發(fā)現(xiàn)組件的壓力肌幽,同時晚碾,即使服務發(fā)現(xiàn)組件出問題,也不會影響到服務之間的調(diào)用喂急。
綜上格嘁,服務發(fā)現(xiàn)組件應具備以下功能:
服務注冊表:服務注冊表是服務發(fā)現(xiàn)組件的核心(其實就是類似于上面的registry表),它用來記錄各個微服務的信息廊移,例如微服務的名稱糕簿、IP、端口等狡孔。服務注冊表提供查詢API和管理API懂诗,查詢API用于查詢可用的微服務實例,管理API用于服務的注冊和注銷苗膝;
服務注冊與服務發(fā)現(xiàn):服務注冊是指微服務在啟動時殃恒,將自己的信息注冊到服務發(fā)現(xiàn)組件上的過程。服務發(fā)現(xiàn)是指查詢可用微服務列表及其網(wǎng)絡(luò)地址的機制荚醒;
服務檢查:服務發(fā)現(xiàn)組件使用一定機制定時檢測已注冊的服務芋类,如發(fā)現(xiàn)某實例長時間無法訪問,就會從服務注冊表中移除該實例界阁。
Eureka簡介
Eureka是Netflix開源的服務發(fā)現(xiàn)組件,本身是一個基于REST的服務胖喳,包含Server和Client兩部分泡躯,Spring Cloud將它集成在子項目Spring Cloud Netflix中。
搭建
創(chuàng)建父項目
1 打開IDEA
file-new-project-springInitializr
直接next
2 編輯Group和Aritifact,然后next
3 依賴不用加较剃,直接next
4 項目目錄以及命名編輯完點擊finish
5 然后關(guān)閉IDEA咕别,打開你剛剛新建的項目的文件夾,我一般都習慣刪除多余的文件写穴,然后重新打開項目惰拱,這樣項目會清爽一些,
6 修改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 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.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-wsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-wsl</name>
<description>Demo project for Spring Cloud</description>
<packaging>pom</packaging>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
</properties>
<modules>
<!-- 待填模塊名 -->
</modules>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!--依賴管理啊送,用于管理spring-cloud的依賴 -->
<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>
7 創(chuàng)建spring-cloud-eureka模塊
在父項目上右鍵new-->module新建子模塊偿短,同樣什么依賴都不用加,和創(chuàng)建父項目的時候一樣
創(chuàng)建好之后馋没,在父項目的pom里添加module
8 刪除無用文件夾
9 修改spring-cloud-eureka模塊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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-wsl</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-eureka</name>
<packaging>jar</packaging>
<description>Demo project for Spring Cloud Eureka</description>
<dependencies>
<!-- eureka服務端依賴jar包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
該pom繼承父pom
10 啟動類添加注解@EnableEurekaServer
//該注解表明應用為eureka服務昔逗,有可以聯(lián)合多個服務作為集群,對外提供服務注冊以及發(fā)現(xiàn)功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
11 將配置文件改成yml格式篷朵,并編寫配置文件
server:
port: 8761
#eureka客戶端連接配置
eureka:
client:
# 是否要注冊到其他Eureka Server實例
register-with-eureka: false
# 是否要從其他Eureka Server實例獲取數(shù)據(jù)
fetch-registry: false
service-url:
#注冊中心地址
defaultZone: http://localhost:8761/eureka/
12 啟動springcloud-eureka
啟動成功勾怒!
13 打開網(wǎng)頁輸入http://localhost:8761
到此啟動成功!