說到分佈式天然就離不開分佈式和微服務的話題,簡單聊一下。html
微服務是一種軟件架構方式,或者說一個一種結構設計風格,它並非標準,它的邏輯是把一個總體服務按業務拆分紅不一樣獨立的服務,下降服務強依賴,消服務器消息驅動,慣用的例子:買東西涉及到訂單,倉庫,扣錢,之前都是把這些功能做在一個項目中,在一個jvm進程中運行,微服務怎麼搞,把訂單,倉庫,扣錢,搞成三個獨立的項目,運行在三個不一樣的jvm進程中,服務之間使用http調用或者mq驅動。java
分佈式是什麼東西呢?分佈式更多的強調的是一種部署方式,上面微服務已經把一個項目拆分紅了幾個不一樣的項目,那如今項目須要運行起來提供對應的服務,因此這就是分佈式的概念,在不一樣的服務器上分散部署不一樣的服務,這裏須要區分分佈式與集羣的區別。集羣咱們通常講都是把redis,MySQL集羣,這裏主要講是把同一種服務分散部署,橫向擴展,達到容災和提高性能,而分佈式講究的不一樣服務,分散部署。mysql
書接上回,在前面的開發中,咱們已經完成了一整套的流程了,已經具有初步部署的條件了,如今咱們就開準備spring cloud環境。 應廣大不怕事兒大的吃瓜羣衆的要求,這裏不使用eruka(由於eruka2.0的一系列問題),而改用consul。git
分佈式繞不開的一個話題,服務註冊、服務發現、服務治理,換句話說,你得讓別人知道你在哪兒,死沒死,怎麼聯繫你。 而consul就是這樣一套開源的分佈式服務器發現、配置管理的系統,內置了服務註冊和發現,分佈式一致性協議,健康檢查, key/value存儲(redis?有點吊),多數據中心((⊙o⊙)… 不明因此),可視化ui,同時它有種運行模式server/client (哦,是否是客戶端像服務端發送某些數據呢)。web
consul兩種註冊實現的方式,一種是服務本身調用consul提供的http api調用實現註冊,spring cloud就是用的這種,另外一種是經過json配置文件來實現註冊,好比你要把mysql註冊上去,就可使用這種方式。redis
服務發現也有兩種方式,一種也是經過http api調用,另外一種就是使用consul agent DNS。spring
下載 https://www.consul.io/downloads.html ,下載下來解壓,獲得一個consul的二進制文件。sql
啓動json
./consul agent -server -bootstrap --bind=127.0.0.1 -client 0.0.0.0 -data-dir consul_data -uibootstrap
訪問 http://127.0.0.1:8500/ui 就能看到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客戶端。
<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); } }
把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.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 ,筆者這裏也借鑑了一丟丟(捂臉)。