微服務入門 spring cloud環境搭建

相關閱讀:
SpringBoot2.X快速構建和配置

1. 什麼是微服務?

微服務就是把原本臃腫的一個項目的所有模塊拆分開來並做到互相沒有關聯,甚至可以不使用同一個數據庫。 比如:項目裏面有User模塊和Power模塊,但是User模塊和Power模塊並沒有直接關係,僅僅只是一些數據需要交互,那麼就可以吧這2個模塊單獨分開來,當user需要調用power的時候,power是一個服務方,但是power需要調用user的時候,user又是服務方了, 所以,他們並不在乎誰是服務方誰是調用方,他們都是2個獨立的服務,這時候,微服務的概念就出來了。

2.經典問題:微服務和分佈式的區別

談到區別,我們先簡單說一下分佈式是什麼,所謂分佈式,就是將偌大的系統劃分爲多個模塊(這一點和微服務很像)部署到不同機器上(因爲一臺機器可能承受不了這麼大的壓力或者說一臺非常好的服務器的成本可能夠好幾臺普通的了),各個模塊通過接口進行數據交互,其實 分佈式也是一種微服務。 因爲都是吧模塊拆分開來變爲獨立的單元,提供接口來調用,那麼 他們本質的區別在哪呢? 他們的區別主要體現在“目標”上, 何爲目標,就是你這樣架構項目要做到的事情。 分佈式的目標是什麼? 我們剛剛也看見了, 就是一臺機器承受不了的,或者是成本問題 , 不得不使用多臺機器來完成服務的部署, 而微服務的目標 只是讓各個模塊拆分開來,不會被互相影響,比如模塊的升級亦或是出現BUG等等…
講了這麼多,可以用一句話來理解:分佈式也是微服務的一種,而微服務他可以是在一臺機器上。

3.微服務與Spring-Cloud的關係(區別)

微服務只是一種項目的架構方式,或者說是一種概念,就如同我們的MVC架構一樣, 那麼Spring-Cloud便是對這種技術的實現。

4.微服務一定要使用Spring-Cloud嗎?

我們剛剛說過,微服務只是一種項目的架構方式,如果你足夠了解微服務是什麼概念你就會知道,其實微服務就算不借助任何技術也能實現,只是有很多問題需要我們解決罷了例如:負載均衡,服務的註冊與發現,服務調用,路由。。。。等等等等一系列問題,所以,Spring-Cloud 就出來了,Spring-Cloud將處理這些問題的的技術全部打包好了,就類似那種開袋即食的感覺。。

4.1 我們可以自己實現微服務

在這裏插入圖片描述
將自己的項目進行拆分就可以,比如這裏我們拆分UserServer,PowerServer,OrderServer,相互之間通過http進行通信但是,我們這樣的架構會出現很多問題的,比如,1.UserServer,PowerServer,OrderServer三個服務器任何一個或者多個罷工我們是不知道,
2.如果PowerSever處理的效率比較低,承受的併發量比較低,就導致整個系統的併發量一起下降…問題都會慢慢找來了
在這裏插入圖片描述
這是大致的springcloud封裝了各個的組件進行來替我們解決微服務在項目中可能遇到的問題的解決方案,不然這些全靠我們自己去開發解決,開發成本太高了

這個地方順便說下負載均衡的原理:
在這裏插入圖片描述
這麼升級使系統能夠承受20w的併發量,至於後面8081,8082是按照什麼策略進行分配:有很多策略:比如輪詢,hashIp,權重,等等後面專題介紹

4.2 springcloud 相關技術

在這裏插入圖片描述
X 表示停更,√表示現在使用的,紅色圈起來的 是最近比較流行的,我們後面需要重點學習的,停更不停用我們還可以用,尤其設計思想更值得我們學習

5. spring cloud 相關介紹

5.1 Spring Cloud 是什麼?

Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分佈式系統的開發,比如服務發現、服務網關、服務路由、鏈路追蹤等。Spring Cloud 並不重複造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從而減少了各模塊的開發成本。換句話說:Spring Cloud 提供了構建分佈式系統所需的“全家桶”。其實就好比某米買個芯片,買個顯示屏,自己再造點殼子組裝成手機

5.2 Spring-Cloud項目的搭建

因爲spring-cloud是基於spring-boot項目來的,所以我們項目得是一個spring-boot項目,至於spring-boot項目,可以參考springboot快速搭建環境這節我們先不討論,這裏要注意的一個點是spring-cloud的版本與spring-boot的版本要對應下圖:
在這裏插入圖片描述
詳細版本對照可以參考官網: https://start.spring.io/actuator/info 這裏強烈要求一定按照版本對照關係進行搭建環境,否則環境問題絕對夠你喝一壺的
這裏稍等我先搭建一個springboot項目
還是簡單的羅列下吧!後面我會把源碼附上的

添加依賴

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

啓動類

@SpringBootApplication
public class UserApp {

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

controller

@RestController
public class UserController {


