第二章 微服務架構搭建與服務啟動註冊:consul

来源:http://www.cnblogs.com/java-zhao/archive/2016/05/28/5538277.html
-Advertisement-
Play Games

一、首先編寫微服務基礎項目framework 1、pom.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...


一、首先編寫微服務基礎項目framework

1、pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6     
 7     <parent>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-starter-parent</artifactId>
10         <version>1.3.0.RELEASE</version>
11     </parent>
12 
13     <groupId>com.microservice</groupId>
14     <artifactId>framework</artifactId>
15     <version>1.0-SNAPSHOT</version>
16     <packaging>jar</packaging>
17 
18     <properties>
19         <java.version>1.8</java.version><!-- 官方推薦 -->
20     </properties>
21 
22     <!-- 引入實際依賴 -->
23     <dependencies>
24         <dependency>
25             <groupId>org.springframework.boot</groupId>
26             <artifactId>spring-boot-starter-web</artifactId>
27         </dependency>
28         <!-- consul-client -->
29         <dependency>
30             <groupId>com.orbitz.consul</groupId>
31             <artifactId>consul-client</artifactId>
32             <version>0.10.0</version>
33         </dependency>
34         <!-- consul需要的包 -->
35         <dependency>
36             <groupId>org.glassfish.jersey.core</groupId>
37             <artifactId>jersey-client</artifactId>
38             <version>2.22.2</version>
39         </dependency>
40         <dependency>
41             <groupId>com.alibaba</groupId>
42             <artifactId>fastjson</artifactId>
43             <version>1.1.15</version>
44         </dependency>
45         <dependency>
46             <groupId>org.springframework.boot</groupId>
47             <artifactId>spring-boot-starter-actuator</artifactId>
48         </dependency>
49         <dependency>
50             <groupId>org.projectlombok</groupId>
51             <artifactId>lombok</artifactId>
52             <version>1.16.8</version>
53             <scope>provided</scope>
54         </dependency>
55     </dependencies>
56 
57     <build>
58         <plugins>
59             <plugin>
60                 <groupId>org.springframework.boot</groupId>
61                 <artifactId>spring-boot-maven-plugin</artifactId>
62             </plugin>
63         </plugins>
64     </build>
65 </project>
View Code

說明:

  • 上邊的<packaging>jar</packaging>可以去掉。因為spring-boot-maven-plugin會打jar包的
  • 引入spring-boot-starter-actuator是為了註冊服務的時候可以直接使用"http://localhost:8080/health"進行健康檢查。見第二十章 springboot + consul

2、com.microservice.framework.MySpringAplication

 1 package com.microservice.framework;
 2 
 3 import org.springframework.boot.SpringApplication;
 4 import org.springframework.boot.autoconfigure.SpringBootApplication;
 5 
 6 import com.microservice.framework.consul.ConsulRegisterListener;
 7 
 8 /**
 9  * 註意:@SpringBootApplication該註解必須在SpringApplication.run()所在的類上
10  *
11  */
12 @SpringBootApplication
13 public class MySpringAplication {
14 
15     public void run(String[] args) {
16         SpringApplication sa = new SpringApplication(MySpringAplication.class);
17         sa.addListeners(new ConsulRegisterListener());
18         sa.run(args);
19     }
20     
21     public static void main(String[] args) {
22     }
23 }
View Code

註意:這裡的main方法聲明是要有的(否則無法install為jar)。

3、com.microservice.framework.consul.ConsulRegisterListener

 1 package com.microservice.framework.consul;
 2 
 3 import java.net.MalformedURLException;
 4 import java.net.URI;
 5 
 6 import org.springframework.context.ApplicationListener;
 7 import org.springframework.context.event.ContextRefreshedEvent;
 8 
 9 import com.orbitz.consul.AgentClient;
10 import com.orbitz.consul.Consul;
11 
12 /**
13  * 監聽contextrefresh事件
14  */
15 public class ConsulRegisterListener implements ApplicationListener<ContextRefreshedEvent> {
16 
17     @Override
18     public void onApplicationEvent(ContextRefreshedEvent event) {
19         Consul consul = event.getApplicationContext().getBean(Consul.class);
20         ConsulProperties prop = event.getApplicationContext().getBean(ConsulProperties.class);
21 
22         AgentClient agentClient = consul.agentClient();
23         try {
24             agentClient.register(prop.getServicePort(), 
25                                  URI.create(prop.getHealthUrl()).toURL(),
26                                  prop.getHealthInterval(), 
27                                  prop.getServicename(), 
28                                  prop.getServicename(), // serviceId:
29                                  prop.getServiceTag());
30         } catch (MalformedURLException e) {
31             e.printStackTrace();
32         }
33     }
34 
35 }
View Code

