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」martinfowler.com/articl

微服務架構(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中引入需要的依賴內容:

<dependency>nt<groupId>org.springframework.cloud</groupId>nt<artifactId>spring-cloud-starter-eureka-server</artifactId>n</dependency>n

開啟服務註冊

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

package io.ymq.example.eureka.server;nnimport org.springframework.boot.SpringApplication;nimport org.springframework.boot.autoconfigure.SpringBootApplication;nimport org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;nn@SpringBootApplicationn@EnableEurekaServernpublic class EurekaServerApplication {nntpublic static void main(String[] args) {nttSpringApplication.run(EurekaServerApplication.class, args);nt}n}n

添加配置

在默認設置下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,只需要在application.yml配置文件中增加如下信息:

registerWithEureka: falsenfetchRegistry: falsen

完整配置

server:n port: 8761nneureka:n instance:n hostname: localhostn client:n registerWithEureka: falsen fetchRegistry: falsen serviceUrl:n defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/n

訪問服務

啟動工程後,訪問:localhost:8761/

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

Service Provider

  • 服務提供方
  • 將自身服務註冊到 Eureka 註冊中心,從而使服務消費方能夠找到

添加依賴

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

<dependency>nt<groupId>org.springframework.cloud</groupId>nt<artifactId>spring-cloud-starter-eureka-server</artifactId>n</dependency>n

開啟服務註冊

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

package io.ymq.example.eureka.provider;nnimport org.springframework.boot.SpringApplication;nimport org.springframework.boot.autoconfigure.SpringBootApplication;nimport org.springframework.cloud.netflix.eureka.EnableEurekaClient;nimport org.springframework.web.bind.annotation.RequestMapping;nimport org.springframework.web.bind.annotation.RestController;nn@SpringBootApplicationn@EnableEurekaClientn@RestControllernpublic class EurekaProviderApplication {nn @RequestMapping("/")n public String home() {n return "Hello world";n }nntpublic static void main(String[] args) {nttSpringApplication.run(EurekaProviderApplication.class, args);nt}n}n

添加配置

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

完整配置

eureka:n client:n serviceUrl:n defaultZone: http://localhost:8761/eureka/nnspring:n application:n name: eureka-providernnserver:n port: 8081n

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

訪問服務

啟動該工程後,再次訪問啟動工程後:localhost:8761/

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

源碼下載

GitHub:github.com/souyunku/spr

碼云:gitee.com/souyunku/spri

Contact

  • 作者:鵬磊
  • 出處:http://www.ymq.io
  • Email:admin@souyunku.com
  • 版權歸作者所有,轉載請註明出處
  • Wechat:關注公眾號,搜雲庫,專註於開發技術的研究與知識分享

weixin.qq.com/r/0UwmPsn (二維碼自動識別)


推薦閱讀:

從Kubernetes到Cloud Native——雲原生應用之路
矽谷之路6:Microservices 是自由貿易
重新理解微服務
SOA和微服務架構的區別?

TAG:SpringCloud | 微服务架构 |