微服務之服務治理:Spring Cloud Eureka
1. 什麼是服務治理
微服務架構中,系統由許多實現了不同功能的微服務構成,如何去管理這些微服務是個很重要的問題。服務治理就是要解決這一基本問題,實現微服務的註冊和發現。常見的服務治理框架有阿里的Dubbo、Spring Cloud Netflix下的Eureka等等。
2. 服務註冊與服務發現
服務治理要實現服務註冊,就需要一個記錄所有服務資訊的註冊中心,每個服務單元向註冊中心登記自己提供的服務,包括服務的主機與埠號、服務版本號、通訊協議等一些附加資訊。註冊中心按照服務名分類組織服務清單,同時還需要以心跳檢測的方式去監測清單中的服務是否可用,若不可用需要從服務清單中剔除,以達到排除故障服務的效果。
在服務治理框架下,服務間的呼叫不再通過指定具體的例項地址來實現,而是通過服務名發起請求呼叫實現。服務呼叫方通過服務名從服務註冊中心的服務清單中獲取服務例項的列表清單,通過指定的負載均衡策略取出一個服務例項位置來進行服務呼叫。
3. Netflix Eureka實現服務治理
Spirng Cloud Eureka使用Netflix Eureka來實現服務註冊與發現。它既包含了服務端元件,也包含了客戶端元件,並且服務端與客戶端均採用java編寫,所以Eureka主要適用於通過java實現的分散式系統,或是JVM相容語言構建的系統。
3.1 Eureka服務端(服務註冊中心)
新建一個Spring Boot專案,引入以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId> spring-cloud-starter-netflix-eureka-server</artifactId>
<version>RELEASE</version>
</dependency>
在啟動類添加註解@EnableEurekaServer
:
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication. class, args);
}
}
配置appliction.properties
如下:
# 指定名稱
spring.application.name=eureka-server
# 服務註冊中心埠號
server.port=1001
# 服務註冊中心例項的主機名
eureka.instance.hostname=localhost
# 是否向服務註冊中心註冊自己(由於是註冊中心,所以無需註冊自己)
eureka.client.register-with-eureka=false
# 是否檢索服務
eureka.client.fetch-registry=false
啟動eureka-server應用,訪問 http://localhost:1001 即可看到Eureka服務註冊中心的頁面。
3.2 Eureka客戶端(服務提供者)
新建一個Spring Boot專案,引入以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>RELEASE</version>
</dependency>
在啟動類添加註解@EnableEurekaClient
:
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
配置appliction.properties
如下:
spring.application.name=eureka-client
server.port=2001
# 指定服務註冊中心的位置
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
作為提供服務的微服務,需要提供一些實現了特定功能的介面:
@RestController
public class DcController {
@Resource
private DiscoveryClient discoveryClient;
@GetMapping("/dc")
public String dc(){
String services = "Services: "+discoveryClient.getServices();
System.out.println(services);
return services;
}
}
再啟動eureka-client,可以發現註冊中心就註冊了一個服務。
訪問 http://localhost:2001/dc 可以發現成功呼叫了eureka-client提供的介面,也就是說,服務消費者可以RESTful方式呼叫服務介面。
有了這些註冊的服務,服務消費者就可以從服務註冊中心找到需要的服務,並呼叫相應介面以執行特定功能。例如,Spring Cloud Feign和Spring Cloud Ribbon就提供了負載均衡的消費服務。