一、 Spring Cloud Eureka ,咱們先跑起來
一、Spring Cloud 簡介
Spring Cloud 是一個基於Spring Boot 實現的微服務架構開發工具。是一個涉及到服務治理、分散式配置管理、負載均衡、服務容錯、API閘道器、訊息匯流排、服務跟蹤等等為一體的微服務架構體系。我們常常聽說的Spring Cloud全家桶,就是這個意思,他是一個整體的解決方案,最主要的是,用起特別簡單。它主要包含如下元件:
Spring Cloud Netfilx: 核心元件,對多個Netflix OSS 開源元件進行整合
| - Eureka:服務治理,包含服務註冊中心、服務註冊於服務發現
|- Hystrix: 容錯管理
|- Ribbon: 負載均衡
|- Feign : 宣告式服務呼叫元件
|- Zuul: 微服務閘道器
Spring Cloud Bus: 訊息匯流排,用於傳播叢集中的狀態變化或者事件
Spring Cloud Consul: 服務發現與配置管理工具
Spring Cluod Zookeeper: 基於Zookeeper的服務發現與配置管理元件
Spring Cloud Stream : 通過redis、kafka實現的消費服務,可以通過簡單的宣告式模型來發送和接收訊息
。。。。。。
很多很多,這裡就不一一介紹了。
要特別注意:Spring Cloud 並不是微服務,而是Spring 幫我們封裝的微服務整體解決方案,就像以前的Spring,SpringBoot一樣,只是工具。還有別的辦法可以實現微服務。只不過SpringCloud給我們提供的這個方案簡單、好用。
二、 一切從服務的治理說起
我們前面的文章已經說了,所謂的微服務,就是把傳統單體應用架構以及簡單的叢集根據實際業務改為一個一個完整的小服務,以便於獨立開發、獨立維護、獨立部署、獨立擴充套件,各個服務之間通過RestFul請求相互呼叫!
我們的服務剛開始的時候,有可能不會很多,我們可以通過一些靜態配置來完成服務的呼叫,比如配置反向代理,負載均衡。但是,隨著業務發展,系統功能越來越複雜,相應的微服務也在不斷的增加,我們的配置檔案會變得越來越難以維護,而且,隨著業務的增長,我們的叢集規模、服務的位置、服務的命名都有可能發生變化。如果還是通過手工來配置,極容易出錯,搞不好上西線一個新功能,一不小心,在nginx中多寫了空格,多加了個子目,nginx掛了,完了,所有服務都掉不通了...諸如此類。(為了不出問題,我每次更改的時候做了備份,檢查了又檢查,不勝其煩)
因為這個原因,產生了一些服務治理的框架,比如阿里系的Dubbo,噹噹網的DubboX,還有我們今天要講的Eureka等等。
1> Eureka 跑起來
在簡單的介紹了spring-cloud 以及 我們需要服務治理之後,我們先把Eureka跑起來,然後,我們再說服務治理咱們治理了些啥。
第一步:起一個Eureka服務端(服務註冊中心)
作用: 既然是服務治理,我得有個治理中心,這個就是Eureka服務端
起一個Java的Maven工程,引入依賴:
<properties> <!--配置預設編碼為UTF-8--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--定義java版本--> <java.version>1.8</java.version> <!--集中定義依賴版本--> <spring-cloud-version>Dalston.SR5</spring-cloud-version> </properties> <dependencies> <!--引入eureka-server依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>Brussels-SR6</version> <type>pom</type> <scope>import</scope> </dependency> <!--Spring-Cloud元件--> <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> <finalName>joy-framework</finalName> <plugins> <!-- Compile Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.9</version> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build>
起一個SpringBoot主類,在其上加上@EnableEurekaServer註解,標識為一個服務註冊中心以提供給其他應用進行對話。
/** * 服務註冊中心 */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
在預設設定下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,只需要在application.properties
配置檔案中增加如下資訊:
# 設定服務名 spring.application.name=demo-eureka-server #設定服務埠 server.port=9001 # eureka配置 eureka.instance.hostname=localhost #設定不應許將自己註冊為eureka客戶端 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
PS: 這裡,特別講一下
eureka.client.register-with-eureka=false ---- 這一項是設定該服務是否想註冊中心註冊自己,設定為false表示不註冊自己!
eureka.client.register-with-eureka=false ---- 由於註冊中心的職責就是維護服務例項,它並不需要去檢索服務(讓別人主動註冊過來就好了),所以,也設定為false.
這兩個配置。
這個時候,我們啟動工程,然後訪問http://localhost:9001/就可以看到下面的頁面:
至此,我們的服務註冊中心已經跑起來了,是不是很簡單!!!這個時候,控制面板中instances currently registered(目前已註冊例項)列表為空,表示沒有任何例項。
既然有了服務註冊中心,那麼,我們得有服務給他管理。接下來,我們就來建立一個服務:demo-eureka-first-client.
首先,還是起一個SpringBoot 工程,在pom.xml中加入如下資訊:
<dependencies> <!--客戶端,當然要引入eureka依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!--!我們用SpringMvc的restful對外提供服務,所以要引入相關依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!--!省略版本和buil相關內容-->
然後,我們寫一個web介面/hello,用來模擬提供服務:
/** * 驗證web服務 */ @RestController public class HelloController { @Autowired private DiscoveryClient discoveryClient; @GetMapping("/hello") public @ResponseBody String hello() { System.out.println("呼叫hello" + discoveryClient.getServices()); return "Hello ,First Eureka Client"; } }
然後,在應用主類上加上@EnableDiscoveryClient註解,讓其能夠被當做eureka-client被註冊中心發現。
@EnableDiscoveryClient //註解啟動一個服務註冊中心提供給其他應用進行對話 @SpringBootApplication public class EurekaClientFirstApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientFirstApplication.class, args); } }
當然,僅僅能夠被發現是遠遠不夠的,接下來,我們還需要再配置檔案中配置一下相關資訊(主要是告訴應用,我是誰,我在哪裡,我要去哪裡註冊):
#通過spring.application.name屬性,我們可以指定微服務的名稱後續在呼叫的時候只需要使用該名稱就可以進行服務的訪問 spring.application.name=demo-eureka-client-first #為了在本機上測試區分服務提供方和服務註冊中心,使用server.port屬性設定不同的埠。 server.port=9011 #關鍵:定義eureka-server的地址 eureka.client.service-url.defaultZone=http://localhost:9001/eureka/
最後,我們啟動SpringBoot應用。
我們會在控制檯看到如下列印資訊:
這個就表示已經發現了自己,表示註冊成功.
而此時,你再看註冊中心的控制檯,可以發現如下資訊:
我們再回到控制檯,再註冊列表中會看到如下內容:
你點選進去,就會預設呼叫/info介面,這個時候你就會得到如下資訊:
可以看到,我們其實已經進入到了9011這個埠上的服務了,只是預設掉的info介面,這個介面我們沒有提供,所以9011上的這個服務報錯了。當我們改為hello的時候,就會出現如下資訊:
ok,至此,我們一個服務註冊中心和一個服務已經開發完成。當然,我們也可以仿照第一個服務,再起一個demo-eureka-client-second服務。筆者在這裡就不贅述了,都一樣,改個名和埠而已。如果你啟動這個服務,那麼,就可以在註冊中心看到如下內容:
看到了吧,第二個服務也註冊進來了。
這樣,我們就完成了一個簡單的服務治理了。是不是很簡單,就是引入依賴,加上註解而已。我們知道,SpringBoot讓開發變得簡單,而SpringCloud那就是讓我們開發微服務變得簡單!
這裡,我們只起了一個很簡單得註冊中心和兩個簡單得不能再簡單的服務。
當然,SpringCloud的內容遠不止這些,這只是個開始,從這裡,咱們就一起開啟我們的Spring-Cloud 微服務全家桶的學習之旅吧。
PS: 附上該Demo的git原始碼:https://gitee.com/top-djlee/demo-spring-cloud.git