<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Consul 服務注冊和發現示例 > [https://howtodoinjava.com/spring-cloud/consul-service-registration-discovery/](https://howtodoinjava.com/spring-cloud/consul-service-registration-discovery/) 學習基于 Spring cloud 創建[微服務](https://howtodoinjava.com/microservices/microservices-definition-principles-benefits/),在 [HashiCorp Consul](https://www.consul.io/) 注冊表服務器上注冊以及其他微服務(發現客戶端)如何使用它來注冊和發現服務以調用其 API。 我們將使用基于 Spring Boot 的 Spring Cloud API。 我們將使用 Consul 注冊表服務器來構建服務注冊表服務器和通用發現客戶端,后者將自行注冊并發現其他服務以調用 REST API。 ## 總覽 Consul 提供服務發現,配置管理,運行狀況檢查和鍵值存儲等多種功能。今天,我們將專注于服務注冊和發現部分。 我們將開發以下組件來構建分布式生態系統,其中每個組件都相互依賴,但是它們之間的耦合非常松散,當然還有容錯能力。 * **Consul 代理** – 在充當發現/注冊服務器功能的`localhost`上運行。 * **學生微服務** – 將基于學生實體提供一些功能。 這將是一個基于 REST 的服務,最重要的是它將是一個發現服務客戶端,該客戶端將與 Consul 服務器/代理對話以在服務注冊表中注冊自己。 * **學校微服務** – 與學生服務的類型相同 – 唯一增加的功能是它將通過服務查找機制調用學生服務。 我們不會使用學生服務的絕對 URL 與該服務進行交互。 我們將使用 Consul 發現功能,并在調用該功能之前先使用它查找學生服務實例。 這是相同組件的整體組件交互圖。 ![](https://img.kancloud.cn/08/49/084993c2b174b9bc5f70894577305c16_751x548.jpg) 組件圖 #### 技術棧和運行時 * Java 1.8 * Eclipse IDE * Consul 即服務注冊服務器 * SpringCloud * SpringBoot * SpringRest * Maven ## 在本地工作站中配置 Consul 在開始練習之前,我們需要首先在`localhost`中下載,配置和運行 consul 代理。 * 從[ Consul 頁面網站](https://www.consul.io/downloads.html)下載。 根據操作系統選擇特定的程序包。 下載壓縮文件后,我們需要將其解壓縮到所需位置。 * **在本地工作站上啟動 Consul 代理** – 我們已解壓縮的 Zip 文件只有一個名為`consul.exe`的 exe 文件。 我們將在此處啟動命令提示符,并使用以下命令啟動代理。 ```java consul agent -server -bootstrap-expect=1 -data-dir=consul-data -ui -bind=192.168.6.1 ``` 確保輸入正確的綁定地址,根據局域網設置的不同,綁定地址會有所不同。 在命令提示符下執行`ipconfig`以了解您的 **IpV4 地址**,并在此處使用它。 ![](https://img.kancloud.cn/ff/ef/ffeff3a3989ba436de8f2b6cd8a69797_554x128.jpg) `ipconfig`命令 ![](https://img.kancloud.cn/7e/6c/7e6c38814d01965bb9903d17f1037658_1132x629.jpg) 代理啟動命令日志 * **測試 Consul 服務器是否正在運行** – Consul 在默認端口上運行,并且代理成功啟動后,瀏覽`http://localhost:8500/ui`,您應該會看到一個 控制臺屏幕如: ![](https://img.kancloud.cn/fe/41/fe41e4ccfe11b843d4f438680d26f72b_1256x344.jpg) Consul 控制臺 – 沒有注冊服務 因此,我們已經在本地計算機中配置了 consul,并且 consul 代理已成功運行。 現在,我們需要創建客戶端并測試服務注冊表和發現部分。 ## 學生服務 請按照以下步驟創建和運行學生服務。 這將是一個發現客戶端,將其注冊到現在已經在我們的計算機中運行的 Consul 服務。 #### 創建學生項目 從具有四個依賴項的[初始化器頁面](https://start.spring.io/)創建一個 Spring Boot 項目。 * 執行器 * 網頁 * REST 存儲庫 * Consul 發現 給出其他 Maven GAV 坐標并下載項目。 ![](https://img.kancloud.cn/27/2a/272a5c4b0947ecfc51af5db0da08ff74_1348x705.jpg) 學生服務項目生成 將項目解壓縮并將其作為現有的 maven 項目導入 Eclipse。 現在,在`src`文件夾中的 Spring 運行應用程序類上添加`@org.springframework.cloud.client.discovery.EnableDiscoveryClient`注解。 有了此注解,此工件將像 Spring 發現客戶端一樣發揮作用,并在連接到此服務的 Consul 服務器中注冊自己。 ```java package com.example.howtodoinjava.springcloudconsulstudent; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient public class SpringCloudConsulStudentApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudConsulStudentApplication.class, args); } } ``` #### 服務配置 打開`application.properties`并添加以下屬性 ```java server.port=9098 spring.application.name: student-service management.security.enabled=false ``` 這是每個屬性的詳細信息: * `server.port=9098` – 將在默認的 **9098** 端口中啟動服務。 * `spring.application.name: student-service` – 將使用`student-service`標簽在 Consul 服務器中注冊自己,其他服務也將使用此名稱本身查找該服務。 * `management.security.enabled=false` – 此練習實際上不是必需的,但是它將在執行器模塊提供的管理端點中禁用 SpringSecurity。 #### 添加 REST API 現在添加一個`RestController`并公開一個剩余端點,以獲取特定學校的所有學生詳細信息。 在這里,我們公開`/getStudentDetailsForSchool/{schoolname}`端點來滿足業務目的。 為簡單起見,我們正在對學生詳細信息進行硬編碼。 ```java package com.example.howtodoinjava.springcloudconsulstudent.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.example.howtodoinjava.springcloudconsulstudent.domain.Student; @RestController public class StudentServiceController { private static Map<String, List<Student>> schooDB = new HashMap<String, List<Student>>(); static { schooDB = new HashMap<String, List<Student>>(); List<Student> lst = new ArrayList<Student>(); Student std = new Student("Sajal", "Class IV"); lst.add(std); std = new Student("Lokesh", "Class V"); lst.add(std); schooDB.put("abcschool", lst); lst = new ArrayList<Student>(); std = new Student("Kajal", "Class III"); lst.add(std); std = new Student("Sukesh", "Class VI"); lst.add(std); schooDB.put("xyzschool", lst); } @RequestMapping(value = "/getStudentDetailsForSchool/{schoolname}", method = RequestMethod.GET) public List<Student> getStudents(@PathVariable String schoolname) { System.out.println("Getting Student details for " + schoolname); List<Student> studentList = schooDB.get(schoolname); if (studentList == null) { studentList = new ArrayList<Student>(); Student std = new Student("Not Found", "N/A"); studentList.add(std); } return studentList; } } ``` **`Student.java`模型** ```java package com.example.howtodoinjava.springcloudconsulstudent.domain; public class Student { private String name; private String className; public Student(String name, String className) { super(); this.name = name; this.className = className; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } } ``` #### 驗證學生服務 作為 spring boot 應用程序啟動該項目。 現在,確認此服務已在 Consul 服務器中自動注冊。 轉到 Consul 代理控制臺并刷新頁面。 現在,如果一切順利,我們將在 Consul 代理控制臺中看到`student-service`的一項。 ![](https://img.kancloud.cn/a1/9a/a19a32b9b05567f8e2ab8d00f589946c_1287x551.jpg) Consul 控制臺的學生服務注冊 這表明 Consul 服務器和客戶端都相互了解,這是 Consul 服務器和學生服務之間發生的一種自動注冊和發現。 現在,我們將驗證`/getStudentDetailsForSchool/{schoolname}`端點是否已啟動并正在運行。 轉到瀏覽器并轉到`http://localhost:9098/getStudentDetailsForSchool/abcschool`,它將為特定學校`abcschool`提供學生詳細信息。 ![](https://img.kancloud.cn/69/dd/69ddd35135ecaed40845a09b57bb9e8e_812x288.jpg) 學生服務響應 ## 學校服務 – 發現客戶端 現在,我們將創建學校服務,該服務將在 Consul 服務器中進行注冊-它將發現并調用沒有硬編碼 URL 路徑的學生服務。 請按照相同的步驟創建和運行學校服務。 這將是一個發現客戶端,將其注冊到現在已經在我們的計算機中運行的 Consul 服務。 它將內部調用已開發的學生服務,并將使用 Consul 服務發現功能來發現學生實例。 #### 創建學校項目 從具有四個依賴項的[初始化器頁面](https://start.spring.io/)創建一個 Spring Boot 項目。 * 執行器 * 網頁 * REST 存儲庫 * Consul 發現 給出其他 Maven GAV 坐標并下載項目。 ![](https://img.kancloud.cn/78/32/7832b05e4efe9a0ed5d97955fd4f6146_1359x698.jpg) 學校生成 將項目解壓縮并將其作為現有的 maven 項目導入 Eclipse。 現在,在`src`文件夾中的 Spring 運行應用程序類上添加`@org.springframework.cloud.client.discovery.EnableDiscoveryClient`注解。 有了此注解,此工件將像 Spring 發現客戶端一樣發揮作用,并在連接到此服務的 Consul 服務器中注冊自己。 ```java package com.example.howtodoinjava.springcloudconsulschool; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class SpringCloudConsulSchoolApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudConsulSchoolApplication.class, args); } } ``` #### 服務配置 打開`application.properties`并添加以下屬性 ```java server.port=8098 spring.application.name: school-service management.security.enabled=false ``` 這是每個屬性的詳細信息: * `server.port=8098` – 將在默認的 **8098** 端口中啟動服務 * `spring.application.name: school-service` – 將使用`school-service`標簽在 Consul 服務器中注冊自己。 * `management.security.enabled=false` – 將在執行器模塊提供的管理端點中禁用 SpringSecurity。 #### 添加使用學生服務的 REST API 的 REST API 現在添加一個`RestController`,并公開一個 REST 點以獲取學校詳細信息。 該端點將使用帶有應用程序名稱的服務發現樣式 URL,而不是帶有`host:port`的完整 URL 約定。 `SchoolServiceController.java` ```java package com.example.howtodoinjava.springcloudconsulschool.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.example.howtodoinjava.springcloudconsulschool.delegate.StudentServiceDelegate; @RestController public class SchoolServiceController { @Autowired StudentServiceDelegate studentServiceDelegate; @RequestMapping(value = "/getSchoolDetails/{schoolname}", method = RequestMethod.GET) public String getStudents(@PathVariable String schoolname) { System.out.println("Going to call student service to get data!"); return studentServiceDelegate.callStudentServiceAndGetData(schoolname); } } ``` `StudentServiceDelegate.java` ```java package com.example.howtodoinjava.springcloudconsulschool.delegate; import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class StudentServiceDelegate { @Autowired RestTemplate restTemplate; public String callStudentServiceAndGetData(String schoolname) { System.out.println("Consul Demo - Getting School details for " + schoolname); String response = restTemplate.exchange("http://student-service/getStudentDetailsForSchool/{schoolname}", HttpMethod.GET, null, new ParameterizedTypeReference<String>() {}, schoolname).getBody(); System.out.println("Response Received as " + response + " - " + new Date()); return "School Name - " + schoolname + " ::: Student Details " + response + " - " + new Date(); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 看上面的代碼。 在`StudentServiceDelegate`中,我們使用`RestTemplate`調用學生服務,并將學生服務的 URL 用作`http://<font color="RED">student-service/getStudentDetailsForSchool/{schoolname}`。 這樣,我們就可以擺脫特定的服務配置,并且可以將服務查找職責賦予`consul`服務器和此處提供的其余模板。 如果多個實例正在為同一服務運行,我們也可以在此處應用負載平衡(請參閱`@LoadBalanced`注解)。 ## 示例 逐步執行以下步驟以了解整個過程: * **檢查 Consul Agent 是否仍在運行** – 打開瀏覽器,然后瀏覽`http://localhost:8500/ui`。 它應該顯示如上所述的 Consul 控制臺。 * **檢查學生服務是否已運行** – 從 Consul 管理頁面和瀏覽器中檢查學生服務是否已啟動并正在運行。 如果沒有啟動該服務,并驗證它已在 Consul 服務器中注冊。 * **啟動并檢查學校服務** – 從命令提示符啟動學校服務,并檢查它是否已在 Consul 服務器中注冊。 * 打開瀏覽器并使用 URL `http://localhost:8098//getSchoolDetails/abcschool`測試學校 REST 服務。 它將給出以下響應,并將使用 Consul 服務在內部調用學生服務。 ![](https://img.kancloud.cn/98/a3/98a3c28f12e13306196480ebd687078a_1273x226.jpg) 學校服務響應 * 還可以嘗試通過`java -jar "-Dserver.port=9099 target\spring-cloud-consul-student-0.0.1-SNAPSHOT.jar`更改端口來啟動多實例學生服務。這些服務也將在consul 中注冊,并且因為我們在`RestTemplate`中使用`@LoadBalanced`注解,負載平衡也將在內部完成,請檢查相應的學生服務控制臺以確認在多實例場景中調用了哪個實例。 一旦我們注冊了多個服務和多個實例,Consul 服務器的外觀將如此。 ![](https://img.kancloud.cn/04/f1/04f166edf0584375147f7c70917351ba_1288x695.jpg) Consul 所有服務正在運行 ## 檢查是否遇到任何錯誤的內容 * 注解[`@EnableDiscoveryClient`](https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClient.java)和 Consul 代理運行是應用程序生態系統的核心。 沒有這兩個東西將根本無法工作。 * 確保在啟動學校服務,學生服務,Consul 服務器時,代理已在運行,否則可能要花一些時間進行注冊,并且在測試時可能會造成混淆。 ## 總結 我們看到了如何高效地部署 Consul 服務注冊表和發現服務器以及客戶端。 Spring 框架在內部維護著很多東西。 在這里,我們僅使用幾個注解和非常少的配置即可快速完成所有操作。 這就是為 spring 服務創建微服務的服務。 如果您在執行本文時遇到任何困難,請添加注解。 我們將很樂意調查這個問題。 [下載源碼](https://howtodoinjava.com/wp-content/uploads/2017/07/Consoul.zip) 祝您學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看