註意:這個代碼是關鍵,後邊會講改代碼的作用。

其中,ConsulProperties和Consul我們需要在代碼中構建成Bean(如下變4和5),之後才能從容器中取出來,否則為null。

4、com.microservice.framework.consul.ConsulProperties

 1 package com.microservice.framework.consul;
 2 
 3 import org.springframework.beans.factory.annotation.Value;
 4 import org.springframework.stereotype.Component;
 5 
 6 import lombok.Getter;
 7 import lombok.Setter;
 8 
 9 @Component
10 @Getter @Setter
11 public class ConsulProperties {
12 
13     @Value("${service.name}")
14     private String servicename;
15     @Value("${service.port:8080}")
16     private int servicePort;
17     @Value("${service.tag:dev}")
18     private String serviceTag;
19 //    @Value("${serviceIp:localhost}")
20 //    private String serviceIp;
21     
22     @Value("${health.url}")
23     private String healthUrl;
24     @Value("${health.interval:10}")
25     private int healthInterval;
26     
27 }
View Code

註意:

  • 這裡使用lombok簡化了pojo
  • @value註解中可以指定預設值,查看上邊":"後邊的值就是

5、com.microservice.framework.consul.ConsulConfig

 1 package com.microservice.framework.consul;
 2 
 3 import org.springframework.context.annotation.Bean;
 4 import org.springframework.context.annotation.Configuration;
 5 
 6 import com.orbitz.consul.Consul;
 7 
 8 @Configuration
 9 public class ConsulConfig {
10 
11     @Bean
12     public Consul consul(){
13         return Consul.builder().build();
14     }
15 }
View Code

編寫完上述代碼後,執行"mvn clean install",如果成功的話,此時"framework-1.0-SNAPSHOT.jar"這個jar就會裝載到本地的.m2/repository/com/microservice/framework/q.0-SNAPSHOT中了(mac中.m2預設在~下)

 

二、開發第一個微服務myserviceA

像上邊所示,我們創建了client和server。

  • server:用於實現具體邏輯
  • client:用於封裝server介面(通常就是server模塊的controller中的各個url),提供給其他service或gateway甚至是app使用

1、myserviceA

pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <parent>
 8         <groupId>org.springframework.boot</groupId>
 9         <artifactId>spring-boot-starter-parent</artifactId>
10         <version>1.3.0.RELEASE</version>
11     </parent>
12 
13     <groupId>com.microservice</groupId>
14     <artifactId>myserviceA</artifactId>
15     <version>1.0-SNAPSHOT</version>
16     <packaging>pom</packaging>
17 
18     <properties>
19         <java.version>1.8</java.version><!-- 官方推薦 -->
20     </properties>
21 
22     <modules>
23         <module>server</module>
24         <module>client</module>
25     </modules>
26 
27     <!-- 引入實際依賴 -->
28     <dependencies>
29         <dependency>
30             <groupId>org.springframework.boot</groupId>
31             <artifactId>spring-boot-starter-web</artifactId>
32         </dependency>
33     </dependencies>
34 </project>
View Code

2、myserviceA-server

2.1、pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6     
 7     <parent>
 8         <groupId>com.microservice</groupId>
 9         <artifactId>myserviceA</artifactId>
10         <version>1.0-SNAPSHOT</version>
11     </parent>
12 
13     <artifactId>myserviceA-server</artifactId>
14 
15     <!-- 引入實際依賴 -->
16     <dependencies>
17         <dependency>
18             <groupId>com.microservice</groupId>
19             <artifactId>framework</artifactId>
20             <version>1.0-SNAPSHOT</version>
21         </dependency>
22         <dependency>
23             <groupId>com.alibaba</groupId>
24             <artifactId>fastjson</artifactId>
25             <version>1.1.15</version>
26         </dependency>
27     </dependencies>
28 
29     <build>
30         <plugins>
31             <plugin>
32                 <groupId>org.springframework.boot</groupId>
33                 <artifactId>spring-boot-maven-plugin</artifactId>
34             </plugin>
35         </plugins>
36     </build>
37 </project>
View Code

2.2、application.properties

