服務註冊與發現對於微服務系統來說非常重要。有了服務發現與註冊,你就不需要整天改服務調用的配置文件了,你只需要使用服務的標識符,就可以訪問到服務。
本文屬於《7天學會spring cloud系列》之四,關注服務註冊與發現,本文涉及到的項目:
- 開源項目:http://git.oschina.net/zhou666/spring-cloud-7simple
- cloud-eureka-server:eureka註冊服務器
- cloud-simple-service:一個使用mybatis的數據庫應用,服務端
服務註冊管理器原理如下圖所示:
所有的服務端及訪問服務的客戶端都需要連接到註冊管理器(eureka服務器)。服務在啓動時會自動註冊自己到eureka服務器,每一個服務都有一個名字,這個名字會被註冊到eureka服務器。使用服務的一方只需要使用該名字加上方法名就可以調用到服務。
Spring cloud的服務註冊及發現,不僅僅只有eureka,還支持Zookeeper和Consul。默認情況下是eureka,spring 封裝了eureka,使其非常簡單易用,只需要比傳統應用增加一行代碼就可以使用了,這一行代碼就是一個註解。我們按以下步驟實現服務註冊和發現功能。
1)首選需要建立eureka服務器
創建spring cloud eureka服務器和創建之前那個配置文件服務器類似,你只需要創建一個空的maven工程,並引入spring boot的相關starter即可,然後創建一個近乎空的執行類,工程如下圖:
在EurekaServer類中我們加入如下代碼:
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
SpringApplication.run(EurekaServer.class, args);
}
}
可以看到只需要使用 @EnableEurekaServer註解就可以讓應用變爲Eureka服務器,這是因爲spring boot封裝了Eureka Server,讓你可以嵌入到應用中直接使用。至於真正的EurekaServer是Netflix公司的開源項目,也是可以單獨下載使用的。
在application.properties配置文件中使用如下配置:
server.port=8761
eureka.instance.hostname=localhost
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
其中server.port配置eureka服務器端口號。Eureka的配置屬性都在開源項目spring-cloud-netflix-master中定義(spring boot連文檔都沒有,只能看源碼了),在這個項目中有兩個類EurekaInstanceConfigBean 和EurekaClientConfigBean, 分別含有eureka.instance和eureka.client相關屬性的解釋和定義。從中可以看到,registerWithEureka表示是 否註冊自身到eureka服務器,因爲當前這個應用就是eureka服務器,沒必要註冊自身,所以這裏是false。fetchRegistry表示是否 從eureka服務器獲取註冊信息,同上,這裏不需要。defaultZone就比較重要了,是設置eureka服務器所在的地址,查詢服務和註冊服務都 需要依賴這個地址。
做完這些後當然,還要改一下pom文件,增加eureka-server的starter即可:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
如此eureka服務器就完成了,在命令行啓動就可以了。
2)讓服務使用eureka服務器
讓服務使用eureka服務器,只需 添加@EnableDiscoveryClient註解就可以了。回到我們在上篇文章中實現的cloud-simple-service微服務應用。在 main方法所在的Application類中,添加@EnableDiscoveryClient註解。然後在配置文件中添加:
eureka.client.serviceUrl.defaultZone=http\://localhost\:8761/eureka/
spring.application.name=cloud-simple-service
其中defaultZone是指定 eureka服務器的地址,無論是註冊還是發現服務都需要這個地址。application.name是指定進行服務註冊時該服務的名稱。這個名稱就是後 面調用服務時的服務標識符(這是服務發現的功能,我們在後面章節具體介紹)。當然,pom文件也需要增加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
如此以來該服務啓動後會自動註冊到eureka服務器。如果在該服務中還需要調用別的服務,那麼直接使用那個服務的服務名稱加方法名構成的url即可,具體我們將在下章結合ui端的應用具體介紹。