SpringCloud(三):SpringCloud快速開發入門


3-1.  搭建和配置一個服務提供者

我們知道,SpringCloud 構建微服務是基於 SpringBoot 開發的。(如果SpringBoot不會的可以先看SpringBoot專欄)

1、 創建一個 SpringBoot 工程,並且添加 SpringBoot 的相關依賴;

取名:  01-springcloud-service-provider

2、 創建服務提供者的訪問方法,也就是后續消費者如何訪問提供者;Spring  Cloud 是基於 rest 的訪問,所以我們添加一個  Controller,在該

Controller 中提供一個訪問入口:

 @RequestMapping("/service/hello")
    public String hello(){
        // 業務邏輯代碼省略
        return "Hello,Spring Cloud";
    }

  

3、 啟動運行該 SpringBoot 程序,訪問該 controller;訪問結果如下:

 

3-2.  搭建和配置一個服務消費者

服務消費者也是一個 SpringBoot 項目,服務消費者主要用來消費服務提供者提供的服務;

1、 創建一個 SpringBoot 工程,並且添加 SpringBoot 的相關依賴;

 項目名:02-springcloud-service-consumer

這里要建模塊,才能在同一個工作區 方便后面操作 具體看圖

中間省略

 

2、開發一個消費者方法,去消費服務提供者提供的服務,這個消費者方法也是一個 Controller: 如圖:

先建一個包 config  ,建一個類:BeanConfig

 

 

@Configuration   // 等價於一個Spring  applicationContext.xml配置文件
public class BeanConfig {
    /**
     * @Bean 等價於:
     * <bean id="restTemplate" class="xxx.xxx.RestTemplate"></bean>
     * @return
     */
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

 

在建controller層(里面調用的項目一的controller)

@RestController
public class WebController {
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/web/hello")
    public String hello(){
        // 邏輯代碼(省略)

        // 調用SpringCloud服務提供者提供的服務
        return restTemplate.getForEntity("http://localhost:8080/service/hello",String.class).getBody();
    }
}

 

 把02-springcloud-service-consumer 端口改成8081,

啟動第一個項目01-springcloud-service-provider    端口8080 ,在啟動第二個項目  02-springcloud-service-consumer  端口8081,訪問第二個項目的controller

地址即:http://localhost:8081/web/hello

訪問結果如圖:

 進一步完善,實現真正的SpringCloud調用!

 

3-3.  走進服務注冊中心 Eureka

在微服務架構中,服務注冊與發現是核心組件之一,手動指定每個服務是很低效的,Spring  Cloud  提供了多種服務注冊與發現的實現方式,例如:Eureka、Consul、Zookeeper。

Spring Cloud 支持得最好的是 Eureka,其次是 Consul,再次是 Zookeeper。

什么是服務注冊?

服務注冊:將服務所在主機、端口、版本號、通信協議等信息登記到注冊中心上;

什么是服務發現?

服務發現:服務消費者向注冊中心請求已經登記的服務列表,然后得到某個服務的主機、端口、版本號、通信協議等信息,從而實現對具體服務的調用;

Eureka 是什么?

Eureka 是一個服務治理組件,它主要包括服務注冊和服務發現,主要用來搭建服務注冊中心。

Eureka  是一個基於  REST  的服務,用來定位服務,進行中間層服務器的負載均衡和故障轉移;

Eureka  是  Netflix  公司開發的,Spring  Cloud  封裝了  Netflix  公司開發的

Eureka  模塊來實現服務注冊和發現,也就是說 Spring Cloud 對 Netflix Eureka做了二次封裝;

Eureka  采用了 C-S(客戶端/服務端)的設計架構,也就是 Eureka 由兩個組件組成:Eureka 服務端和 Eureka 客戶端。Eureka  Server  作為服務注冊的服務

端,它是服務注冊中心,而系統中的其他微服務,使用  Eureka  的客戶端連接到  Eureka  Server 服務端,並維持心跳連接,Eureka 客戶端是一個 Java 客戶端,用來簡化與服務器的交互、負載均衡,服務的故障切換等;有了 Eureka 注冊中心,系統的維護人員就可以通過  Eureka  Server  來監控系統中各個微服務是否正常運行。

3-4. Eureka 與 Zookeeper 的比較

著名的 CAP 理論指出,一個分布式系統不可能同時滿足 C(一致性)、A(可用性)和 P(分區容錯性)。

由於分區容錯性在是分布式系統中必須要保證的,因此我們只能在 A 和 C 之間進行權衡,在此 Zookeeper 保證的是 CP,  而 Eureka 則是 AP。

Zookeeper 保證 CP

在 ZooKeeper 中,當 master 節點因為網絡故障與其他節點失去聯系時,剩余節點會重新進行 leader 選舉,但是問題在於,選舉 leader 需要一定時間,  且選

舉期間整個 ZooKeeper 集群都是不可用的,這就導致在選舉期間注冊服務癱瘓。在雲部署的環境下,因網絡問題使得 ZooKeeper 集群失去 master 節點是大概

率事件,雖然服務最終能夠恢復,但是在選舉時間內導致服務注冊長期不可用是難以容忍的。

Eureka 保證 AP

Eureka 優先保證可用性,Eureka 各個節點是平等的,某幾個節點掛掉不會影響正常節點的工作,剩余的節點依然可以提供注冊和查詢服務。而 Eureka 的客戶

端在向某個 Eureka 注冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一台 Eureka 還在,就能保證注冊服務可用(保證可用性),只不過查到的信

息可能不是最新的(不保證強一致性)。所以 Eureka 在網絡故障導致部分節點失去聯系的情況下,只要有一個節點可用,那么注冊和查詢服務就可以正常使用,而不會像 zookeeper 那樣使整個注冊服務癱瘓,Eureka 優先保證了可用性。

3-5.  搭建與配置 Eureka 服務注冊中心

Spring  Cloud 要使用 Eureka 注冊中心非常簡單和方便,Spring  Cloud 中的Eureka 服務注冊中心實際上也是一個 Spring Boot 工程,我們只需通過引入相

關依賴和注解配置就能讓 Spring Boot 構建的微服務應用輕松地與 Eureka 進行整合。具體步驟如下:

1、 創建一個 SpringBoot 項目,並且添加 SpringBoot 的相關依賴;03-springcloud-eureka-server   也是new一個模塊 步驟和創建項目2的一樣

2、 添加 eureka 的依賴:

 <!--Spring Cloud的eureka-server起步依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

 

 

再添加springcloud依賴

 <!--springcloud依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

再添加SpringCloud倉庫

 <!--倉庫-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

3、 在 Spring Boot 的入口類上添加一個@EnableEurekaServer 注解,用於開啟 Eureka 注冊中心服務端

 

 application.properties 文件中配置 Eureka 服務注冊中心信息:

#內嵌定時tomcat的端口
server.port=8761
#設置該服務注冊中心的hostname
eureka.instance.hostname=localhost
#由於我們目前創建的應用是一個服務注冊中心,而不是普通的應用,默認情況下,這個應用會向注冊中心(也是它自己)注冊它自己,設置為false表示禁止這種自己向自己注冊的默認行為
eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因為服務注冊中心本身的職責就是維護服務實例,它不需要去檢索其他服務
eureka.client.fetch-registry=false
#指定服務注冊中心的位置
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

3-6.  啟動與測試 Eureka 服務注冊中心

1、完成上面的項目搭建后,我們就可以啟動 SpringBoot 程序,main 方法運行;

2、啟動成功之后,通過在瀏覽器地址欄訪問我們的注冊中心;

3-7.  向 Eureka 服務注冊中心注冊服務

 

我們前面搭建了服務提供者項目(即項目01-springcloud-service-provider),接下來我們就可以將該服務提供者注冊到Eureke 注冊中心,步驟如下:

1、在該服務提供者中添加 eureka 的依賴,因為服務提供者向注冊中心注冊服務,需要連接 eureka,所以需要 eureka 客戶端的支持;