    @RequestMapping("/getUser.do")
    public R getUser(){
        return R.success().set("user","zhangsan");
    }


}

5.3 添加spring cloud支持

spring boot

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

spring cloud

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

我這裏使用 都是最高版本,開發中根據時間情況自己考慮,沒必要用這麼高的版本
當你項目裏面有這些依賴之後,你的spring cloud項目已經搭建好了(初次下載spring-cloud可能需要一點時間)

6. spring cloud 第一個組件eureka

6.1.eureka是什麼?

eureka是Netflix的子模塊之一,也是一個核心的模塊,eureka裏有2個組件,一個是EurekaServer(一個獨立的項目) 這個是用於定位服務以實現中間層服務器的負載平衡和故障轉移,另一個便是EurekaClient(我們的微服務) 它是用於與Server交互的,可以使得交互變得非常簡單:只需要通過服務標識符即可拿到服務。

6.2. 與spring-cloud的關係:

Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現(可以對比Zookeeper)。
Eureka 採用了 C-S 的設計架構。Eureka Server 作爲服務註冊功能的服務器,它是服務註冊中心。
而系統中的其他微服務,使用 Eureka 的客戶端連接到 Eureka Server並維持心跳連接。這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server 來發現系統中的其他微服務,並執行相關的邏輯。

6.3. 角色關係圖

在這裏插入圖片描述

6. 4 如何使用

6. 4.1 添加依賴

客戶端:

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

服務端:

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

添加相關依賴

當然不管是服務端還是客戶端都需要添加springCloud的支持

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR4</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

6. 4.2 服務端配置

服務端配置信息:yml或者properties文件都可以

server:
  port: 3000
eureka:
  server:
    enable-self-preservation: false  #關閉自我保護機制
    eviction-interval-timer-in-ms: 4000 #設置清理間隔(單位:毫秒 默認是60*1000)
  instance:
    hostname: localhost


  client:
    registerWithEureka: false #不把自己作爲一個客戶端註冊到自己身上
    fetchRegistry: false  #不需要從服務端獲取註冊信息(因爲在這裏自己就是服務端,而且已經禁用自己註冊了)
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

自我保護機制 這裏展開一下,
定義:
當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務註冊表中的信息,不再刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。
簡單理解:當一個服務和Eureka失聯後,Eureka認爲這個服務的問題,當大部分服務都失聯(網絡中斷)這個時候Eureka不再認爲是服務的問題,就懷疑人生,感覺是自己出現了問題,不再清除,跟新任何服務註冊列表中的數據
意義:
自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目註銷任何健康的微服務。使用自我保護模式,可以讓Eureka集羣更加的健壯、穩定

在這裏插入圖片描述
出現這個頁面就證明搭建成功, 這個警告是因爲自我保護機制關閉的原因,先不關了

6. 4.3 客戶端配置

server:
  port: 8082
eureka:
  client:
    serviceUrl:
        defaultZone: http://localhost:3000/eureka  #eureka服務端提供的註冊地址 參考服務端配置的這個路徑
  instance:
    instance-id: user-1 #此實例註冊到eureka服務端的唯一的實例ID
    prefer-ip-address: true #是否顯示IP地址
    leaseRenewalIntervalInSeconds: 10 #eureka客戶需要多長時間發送心跳給eureka服務器,表明它仍然活着,默認爲30(與下面配置的單位都是秒)
    leaseExpirationDurationInSeconds: 30 #Eureka服務器在接收到實例的最後一次發出的心跳後,需要等待多久纔可以將此實例刪除,默認爲90秒

spring:
  application:
    name: client-user #此實例註冊到eureka服務端的name

然後在客戶端的spring-boot啓動項目上 加入註解:@EnableEurekaClient 就可以啓動項目了 這裏就不截圖了我們直接來看效果圖:
在這裏插入圖片描述
這裏我們能看見 名字叫server-power的(圖中將其大寫了) id爲 power-0的服務 註冊到我們的Eureka上面來了 至此,一個簡單的eureka已經搭建好了。
在這裏插入圖片描述

eviction-interval-timer-in-ms: 4000 #設置清理間隔(單位:毫秒 默認是60*1000)
leaseRenewalIntervalInSeconds: 10 #eureka客戶需要多長時間發送心跳給eureka服務器,表明它仍然活着,默認爲30 秒 (與下面配置的單位都是秒)
leaseExpirationDurationInSeconds: 30 #Eureka服務器在接收到實例的最後一次發出的心跳後,需要等待多久纔可以將此實例刪除,默認爲90秒

每10秒給我發一個心跳,如果沒發就等待30秒,不然定期(4000ms)進行清理,這就好比一個美女有很多追求者,需要管理這些追求者,美女怎麼知道這些追求者是否移心別戀了,需要定期給美女放電,如果超過約定的時間,最多等待多久,這裏主要考慮,網絡抖動,而不是服務器自己真的掛了,如果說是因爲其他的事情導致的放電失敗,我可以最多寬容你多久,把那些超過等待時間的定期進行清理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章