一、Spring Cloud簡介
Spring Cloud爲開發人員提供了快速構建分佈式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線)。分佈式系統的協調導致了樣板模式, 使用Spring Cloud開發人員可以快速地支持實現這些模式的服務和應用程序。他們將在任何分佈式環境中運行良好,包括開發人員自己的筆記本電腦,裸機數據中心,以及Cloud Foundry等託管平臺。
https://www.springcloud.cc/spring-cloud-dalston.html
Spring Cloud需要基於Spring Boot項目來構建,而Spring Boot是在spring上封裝了大量的註解和自動配置,增加了許多優秀的中間件的一個優秀的框架,如果不瞭解Spring Boot的使用,建議先去了解Spring Boot。
二、註冊中心的介紹
在介紹註冊中心之前先說一下單應用的架構。在單應用架構中,我們把所有的業務功能都放在了同一個項目中,如果有其中一個接口需要改動,那麼就需要重新部署整個項目。當請求量大的時候,往往會在服務的前端增加一個負載均衡的組件,比如Nginx。這樣,請求會先到達Nginx,再由Nginx把請求按照一定的策略分發給不同的節點(這裏的一個節點就是一個tomcat服務),然後再處理返回結果。
在Spring Cloud這樣的分佈式架構中,我們會把服務進行拆分。比如說一個電商系統,我們可以粗略地把系統拆分爲商品詳情服務、訂單服務、會員服務等等。這樣,每個系統會有自己的數據庫,只做自己的事。這時假如說一個用戶想看一下訂單詳情,按道理說他需要請求訂單系統的相關接口,但是訂單詳情應該顯示這個訂單的商品簡略信息,比如商品名、商品縮略圖等,但商品相關的信息應該是放在商品服務中的,這時候就需要一個地方,讓商品服務把自己提供的服務放進去,讓訂單服務去調用,這個地方就是註冊中心。
可以有多個服務提供者把自己提供的服務註冊到註冊中心,當服務消費者需要調用服務時,就不用去找服務提供者,而是直接去找註冊中心就行了。另外,一個服務節點,既可以是服務提供者,也可以是服務消費者。
總之,註冊中心就相當於一個集市,服務提供者相當於小商小販,他們把自己的東西(服務)放在集市(註冊中心)賣,而服務消費相當於顧客,他們在集市(註冊中心)挑選自己需要的東西(服務)買。
Spring Cloud支持的註冊中心可以有多種,比如Eureka、Zookeeper、Consul等等。在這裏我們使用Eureka作爲我們的註冊中心。
三、準備工作
我們使用IDEA作爲開發工具,因爲Spring Cloud是需要多個微服務協同工作的,在IDEA中,我們需要一個主項目(相當於Eclipse的一個Workspace),然後在主項目中每一個module(相當於Eclipse中的一個project)都是其中的一個服務。
3.1、創建一個Empty Project
然後填寫好名稱,完成後會彈出提供你創建module的對話框,先關閉。
3.2 創建Eureka模塊作爲服務註冊中心
選擇File->New->Module...,然後選擇Spring Initializr。
然後填寫好module的名稱,接下來再選擇相關的依賴——選擇Spring Cloud Discovery下的Eureka Server依賴,Spring Boot的版本我們選擇2.1.10,最後根據導向完成創建工作。創建好的module的pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springcloud</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果你使用的是沒有Spring Initializr的IDEA Community版本,你也可以先創建一個maven的module,再到<https://start.spring.io/>選擇Eureka,然後點擊Explore-Ctrl + Space按鈕,把相關的依賴複製到pom文件中。
3.3、配置eureka的參數
在application.properties文件中(如果習慣使用yml可以自行做調整)添加以下的配置
server.port=8761
spring.application.name=eureka
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
事實上,eureka會把自身作爲一個服務註冊到自身當中,而eureka.client.register-with-eureka和eureka.client.fetch-registry這兩個屬性的值設置爲false表明不需要把自己註冊進去。
3.4、開啓服務註冊功能
在啓動的主類上加上@EnableEurekaServer開啓eureka服務功能
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
到此註冊中心微服務就完成了,可以啓動了。
3.5、服務註冊中心後臺
啓動成功後,在瀏覽器訪問http://localhost:8761/,就可以看到Eureka的管理後臺了,在這裏我們可以看到向註冊中心所註冊的服務,目前我們還沒有任何的服務註冊,所以顯示No instances available。
四、註冊中心集羣
我們的服務都需要註冊到註冊中心,如果只有一個節點,萬一註冊中心宕機了,整個系統就癱瘓了,註冊中心作爲服務的中樞,我們不能只用一個節點。如果有使用ZooKeeper的經驗的人一定知道集羣這個概念,這就是爲了系統的高可用性而把數據切割成幾個部分放到不同的節點中,就算有其中一個甚至幾個節點出了問題,整個系統還是不受影響的。這裏也介紹一下Eureka集羣。
4.1、修改hosts文件
爲了可以在windows上搭建集羣,首先需要修改hosts文件,在hosts文件添加以下內容
127.0.0.1 eureka-1
127.0.0.1 eureka-2
127.0.0.1 eureka-3
4.2、修改配置文件
然後在resources目錄下創建application-eureka1.properties、application-eureka2.properties、application-eureka3.properties
其中application-eureka1.properties的配置如下:
server.port=8761
spring.application.name=eureka
eureka.instance.hostname=eureka-1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://eureka-2:8762/eureka/,http://eureka-3:8763/eureka/
節點1的端口是8761,主機名是eureka-1,那麼defaultZone的值就配置另外兩個節點的地址,地址用逗號分開;然後節點2的端口是8762,然後配置節點1和3的地址,以此類推。值得說明的是register-with-eureka和fetch-registry的值需要設置爲true或者不配置(默認是true),因爲搭建集羣的時候需要把自己作爲一個服務註冊到註冊中心,這樣另外兩個eureka服務才能發現它。
4.3、啓動服務
點擊啓動配置下拉菜單,選擇創建三個Spring Boot的啓動配置,填寫好名稱、啓動類和所用的配置文件:
填寫好配置的名稱(EurekaApplication-1)、選擇啓動類作爲Main class,Active profile其實就是使用的配置文件,只需要寫application-後面的那一段就行了。
然後如法炮製添加節點2和3。
到此集羣方式的Eureka註冊中心就完成了,如果上一步的單節點的應用還在運行的話先停止,不然會引起端口衝突。依次啓動這三個節點,當啓動第一個或者前兩個時會報異常,這是因爲我們的eureka集羣是三個節點的,當第一個節點8761啓動後,會去找8762和8763,但是此時另外兩個節點還沒啓動,所以出現異常信息,這是正常的,當三個都啓動成功後在瀏覽器訪問http://eureka-1:8761/,也可以訪問http://eureka-2:8762/或http://eureka-3:8763/,此時在eureka後臺可以看到另外兩個節點
圖片下方Application這一項是根據配置文件中spring.application.name屬性的值來顯示的,就是應用的名稱,因爲我們把三個節點的名稱都寫成了一樣,這裏就會合併在一起顯示,然後在Status中以各自的端口號區分,然後應用名不相同,就會分別顯示。(但是同樣的服務的服務名要寫成一致,這是因爲後面我們使用服務時都是根據service-id也就是這個name屬性,下圖這個做法不建議)
另外我們需要注意一下後臺下面的General Info的信息,如果其它兩個節點可用,就會顯示在available-replicas中,否則就會顯示在unavailable-replicas中,這一點可以幫助我們檢查註冊中心的節點的健康狀況。
五、總結
到此,eureka註冊中心的使用就介紹完畢,下一篇介紹服務註冊。
源碼已經上傳到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter1
如果你想了解更多java相關的知識,可以訪問我的個人博客:http://notebook.techhuman.cn/
也歡迎你關注我的公衆號獲得文章推送