1 service.name=myserviceA
2 service.port=8080
3 service.tag=dev
4 health.url=http://localhost:8080/health
5 health.interval=10
View Code

說明:

  • service.name(這是一個service在註冊中心的唯一標識)
  • service.port
  • service.tag(該值用於在註冊中心的配置管理,dev環境下使用dev的配置,prod下使用prod的配置,配置管理通常使用KV來實現的,tag用於構建Key)
  • health.url(健康檢查的url)
  • health.interval(每隔10s ping一次health.url,進行健康檢查)

2.3、com.microservice.myserviceA.MyServiceAApplication

 1 package com.microservice.myserviceA;
 2 
 3 import org.springframework.boot.autoconfigure.SpringBootApplication;
 4 
 5 import com.microservice.framework.MySpringAplication;
 6 
 7 @SpringBootApplication
 8 public class MyServiceAApplication {
 9 
10     public static void main(String[] args) {
11         MySpringAplication mySpringAplication = new MySpringAplication();
12         mySpringAplication.run(args);
13     }
14 }
View Code

說明:這裡調用了framework中的MySpringAplication的run(),該run()首先初始化了SpringApplication實例,之後為該實例添加ConsulRegisterListener實例,最後再執行SpringApplication的run()(該方法先初始化了各個bean,之後刷新容器的時候調用ConsulRegisterListener,因為該listener監聽的是ContextRefreshedEvent事件)。在該事件中進行service的註冊。

3、myserviceA-client

pom.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4     
 5     <modelVersion>4.0.0</modelVersion>
 6     
 7     <parent>
 8         <groupId>com.microservice</groupId>
 9         <artifactId>myserviceA</artifactId>
10         <version>1.0-SNAPSHOT</version>
11     </parent>
12 
13     <artifactId>myserviceA-client</artifactId>
14 
15     <build>
16         <plugins>
17             <plugin>
18                 <groupId>org.springframework.boot</groupId>
19                 <artifactId>spring-boot-maven-plugin</artifactId>
20             </plugin>
21         </plugins>
22     </build>
23 </project>
View Code

該client以後在需要用到的時候完成。

 

測試:啟動consul,開發環境下,直接使用"consul agent -dev"快速啟動,查看consul UI,如下:

 

啟動"myserviceA-server",啟動完成後,查看consul UI,如下:

表示註冊成功,我們還可以查看myserviceA的健康檢查URL,如下:

 

以上就完成了基本微服務架構的搭建與服務啟動時自動註冊!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #include <stdio.h>int main(){ long a,b,c,d,e; scanf("%ld",&a); d=a; b=0; while(d>2) { d=d/2; b=b+1; } b=b-1; d=2; for(c=1;c<=b;c++) { d=d*2; } b=d*2; ...
  • 運行: ...
  • 本文代碼為原創一個簡陋的管理系統,只做功能的測試。並沒有去完善所有應有的功能,只做了輸入輸出查找。僅供參考! 菜單部分: 重點的管理部分: 主函數部分: ...
  • #include <stdio.h>int main(){ int a,b; scanf("%d",&a); b=0; while(a) { b+=a%10; a/=10; } printf("%d\n",b); return 0;} ...
  • RAD Server是一個應用服務框架平臺,可快速構建和部署應用服務。RAD Server提供自動化的Delphi和C++ REST/ JSON API的 發佈與管理、企業資料庫集成中間件、智能物聯網設備軟體(IoT Edgeware)和一系列通用應用服務如用戶目錄和認證服務,消息推 送服務,室內/ ...
  • 建立Bank類,類中有變數double balance表示存款,Bank類的構造方法能初始化餘額,Bank類中有存款的方法cunKuan(double balance),取款的發方法withDrawal(double dAmount),當取款的數額大於存款時,拋出InsufficientFundsE ...
  • 第一步:獲取apache-tomcat-8.0.35-windows-x64.zip並解壓 第二步:從命令行進入bin目錄 第三步:執行命令:service.bat install,這樣就會將tomcat8.exe文件註冊成系統的服務。 第四步:啟動服務 第五步:在瀏覽器地址欄輸入http://lo ...
  • 按照C編譯器的約定調用函數時壓棧的順序是從右向左,並且返回值是保存在eax寄存器當中。這個命題本該是成立的,下麵用一個小程式來反彙編觀察執行過程: 代碼解釋一下,asm的代碼中movl %%eax, %0的意思是把寄存器eax的值賦值給咱們程式的eax變數當中。但為什麼執行結果卻是: z is 11 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...