分散式專案(七)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 ,筆者這裡也借鑑了一丟丟(捂臉)。