Eureka實現服務註冊與發現
前言:
微服務化要配合自動化部署與自動化測試以實現快速交付
微服務化容易出現的問題有服務太多的情況下難以發現和治理、呼叫鏈過長難以定位問題、呼叫鏈過長響應時間隨之增加、系統過多難以部署和測試、系統間複雜度隨著服務增多而增大。
Eureka解決了服務註冊與發現問題。
程式碼:
https://github.com/KouLouYiMaSi/springcloud
1、服務註冊於發現
1.1:什麼是服務註冊與發現?
- 服務發現:顧名思義,發現一個服務
- 怎麼發現?就是找IP和埠啊
- 傳統方式怎麼找?在呼叫方里面配置好啊。
- 雲服務和docker等讓每次啟動服務的IP都不一樣怎麼辦?傳統方式就涼拌了,服務少還好,每次改改配置檔案,服務多呢?挨個改?不能夠
- 服務註冊:給每個服務提供一個註冊中心,服務上線的時候都把自己的IP埠資訊註冊到註冊中心,有沒有發現原來每個服務的分散式配置都集中到註冊中心了?
1.2:Eureka的服務註冊與發現過程
- EurekaServer啟動的時候註冊自己的IP埠服務名稱等資訊
- EurekaClient作為java客戶端,在服務啟動後周期性的(預設30s)向EurekaServer傳送心跳
- EurekaServer在一定時間(預設90s)沒有收到某個服務的心跳就會登出該例項,EurekaClient傳送canel命令後也會登出該例項
- EurekaServer之間會相互複製登錄檔資訊
-
EurekaClient會快取登錄檔資訊
2、實戰Eureka
參見程式碼地址:https://github.com/KouLouYiMaSi/springcloud
工具:Intelij Idea
2.1、構建步驟
- 構建一個主maven專案spring-cloud,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.huo</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>eureka-server</module>
<module>eureka-server-1</module>
<module>eureka-server-2</module>
<module>service-hi</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</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.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</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>
</project>
-
構建3個maven module,eureka-server、eureka-server-1、eureka-server-2
在springcloud專案上右鍵,點new,點Module選擇spring initializer
填寫必要資訊後勾選
構建完成開啟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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.huo</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.huo</groupId>
<artifactId>spring-cloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
- 為了直觀,我們不用同一個起多個例項,而是通過複製2個eureka-server來實現直觀的叢集,點選eureka-server專案ctrl+c ctrl+v,改名字eureka-server-1和eureka-server-2
- 修改每個server的yml檔案
----eureka-server,這行不要複製,下面資訊複製到eureka-server的yml,以此類推-----
server:
port: 20001
eureka:
instance:
hostname: server1
client:
# 表示是否註冊自身到eureka伺服器,以供其他服務發現
register-with-eureka: true
# 是否從eureka上獲取註冊資訊
fetch-registry: true
# 表示自己的另外兩個同伴的IP和埠
service-url:
defaultZone: http://server2:20002/eureka/,http://server3:20003/eureka/
----eureka-server-1-----
server:
port: 20002
eureka:
instance:
hostname: server2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://server1:20001/eureka/,http://server3:20003/eureka/
----eureka-server-2-----
server:
port: 20003
eureka:
instance:
hostname: server3
client:
# 表示是否註冊自身到eureka伺服器
register-with-eureka: true
# 是否從eureka上獲取註冊資訊
fetch-registry: true
service-url:
defaultZone: http://server1:20001/eureka/,http://server2:20002/eureka/
- 每個main檔案增加註解就可以了
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- 然後配置一下server1、server2、server3的host,使用switchhost或者直接去etc下面改host檔案
server1 127.0.0.1
server2 127.0.0.1
server3 127.0.0.1
-
構建叢集完成開啟瀏覽器隨便輸入localhost:20001或者localhost:20002或者localhost:20003訪問就可以看到資訊了
2.2、重要配置資訊說明
## eureka : 主要配置屬性在EurekaInstanceConfigBean和EurekaClientConfigBean中
eureka:
instance:
# hostname: 127.0.0.1
# 使用IP註冊
preferIpAddress: true
# 心跳間隔
lease-renewal-interval-in-seconds: 3
# 服務失效時間: 如果多久沒有收到請求,則可以刪除服務
lease-expiration-duration-in-seconds: 7
client:
# 關閉eureka client
# enabled: false
# 註冊自身到eureka伺服器
registerWithEureka: true
# 表示是否從eureka伺服器獲取註冊資訊
fetchRegistry: false
# 客戶端從Eureka Server叢集裡更新Eureka Server資訊的頻率
eureka-service-url-poll-interval-seconds: 60
# 定義從註冊中心獲取註冊服務的資訊
registry-fetch-interval-seconds: 5
# 設定eureka伺服器所在的地址,查詢服務和註冊服務都需要依賴這個地址
serviceUrl:
defaultZone: http://127.0.0.1:10761/eureka/
# 設定eureka伺服器所在的地址,可以同時向多個服務註冊服務
# defaultZone: http://192.168.21.3:10761/eureka/,http://192.168.21.4:10761/eureka/
server:
# renewal-percent-threshold: 0.1
# 關閉自我保護模式
enable-self-preservation: false
# Eureka Server 自我保護係數,當enable-self-preservation=true時,啟作用
# renewal-percent-threshold:
# 設定清理間隔,單位為毫秒,預設為0
eviction-interval-timer-in-ms: 3000
# 設定如果Eureka Server啟動時無法從臨近Eureka Server節點獲取註冊資訊,它多久不對外提供註冊服務
wait-time-in-ms-when-sync-empty: 6000000
# 叢集之間相互更新節點資訊的時間頻率
peer-eureka-nodes-update-interval-ms: 60000
2.3、服務註冊
- 隨便建立一個spring boot專案
- 修改下yml配置
server:
port: 8770
enable-self-preservation: false
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20001/eureka/,http://localhost:20002/eureka/,http://localhost:20003/eureka/
-
開啟localhost:20001,開啟20002和20003發現沒有這個SERVICE-HI
總結:
當使用單節點模式的時候把registerWithEureka設定為false,叢集模式設定為true(預設),叢集模式設定為client可以保證自己被其他服務發現,同時也可以像客戶端一樣從其他server那裡同步登錄檔資訊
相關文章
- 服務註冊與發現【Eureka】- Eureka簡介
- Spring Cloud Eureka 實現服務註冊與發現SpringCloud
- SpringColud Eureka的服務註冊與發現SpringGC
- SpringCloud(3)---Eureka服務註冊與發現SpringGCCloud
- SpringCloud服務的註冊與發現(Eureka)SpringGCCloud
- 【微服務之Eureka服務註冊發現】微服務
- 微服務~Eureka實現的服務註冊與發現及服務之間的呼叫微服務
- Spring Cloud實戰系列(一) - 服務註冊與發現EurekaSpringCloud
- NodeJs服務註冊與服務發現實現NodeJS
- Spring Cloud 系列(一)Eureka 服務註冊與發現SpringCloud
- Spring Cloud(一) 服務的註冊與發現(Eureka)SpringCloud
- Spring Cloud Eureka 實現高可用服務發現註冊中心SpringCloud
- 實現etcd服務註冊與發現
- Spring Cloud 入門教程 – Eureka服務註冊與發現SpringCloud
- 每天學點SpringCloud(二):服務註冊與發現EurekaSpringGCCloud
- Spring Cloud 入門教程 - Eureka服務註冊與發現SpringCloud
- Zookeeper實現服務註冊/發現
- 服務註冊與發現的原理和實現
- 微服務註冊與發現及如何使用Eureka微服務
- SpringCloud學習之路(二)- 服務的註冊與發現EurekaSpringGCCloud
- SpringCloud學習筆記:服務註冊與發現Eureka(2)SpringGCCloud筆記
- Nacos服務註冊與發現
- SpringCloud-微服務的註冊與發現EurekaSpringGCCloud微服務
- 微服務4:服務註冊與發現微服務
- Nacos服務註冊與發現原理
- 微服務5:服務註冊與發現(實踐篇)微服務
- SpringCloudAlibaba - 整合 Nacos 實現服務註冊與發現SpringGCCloud
- SpringCloud-eureka服務註冊發現以及消費流程SpringGCCloud
- SpringCloud核心教程 | 第三篇:服務註冊與發現 Eureka篇SpringGCCloud
- SpringCloud 教程 | 第一篇: 服務的註冊與發現(Eureka)SpringGCCloud
- 聊聊微服務的服務註冊與發現!微服務
- 三. SpringCloud服務註冊與發現SpringGCCloud
- Nacos 服務註冊與發現原理分析
- springcloud之服務註冊與發現SpringGCCloud
- Nacos服務註冊與發現的原理
- 一文搞懂服務註冊發現的原理與實現
- Dubbo+Nacos實現服務註冊和發現
- 用 etcd 實現服務註冊和發現