Eureka是Netflix開發的服務發現框架,本身是一個基於REST的服務,主要用於定位運行在AWS域中的中間層服務,以達到負載均衡和中間層服務故障轉移的目的。SpringCloud將它集成在其子項目spring-cloud-netflix中,以實現SpringCloud的服務發現功能。 Eureka包含兩個組件:Eureka Server和Eureka Client。Eureka Server 負責統一管理服務信息;Eureka Client負責和Eureka Server通信維護服務信息。
說明
eureka的單機版和集群版的區別只是配置不一樣而已,因此這里將公共的部分提取到前面;下面示例使用的Spring-Cloud的版本是Hoxton.SR8,Spring-Boot的版本是2.3.4.RELEASE。示例項目的源代碼
添加如下maven依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
編寫啟動類:
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
application.yml配置示例如下
Eureka單機版配置
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
# 是否將自己注冊到Eureka Server 默認為true
registerWithEureka: false
# 是否從Eureka Server查詢注冊信息
fetchRegistry: false
# 配置eureka服務的地址
serviceUrl:
defaultZone: http://127.0.0.1:${server.port}/eureka/
server:
# 自我保護機制,開發環境建議關閉
enable-self-preservation: false
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
之后直接訪問http://127.0.0.1:8761 即可進入eureka的界面。
Eureka集群版配置
server:
port: 8761
eureka:
instance:
# 這里也可以使用域名
prefer-ip-address: true
instance-id: 127.0.0.1:8761
client:
# 是否將自己注冊到Eureka Server 默認為true
registerWithEureka: false
# 是否從Eureka Server查詢注冊信息
fetchRegistry: true
# 配置eureka服務注冊地址;多個使用英文逗號分開
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
關於配置eureka服務注冊地址是否可以配置它自己的問題?
答案是可以的,因為eureka server構建的集群節點信息PeerEurekaNodes里面,在定時更新注冊中心節點信息的時候,會自動檢查注冊地址中是否有它自己的注冊地址,有的話會將其去掉的;所以可以配置它自己的注冊地址。
接上面的問題,為什么eureka要將注冊地址中自己的注冊地址去掉:查看eureka client的注冊過程,eureka server會在更新自己本地注冊表后,將這個注冊信息依次推送到集群中其他的eureka server上去。因此要把自己的地址過濾掉(自己發送給自己干啥)
fetchRegistry:應該配置為true還是false呢?因為我們知道eureka client每次只會向其中一台機器發送注冊信息,心跳也是只會向一台機器發送;而注冊中心集群間的注冊表同步是在收到客戶端發送的信息后,在自己處理完成后,再將這個信息轉發給集群中其他節點(如果失敗會不停的重試);如果fetchRegistry配置為true,那么在eureka server啟動的時候會主動的從任意一個其他的節點拉取注冊信息同步到自己本地。如果fetchRegistry配置為false則不會進行此操作。但是需要說明的是如果fetchRegistry配置為true時會啟動eureka client中大量的線程資源,而這些資源消耗就為了剛剛啟動的一次注冊表同步;這視乎是不太划算的,因為基於eureka server節點間的注冊信息同步機制同樣是可以實現注冊表同步的,只是有些延遲(時間較短,完全可以接受)。因此如果不是非常特別的要求,建議將fetchRegistry配置為false,減少系統資源的消耗。
Eureka 客戶端端的使用
Eureka服務端無論是單機版部署還是集群部署,客戶端的配置都是一樣的。添加maven依賴如下:
<!--eureka注冊中心客戶端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring Cloud LoadBalancer is currently working with the default cache. You can switch to using Caffeine cache, by adding it to the classpath.-->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
application.yml配置如下:
# 注冊中心eureka配置
eureka:
client:
serviceUrl:
# 多個節點使用英文逗號分開
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/

