前言
隨著微服務架構的逐漸流行,現在很多互聯網公司在兩三年前架構都已經轉到微服務架構了,互聯網架構也經歷了從傳統ESB總線架構-》SOA-》微服務架構的演進過程,我待過的幾家公司基本也都跟著潮流經歷了這樣的一個過程。除了互聯網公司,之前待過的國有銀行架構最近兩年也都在轉到微服務架構,有些傳統銀行架構師甚至比較“激進”的直接從ESB總線架構轉到微服務,可見除了互聯網公司傳統行業也都在架構轉型,微服務框架目前國內用的比較多的就是阿里的dubbo和今天要介紹的springcloud,springcloud在微服務方面的核心組件都來自于Netflix,在微服務架構中服務注冊和發現是非常核心的一部分,今天主要講解下如何搭建一個eureka的服務注冊中心,并且實現HA高可用,最后還會把之前做的springboot的demo注冊到eureka上,廢話說了那么多,那么下面就開始上干貨啦。
1. eureka服務注冊中心(單機)
首先使用ide工具新建一個maven工程,在pom.xml中引入我們工程需要的庫,主要是springboot相關和eureka相關的庫,具體的依賴庫如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</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>
引入工程后記得在pom.xml文件上點擊右鍵,選擇maven->reimport將涉及到的依賴庫進行引入。
包引入后創建Application入口類,除了和之前springboot工程不一樣的工程就是要在APplication入口類上加上eurekaserver的注解@EnableEurekaSrver,讓系統知道該類為Eureka的Server端。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
最后只要再增加Eureka的配置文件就可以了,這里我們依然使用yaml作為配置文件,具體語法可以google,還是很簡單的,一句話就是用縮進來表示層級關系。
spring:
application:
name: eureka-service-register
server:
port: 8761
eureka:
instance:
hostname: localhost
配置文件不解釋也很好理解,上面的spring層級就相當于一般property文件的spring.application.name=eureka-service-register,表示該服務的名字;port看字面意思就知道是服務端口的意思;hostname表示對應的主機名,一般指向本機,這里配置為localhost。這樣就完成了單機版的服務注冊中心,是不是很簡單,下面我們來啟動下看看效果,啟動工程后,在瀏覽器地址欄輸入http://localhost:8761/。

2.eureka HA多機高可用版
eureka做多機互備非常簡單,這里只需要修改下application.yml就可以了,將配置改為多profile配置,這樣在實際運行部署的時候,同一套jar包只需要在啟動的時候選擇不同的profile就可以了。配置文件代碼如下,這里只列出了最基本的配置項,eureka還有很多豐富的配置項,可以實現各種服務注冊和發現方面的功能。
spring:
application:
name: eureka-service-register
profiles:
active: node1
---
spring:
profiles: node1
server:
port: 8761
eureka:
instance:
hostname: node1
client:
# register-with-eureka: false
# fetch-registry: false
serviceUrl:
#將register1注冊到register2上,實現HA
defaultZone: http://node2:8762/eureka/
---
spring:
profiles: node2
server:
port: 8762
eureka:
instance:
hostname: node2
client:
# register-with-eureka: false
# fetch-registry: false
serviceUrl:
defaultZone: http://node1:8761/eureka/
將eureka工程導出成jar包,直接在命令行運行
java -jar eurekaserver.jar --spring.profiles.active=node1
在其他機器運行
java -jar eurekaserver.jar --spring.profiles.active=node2
ndoe1和node2是在配置文件中配置的profile的名稱,這里自己實驗的時候為了方便可以將hosts文件修改主機名,來實現在一臺機器上模擬多節點,找到本機的hosts文件,然后找到127.0.0.1那行,在后面加上127.0.0.1 node1 node2
可以看到instance里已經有了兩個節點,eureka會實時查看兩個節點的狀態,如果一臺宕機了,另一臺會一直嘗試,當問題節點恢復后會自動重連,并且將最新的服務注冊信息同步到另一臺節點,eureka更牛的地方在于這些服務信息除了在eureka的server端會保存,在服務使用方的client端同樣會分布式保存全量的服務注冊信息,當server端出現極端情況服務使用方連接不上所有的eureka server端節點的時候,服務使用方會使用本地保存的最新的服務提供列表找到服務提供方節點調用接口,只要服務提供方還能繼續提供服務,就能保證整體服務的正常運轉。
3. 服務提供方的服務注冊
可以復用之前寫的springboot restful api的例子,也可以直接在剛才的工程中新建一個module作為服務提供方,我在demo的代碼中為了方便就直接新建了一個module作為服務提供方,其中主要有以下幾點要修改下,其他的代碼都和之前介紹的springboot的實例代碼一樣。
1)在啟動類增加@EnableEurekaClient注解,表示要注冊到eureka服務器上,既然增加了eurekaClient的注解,那么肯定要設置哪個作為eureka的server端,下面來看下作為服務提供方的application.yml配置。
spring:
application:
name: service-provider
server:
port: 8084
eureka:
instance:
prefer-ip-address: true
client:
serviceUrl:
defaultZone: http://node1:8761/eureka/,http://node2:8762/eureka/
這里主要要說明的就是最后一行定義的eureka服務端地址,可以發現這兩個地址就是剛才我們設置的eureka server集群的兩個地址,如果又3臺就在后面再增加,理論上來說只寫一臺地址也是可以的,會自動同步其他幾臺的地址,但為了保險期間還是都配置上比較好,防止配置的這臺出問題沒有同步其他幾臺節點的信息。
小結
本文介紹了eureka的server端和client端的配置,并且介紹了server端和client如何配置和使用服務注冊集群來實現高可用,是不是很簡單,趕緊自己動手來實現一個吧,本文講到的所有代碼都傳到了git上,大家可以到git上下載代碼。