微服務SpringCloud之服務註冊與發現

社會主義接班人發表於2019-06-30

   在找.net core 微服務框架時發現了Steeltoe開源專案,它可以基於Spring Cloud實現.net core和.net  Framework的微服務。正好之前也有學習過SpringBoot,而Spring Cloud是基於SpringBoot的,有了SpringBoot基礎上手入門SpringCloud應該也不難,正好我的第一本書<<Spring快速入門>>即將上架,感興趣的朋友可以多多支援。本篇主要學習服務註冊與發現元件Eureka。

   在學習之前首先聊一聊為什麼會有微服務,它的優缺點是什麼。

   在微服務之前主要是單體應用,單體應用常見的就是一個war檔案包含所有功能的應用程式包,每次迭代更新哪怕是更新一行程式碼都需要重新打包部署,同樣每次迭代可能都要進行測試,模組與模組之間耦合度也比較高,導致可能需要對整個war包進行的測試,如果出現一個bug導致記憶體溢位,死迴圈,可能導致整個應用崩潰。二八原則在日常生活中普遍存在,在軟體領域也一樣,我們平時瀏覽網頁一般讀的多,寫的少,例如逛部落格園,我們可能瀏覽的比較多,提交資料的頻率比較少,在單體應用中如果要增加瀏覽介面的部署,同樣也會將提交資料的介面部署上去會造成資源浪費,單體應用往往使用統一的技術平臺或方案解決所有的問題,開發語言和框架固定之後後續想引入新框架和技術也比較困難。

   在單體應用中主要是面對單個應用的程式設計,而在微服務中主要是面對單個功能點的程式設計,將提供的功能點對外發布,這樣其他地方可以不用關心具體用什麼語言什麼技術實現的,直接呼叫即可。而且每個功能點可以獨立部署,是解耦的。假如某個介面呼叫增多,可以單獨部署該介面應用,擴充套件性比較好。某個節點出現故障可以迅速讓其他節點頂上,不至於整個應用不可用,容錯性好,某個服務訪問超出伺服器承載時也可以進行限流,後續的CI、CD容器化也比較方便。同樣有優點也有缺點,微服務會導致對外提供的介面增多,部署數量增多,服務治理帶來新的挑戰,A服務會呼叫B服務,B服務會呼叫C服務,如果A服務報錯了,那是A服務導致的還是B、C服務導致的呢,而且對外提供服務的節點可能會有很多,那是哪個服務的哪個節點導致的呢?所以還需要微服務的鏈路追蹤與排查。前面也提到微服務方便擴充套件,那什麼情況下需要擴充套件,哪些服務節點需要擴充套件,這需要用資料說話,那就需要對服務進行監控,而且監控的引數指標和維度也是不一樣的。

  前面算是導語,下面切回正題,來學習服務註冊與發現元件Eureka。每個站點都對外提供某些服務,有點類似家裡趕集一樣,有的賣家說賣衣服的,提供賣衣服的介面,有的賣家是賣拖拉機的,提供賣拖拉機的介面,每個賣家都是獨立分散的,假如每個賣家都不在一個集市上,那買家可能需要先找到每個賣家住在什麼地方,哪個村的叫什麼名字,一般逛一家可能還沒選到合適的,還要多逛幾家,這樣買家就要來回跑,那有了集市之後就不一樣了,每個賣家都在集市上提供不同的服務,買家只要到固定的集市上找需要的服務即可,就和在沒出現淘寶之前買東西需要到實體商店,有了淘寶之後只要輸入淘寶網址就能找到不同商家提供的不同服務。Eureka就是有點類似淘寶的功能,它為服務提供者(賣家)提供了一個集中的平臺,只要註冊一下說明提供什麼服務,服務消費者(買家)不用關心服務提供者在什麼地方,直接呼叫就好了,是一箇中心化的過程。

一、建立Eureka Server

1.引入依賴

   SpringCloud使用Eureka也比較容易,建立SpringBoot專案時選中Eureka Server即可,它會在pom.xml中自動引入下面兩個依賴,也可以自己新增。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
View Code

2、啟動程式碼中新增@EnableEurekaServer註解

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

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

}
View Code

3、配置檔案

在預設設定下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,在application.properties新增以下配置:

spring.application.name=spring-cloud-eureka
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
server.port=8088

eureka.client.register-with-eureka :表示是否將自己註冊到Eureka Server,預設為true。
eureka.client.fetch-registry :表示是否從Eureka Server獲取註冊資訊,預設為true。
eureka.client.serviceUrl.defaultZone :設定與Eureka Server互動的地址,查詢服務和註冊服務都需要依賴這個地址。預設是http://localhost:8761/eureka ;多個地址可使用 , 分隔。

4.啟動應用

在瀏覽器輸入http://localhost:8088/,即可看到下面頁面,暫時還未有註冊的例項。

二、Eureka叢集

這裡使用兩個節點來構建Eureka註冊中心,首先新增兩個配置檔案application-peer1.properties、application-peer2.properties.分別啟動了8000、8001埠。同時

eureka.client.serviceUrl.defaultZone為對方的地址。

application-peer1.properties:

spring.application.name=spring-cloud-eureka
server.port=8000
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/

application-peer2.properties:

spring.application.name=spring-cloud-eureka
server.port=8001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/

application.properties:

spring.application.name=spring-cloud-eureka
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

將Eureka Server專案打包,mvn clean package,會生成EurekaServer-0.0.1-SNAPSHOT.jar包。

在EurekaServer-0.0.1-SNAPSHOT.jar的目錄下,分別執行下面兩句命令,啟動兩個EurekaServer例項。

java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

 

然後在瀏覽器中輸入http://localhost:8001/http://localhost:8000/就會發現你中有我我中有你。這裡也都是參考純潔的微笑大神的:http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html。在裡面介紹說註冊中心會出現在available-replicas中,但我這邊的測試並未在available-replicas中,看它的評論裡也有一些也是未出現在available-replicas中,這個地方可能還要再留意一下。

三、建立Eureka Client

1、引入依賴

這裡先建立個服務提供者,也就是生產者。在建立時選中Eureka Client,專案會自動引入下面的spring-cloud-starter-netflix-eureka-client依賴。由於要提供服務,所以這裡又引入了spring-boot-starter-web。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

2、啟動程式碼中新增@EnableDiscoveryClient註解

與上面新增@EnableEurekaServer類似,這裡新增@EnableDiscoveryClient註解。

3.配置檔案

這裡提供配置了eureka互動地址,這裡為兩個,將服務註冊到eureka兩個例項中。

spring.application.name=spring-cloud-producer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/,http://localhost:8001/eureka/

4.增加服務HelloController

package com.example.demo;

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

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String index(@RequestParam String name) {
        return "hello "+name+",this is first messge";
    }
}
View Code

5.啟動應用就可在http://localhost:8000/http://localhost:8001/中看到最近註冊到Eureka的例項spring-cloud-producer。

 

 四、小結

本篇主要了解了下什麼是Eureka,它的作用,以及如何使用。主要學習Eureka服務端的配置和雙節點配置,將Eureka client註冊到Eureka server中,後續就是要學習如何呼叫生產者提供的服務了。

最後再推薦下我的新書<<spring 快速入門>>,個人認為對與Spring初學者來說還是值得一讀的,雖然之前也沒有過Java的工作經驗,寫這本書的過程也是我二次複習鞏固Spring的過程,我也是以初學者的角度來完成這本書的。本書目錄在前面的部落格中,可以點選檢視

 

相關文章