天天看點

Spring Cloud 服務的注冊與發現(Eureka)

Spring Cloud是一個基于Spring Boot實作的雲應用開發工具,它為基于JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分布式會話和叢集狀态管理等操作提供了一種簡單的開發方式。

Spring Cloud簡介

Spring Cloud包含了多個子項目(針對分布式系統中涉及的多個不同開源産品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等項目。

微服務架構

微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關注于完成一件任務并很好地完成該任務。在所有情況下,每個任務代表着一個小的業務能力。

微服務的概念源于2014年3月Martin Fowler所寫的章“Microservices”

http://martinfowler.com/articles/microservices.html

微服務架構(Microservices Architecture)

微服務架構的核心思想是,一個應用是由多個小的、互相獨立的、微服務組成,這些服務運作在自己的程序中,開發和釋出都沒有依賴。不同服務通過一些輕量級互動機制來通信,例如 RPC、HTTP 等,服務可獨立擴充伸縮,每個服務定義了明确的邊界,不同的服務甚至可以采用不同的程式設計語言來實作,由獨立的團隊來維護。簡單的來說,一個系統的不同子產品轉變成不同的服務!而且服務可以使用不同的技術加以實作!

微服務設計

那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:

職責單一原則(Single Responsibility Principle):把某一個微服務的功能聚焦在特定業務或者有限的範圍内會有助于靈活開發和服務的釋出。

設計階段就需要把業務範圍進行界定。

需要關心微服務的業務範圍,而不是服務的數量和規模盡量小。數量和規模需要依照業務功能而定。

于SOA不同,某個微服務的功能、操作和消息協定盡量簡單。

項目初期把服務的範圍制定相對寬泛,随着深入,進一步重構服務,細分微服務是個很好的做法。

關于微服務架構的取舍

在合适的項目,合适的團隊,采用微服務架構收益會大于成本。

微服務架構有很多吸引人的地方,但在擁抱微服務之前,也需要認清它所帶來的挑戰。

需要避免為了“微服務”而“微服務”。

微服務架構引入政策 – 對傳統企業而言,開始時可以考慮引入部分合适的微服務架構原則對已有系統進行改造或建立微服務應用,逐漸探索及積累微服務架構經驗,而非全盤實施微服務架構。

更多關于微服務架構内容-請參考我的另一篇文章:《什什麼是微服務架構?》

服務治理

由于Spring Cloud為服務治理做了一層抽象接口,是以在Spring Cloud應用中可以支援多種不同的服務治理架構,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實作,并且不影響任何其他的服務注冊、服務發現、服務調用等邏輯。

Spring Cloud Eureka

Spring Cloud Eureka來實作服務治理。

Spring Cloud Eureka是Spring Cloud Netflix項目下的服務治理子產品。而Spring Cloud Netflix項目是Spring Cloud的子項目之一,主要内容是對Netflix公司一系列開源産品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的注解,開發者就可以快速的在應用中配置一下常用子產品并建構龐大的分布式系統。它主要提供的子產品包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),用戶端負載均衡(Ribbon)等。

Eureka Server

提供服務注冊和發現

添加依賴

在項目 spring-cloud-eureka-service pom.xml中引入需要的依賴内容:

org.springframework.cloud    spring-cloud-starter-eureka-server           

開啟服務注冊

通過 @EnableEurekaServer 注解啟動一個服務注冊中心提供給其他應用進行對話,這個注解需要在springboot工程的啟動application類上加

package io.ymq.example.eureka.server;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication

@EnableEurekaServer

public class EurekaServerApplication {

public static void main(String[] args) {
    SpringApplication.run(EurekaServerApplication.class, args);
}           

}

添加配置

在預設設定下,該服務注冊中心也會将自己作為用戶端來嘗試注冊它自己,是以我們需要禁用它的用戶端注冊行為,隻需要在 application.yml配置檔案中增加如下資訊:

registerWithEureka: false

fetchRegistry: false

完整配置

server:

port: 8761

eureka:

instance:

hostname: localhost           

client:

registerWithEureka: false
fetchRegistry: false
serviceUrl:
  defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/           

通路服務

啟動工程後,通路:

http://localhost:8761/

可以看到下面的頁面,其中還沒有發現任何服務。

Service Provider

服務提供方

将自身服務注冊到 Eureka 注冊中心,進而使服務消費方能夠找到

在項目 spring-cloud-eureka-provider pom.xml中引入需要的依賴内容:

org.springframework.cloud
spring-cloud-starter-eureka-server           

在應用主類中通過加上 @EnableEurekaClient,但隻有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka注冊中心伺服器

package io.ymq.example.eureka.provider;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@EnableEurekaClient

@RestController

public class EurekaProviderApplication {

@RequestMapping("/")
public String home() {
    return "Hello world";
}

public static void main(String[] args) {
    SpringApplication.run(EurekaProviderApplication.class, args);
}           

需要配置才能找到Eureka伺服器。例:

client:

serviceUrl:
  defaultZone: http://localhost:8761/eureka/
           

spring:

application:

name: eureka-provider
           

port: 8081

其中 defaultZone是一個魔術字元串後備值,為任何不表示首選項的用戶端提供服務URL(即它是有用的預設值)。 通過 spring.application.name屬性,我們可以指定微服務的名稱後續在調用的時候隻需要使用該名稱就可以進行服務的通路

啟動該工程後,再次通路啟動工程後:

可以如下圖内容,我們定義的服務被成功注冊了。

源碼下載下傳

GitHub:

https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka

碼雲:

https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka

文章來源:

http://www.roncoo.com/article/detail/131693

更多參考内容:

http://www.roncoo.com/article/index?tn=SpringCloud