        <!--SpringCloud集成eureka客戶端的起步依賴-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

  springboot項目中沒有eureka客戶端的依賴,所以我們需要加入SpringCloud依賴 和SpringCloud倉庫 步驟和項目3一樣

 <!--springcloud依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <!--springcloud倉庫-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

2、激活 Eureka 中的 EnableEurekaClient 功能:

 Spring Boot 的入口函數處,通過添加@EnableEurekaClient 注解來表明自己是一個 eureka 客戶端,讓我的服務提供者可以連接 eureka 注冊中心;

3、配置服務名稱和注冊中心地址

#配置服務的名稱
spring.application.name=01-springcloud-service-provider
#eureka的連接地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

4、啟動服務提供者 SpringBoot 程序的 main 方法運行;

5、啟動運行之后,通過在瀏覽器地址欄訪問我們之前搭建好的 eureka 注冊中心,就可以看到有一個服務已經注冊成功了;

 

3-8.  從 Eureka 服務注冊中心發現與消費服務

我們已經搭建一個服務注冊中心,同時也向這個服務注冊中心注冊了服務,接下來我們就可以發現和消費服務了,這其中服務的發現由 eureka 客戶端實現,而

服務的消費由 Ribbon 實現,也就是說服務的調用需要 eureka 客戶端和 Ribbon兩者配合起來才能實現;

Eureka 客戶端是什么?

Eureka 客戶端是一個 Java 客戶端,用來連接 Eureka 服務端,與服務端進行交互、負載均衡,服務的故障切換等;

Ribbon 是什么?

Ribbon 是一個基於 HTTP  和  TCP  的客戶端負載均衡器,當使用 Ribbon 對服務進行訪問的時候,它會擴展 Eureka 客戶端的服務發現功能,實現從 Eureka

注冊中心中獲取服務端列表,並通過 Eureka 客戶端來確定服務端是否己經啟動。

Ribbon 在 Eureka 客戶端服務發現的基礎上,實現了對服務實例的選擇策略,從而實現對服務的負載均衡消費。

接下來我們來讓服務消費者去消費服務:我們前面搭建了服務消費者項目,接下來我們就可以使用該服務消費者通過注冊

中心去調用服務提供者,步驟如下:

1、在該消費者項目中添加 eureka 的依賴,因為服務消費者從注冊中心獲取服務,需要連接 eureka,所以需要 eureka 客戶端的支持;

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

同時也要加入 springcloud依賴和springcloud倉庫

  <!--springcloud依賴-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
<!--springcloud倉庫-->
    <repositories>
        <repository>
            <id>spring-milestones</id>
            <name>Spring Milestones</name>
            <url>https://repo.spring.io/libs-milestone</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

2、激活 Eureka 中的 EnableEurekaClient 功能:

 Spring Boot 的入口函數處,通過添加@EnableEurekaClient 注解來表明自己是一個 eureka 客戶端,讓我的服務消費者可以使用 eureka 注冊中心;

 

3、配置服務的名稱和注冊中心的地址:

server.port=8081
#配置服務的名稱
spring.application.name=02-springcloud-service-consumer
#配置eureka注冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

 

 

4、前面我介紹了服務的發現由 eureka 客戶端實現,而服務的真正調用由 ribbon實現,所以我們需要在調用服務提供者時使用 ribbon 來調用:

 

 

 加入了 ribbon 的支持,那么在調用時,即可改為使用服務名稱來訪問:

return restTemplate.getForEntity("http://01-springcloud-service-provider/service/hello",String.class).getBody();

5、完成上面的步驟后,我們就可以啟動消費者的 SpringBoot 程序(即項目2),main 方法運行;

6、啟動成功之后,通過在瀏覽器地址欄訪問我們的消費者,看是否可以正常調用遠程服務提供者提供的服務;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM