eureka是什么?
eureka是Netfix的子模塊之一也是核心模塊,eureka有2個組件,一個eurekaServer(獨立的一個微服務),這個服務主要是用來定位服務以實現中間層服務器的負載平衡和故障轉移。另外一個是是eurekaClient(我們自己的微服務),是用來與server進行交互的,使服務之間的交互變的非常簡單,只需要通過服務標識符即可在server中拿到想要的微服務。
角色關系圖:

如何使用?
在spring-cloud項目里面加入依賴:
eureka客戶端(需要注冊的服務pom中添加):
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
eureka服務端(eureka獨立服務pom中添加):
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
eureka服務端項目里面加入以下配置:
server:
port: 3000
eureka:
server:
enable-self-preservation: false #關閉自我保護機制
eviction-interval-timer-in-ms: 4000 #設置清理間隔(單位:毫秒 默認是60*1000)
instance:
hostname: localhost
client:
registerWithEureka: false #不把自己作為一個客戶端注冊到自己身上
fetchRegistry: false #不需要從服務端獲取注冊信息(因為在這里自己就是服務端,而且已經禁用自己注冊了)
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
然后在spring-boot啟動項目上 加入注解:@EnableEurekaServer 就可以啟動項目了
@EnableEurekaServer @SpringBootApplication public class AppEureka { public static void main(String[] args) { SpringApplication.run(AppEureka.class); } }
啟動即可看到注冊中心頁面。
eureka客戶端配置:
server:
port: 6000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:3000/eureka/ #eureka服務端提供的注冊地址 參考服務端配置的這個路徑
instance:
instance-id: power-1 #此實例注冊到eureka服務端的唯一的實例ID
prefer-ip-address: true #是否顯示IP地址
leaseRenewalIntervalInSeconds: 10 #eureka客戶需要多長時間發送心跳給eureka服務器,表明它仍然活着,默認為30 秒 (與下面配置的單位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服務器在接收到實例的最后一次發出的心跳后,需要等待多久才可以將此實例刪除,默認為90秒
spring:
application:
name: server-power #此實例注冊到eureka服務端的name
接下來就可以在微服務項目的啟動類中添加@EnableEurekaClient即可啟動,正常即可看到如下頁面

這里我們能看見 名字叫server-power的(圖中將其大寫了) id為 power-1的服務 注冊到我們的Eureka上面來了至此,一個簡單的eureka已經搭建好了。
eureka集群
eureka集群原理
服務啟動后向Eureka注冊,Eureka Server會將注冊信息向其他Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務注冊中心獲取服務提供者地址,然后會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。
eureka集群配置
現在我們配置3個Eureka Server,端口分別是 3000,30001,30002

3個Eureka Server之間的關系分別是相互注冊的關系,如下圖

可能看着有點抽象,我們來看看具體配置
server:
port: 3000
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 4000
instance:
hostname: eureka3000.com
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
這里需要注意的是這個配置
defaultZone: http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
可以這樣理解:
eureka3000 配置 eureka3001和eureka3002
eureka3001 配置 eureka3000和eureka3002
eureka3002 配置 eureka3000和eureka3001
這里 方便理解集群 我們做了一個域名的映射(條件不是特別支持我使用三台筆記本來測試。。。) 至於域名怎么映射的話 這里簡單提一下吧 修改你的hosts文件(win10的目錄在C:\Windows\System32\drivers\etc 其他系統的話自行百度一下把)附上我的hosts文件:
127.0.0.1 eureka3000.com
127.0.0.1 eureka3001.com
127.0.0.1 eureka3002.com
我們回到主題, 我們發現 集群配置與單體不同的點在於 原來是把服務注冊到自己身上,而現在是注冊到其它服務身上
至於為什么不注冊自己了呢?,回到最上面我們說過,eureka的server會把自己的注冊信息與其他的server同步,所以這里我們不需要注冊到自己身上,因為另外兩台服務器會配置本台服務器。(這里可能有點繞,可以參考一下剛剛那張集群環境的圖,或者自己動手配置一下,另外兩台eureka的配置與這個是差不多的,就不發出來了,只要注意是注冊到其他的服務上面就好了)
當三台eureka配置好之后,全部啟動一下就可以看見效果了:

服務端配置好集群后接下來需要配置客戶端:
客戶端的配置就簡單了,只需要將之前單體的eureka server配置中的注冊地址配置三個地址即可。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
改為:defaultZone: http://localhost:3000/eureka/,http://eureka3001.com:3001/eureka,http://eureka3002.com:3002/eureka
這里需要注意的是這里配置三個地址並不代表當前客戶端需要在Eureka Server注冊三次,這里只需要注冊一次就可以了,但是為什么要寫三個地址呢。因為這樣就可以做到高可用的配置:打個比方有3台服務器。但是突然宕機了一台, 但是其他2台還健在,依然可以注冊我們的服務,換句話來講, 只要有一台服務還建在,那么就可以注冊服務。
