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

   在找.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的過程,我也是以初學者的角度來完成這本書的。本書目錄在前面的博客中,可以點擊查看

 

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