1. 程式人生 > >分散式專案(七)consul 服務註冊與發現

分散式專案(七)consul 服務註冊與發現

說到分散式自然就離不開分散式和微服務的話題,簡單聊一下。

微服務是一種軟體架構方式,或者說一個一種結構設計風格,它並不是標準,它的邏輯是把一個整體服務按業務拆分成不同獨立的服務,降低服務強依賴,消伺服器訊息驅動,慣用的例子:買東西涉及到訂單,倉庫,扣錢,以前都是把這些功能作在一個專案中,在一個jvm程序中執行,微服務怎麼搞,把訂單,倉庫,扣錢,搞成三個獨立的專案,執行在三個不同的jvm程序中,服務之間使用http呼叫或者mq驅動。

分散式是什麼東西呢?分散式更多的強調的是一種部署方式,上面微服務已經把一個專案拆分成了幾個不同的專案,那現在專案需要執行起來提供對應的服務,所以這就是分散式的概念,在不同的伺服器上分散部署不同的服務,這裡需要區分分散式與叢集的區別。叢集我們一般講都是把redis,MySQL叢集,這裡主要講是把同一種服務分散部署,橫向擴充套件,達到容災和提升效能,而分散式講究的不同服務,分散部署。

書接上回,在前面的開發中,我們已經完成了一整套的流程了,已經具備初步部署的條件了,現在我們就開準備spring cloud環境。 應廣大不怕事兒大的吃瓜群眾的要求,這裡不使用eruka(因為eruka2.0的一系列問題),而改用consul。

consul

分散式繞不開的一個話題,服務註冊、服務發現、服務治理,換句話說,你得讓別人知道你在哪兒,死沒死,怎麼聯絡你。 而consul就是這樣一套開源的分散式伺服器發現、配置管理的系統,內建了服務註冊和發現,分散式一致性協議,健康檢查, key/value儲存(redis?有點吊),多資料中心((⊙o⊙)… 不明所以),視覺化ui,同時它有種執行模式server/client (哦,是不是客戶端像服務端傳送某些資料呢)。

服務註冊

consul兩種註冊實現的方式,一種是服務自己呼叫consul提供的http api呼叫實現註冊,spring cloud就是用的這種,另一種是通過json配置檔案來實現註冊,比如你要把mysql註冊上去,就可以使用這種方式。

服務發現

服務發現也有兩種方式,一種也是通過http api呼叫,另一種就是使用consul agent DNS。

consul安裝

下載 https://www.consul.io/downloads.html ,下載下來解壓,得到一個consul的二進位制檔案。

啟動

./consul agent -server -bootstrap --bind=127.0.0.1 -client 0.0.0.0 -data-dir consul_data -ui

訪問 http://127.0.0.1:8500/ui 就能看到consul的管理介面了。

spring consul

現在開始spring cloud了,所以建立新工程cloud-work

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>
<dependencyManagement>
        <dependencies>
            <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>

consul-discovery-client

建立consul-discovery-client模組,使用者整合consul客戶端。

<dependencies>
        <!--spring 實現的consul客戶端,提供服務註冊和發現-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>
        <!--actuator 提供健康檢查,consul server會定時呼叫-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--提供http呼叫服務-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class,args);
    }
}
@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryApplication.class,args);
    }
}

iot-pt改造

把consul-discovery-client打maven包,在iot-pt專案中引用,並加入spring cloud依賴。

	<dependency>
            <groupId>cn.le</groupId>
            <artifactId>consul-discovery-client</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
<dependencyManagement>
        <dependencies>
            <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>
<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

修改 coap-server

我們先拿coap-server實現,修改配置檔案

coap.port=5683
coap.iot.byte=iot-byte
coap.iot.json=iot-json

spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500

server.port=8090
server.servlet.context-path=/coap-server
spring.application.name=coap-server
#健康檢查路徑
spring.cloud.consul.discovery.health-check-path= 
	${server.servlet.context-path}/actuator/health

啟動專案,開啟consul管理頁面

結束語

其它的iot-pt模組這是按照這種方式來搞,這裡就不一一說明了。想了解更多關於consul的,點選https://www.cnblogs.com/duanxz/p/7053301.html ,筆者這裡也借鑑了一丟丟(捂臉)。

https://gitee.com/distant/cloud-work.git

https://gitee.com/d