您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么實現Eureka集群搭建,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
0.1 Eureka集群搭建
在運行第一個Eureka應用時,服務器實例、服務提供者實例都只是啟動了一個,并沒有體現高可用的特性,本小節將對前面的Eureka應用進行改造,使其可以進行集群部署。
本例將會運行兩個服務器實例、兩個服務提供者實例,然后服務調用者請求服務,集群結構如圖3-6所示。
圖3-6 集群結構
第一個Eureka應用,使用的是瀏覽器訪問Eureka的服務調用者,而改造后,為了能看到負載均衡的效果,會編寫一個HttpClient的REST客戶端訪問服務調用者發布的服務。
由于本書的開發環境只有一臺電腦,操作系統為Windows,如果要構建集群,需要修改hosts文件,為其添加主機名的映射。修改C:\Windows\System32\drivers\etc\hosts文件,添加以下內容:
127.0.0.1 slave1 slave2
新建項目“first-cloud-server”,使用Maven配置與連載四的服務器一致,由于需要對同一個應用程序啟動兩次,因此需要在配置文件中使用profiles(關于profiles已經在連載三中講述過)。服務器配置文件請見代碼清單3-10。
代碼清單3-10:codes\03\3.3\first-cloud-server\src\main\resources\application.yml
server: port: 8761 spring: application: name: first-cloud-server profiles: slave1 eureka: instance: hostname: slave1 client: serviceUrl: defaultZone: http://slave2:8762/eureka/ --- server: port: 8762 spring: application: name: first-cloud-server profiles: slave2 eureka: instance: hostname: slave2 client: serviceUrl: defaultZone: http://slave1:8761/eureka/
代碼清單3-10中配置了兩個profiles,名稱分別為slave1和slave2。在slave1中,配置了應用端口為8761,主機名為slave1,當使用salve1這個profiles來啟動服務器時,將會向http://slave2:8762/eureka/注冊自己。使用salve2來啟動服務器,會向http://slave1:8761/eureka/注冊自己。簡單點說,就是兩個服務器啟動后,它們會互相注冊。
修改啟動類,讓類在啟動時,讀取控制臺的輸入,決定使用哪個profiles來啟動服務器,請見代碼清單3-11。
代碼清單3-11:
codes\03\3.3\first-cloud-server\src\main\java\org\crazyit\cloud\FirstServer.java
@SpringBootApplication @EnableEurekaServer public class FirstServer { public static void main(String[] args) { // 讀取控制臺輸入,決定使用哪個profiles Scanner scan = new Scanner(System.in); String profiles = scan.nextLine(); new SpringApplicationBuilder(FirstServer.class).profiles(profiles).run(args); } }
啟動類中,先讀取控制的輸入,再調用profiles方法來設置啟動的profles。需要注意的是,第一個啟動的服務器會拋出異常,異常原因我們前已經講述,拋出的異常可不必理會。
服務提供者也需要啟動兩個實例,服務提供者的改造與服務端類似,將邊載四中的“first-ek-service-provider”復制出來,并改名為“first-cloud-provider”。修改配置文件,將服務提供者注冊到兩個服務器中,配置文件請見代碼清單3-12。
代碼清單3-12:codes\03\3.3\first-cloud-provider\src\main\resources\application.yml
spring: application: name: first-cloud-provider eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
再修改啟動類,為了避免端口決定,啟動時讀取控制臺輸出,決定使用哪個端口來啟動,啟動類如代碼清單3-13所示。
代碼清單3-13:
codes\03\3.3\first-cloud-provider\src\main\java\org\crazyit\cloud\FirstServiceProvider.java
@SpringBootApplication @EnableEurekaClient public class FirstServiceProvider { public static void main(String[] args) { // 讀取控制臺輸入的端口,避免端口沖突 Scanner scan = new Scanner(System.in); String port = scan.nextLine(); new SpringApplicationBuilder(FirstServiceProvider.class).properties( "server.port=" + port).run(args); } }
啟動類中使用了properties方法來設置啟動端口。為了能看到效果,還需要改造控制器,將服務調用者請求的URL保存起來并返回,修改后的控制器請見代碼清單3-14。
代碼清單3-14:
codes\03\3.3\first-cloud-provider\src\main\java\org\crazyit\cloud\FirstController.java
@RestController public class FirstController { @RequestMapping(value = "/person/{personId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public Person findPerson(@PathVariable("personId") Integer personId, HttpServletRequest request) { Person person = new Person(personId, "Crazyit", 30); // 為了查看結果,將請求的URL設置到Person實例中 person.setMessage(request.getRequestURL().toString()); return person; } }
控制器的findPerson方法,將請求的URL保存到Person實例的message屬性中,調用服務后,可以通過message屬性來查看請求的URL。
將連載四中的“first-ek-service-invoker”復制并改名為“first-cloud-invoker”。本例中的服務調用者只需啟動一個實例,因此修改下配置文件即可使用,請見代碼清單3-15。
代碼清單3-15:codes\03\3.3\first-cloud-invoker\src\main\resources\application.yml
server: port: 9000 spring: application: name: first-cloud-invoker eureka: instance: hostname: localhost client: serviceUrl: defaultZone: http://slave1:8761/eureka/,http://slave2:8761/eureka/
修改的配置,將服務調用注冊到兩個服務器上。
本例使用的是HttpClient,HttpClient是Apache提供的一個HTTP工具包。新建名稱為“first-cloud-rest-client”的項目,在pom.xml中加入以下依賴:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>
新建啟動類,在main方法中編寫調用REST服務的代碼,如代碼清單3-16所示。
代碼清單3-16:
03\3.3\first-cloud-rest-client\src\main\java\org\crazyit\cloud\TestHttpClient.java
public static void main(String[] args) throws Exception { // 創建默認的HttpClient CloseableHttpClient httpclient = HttpClients.createDefault(); // 調用6次服務并輸出結果 for(int i = 0; i < 6; i++) { // 調用 GET 方法請求服務 HttpGet httpget = new HttpGet("http://localhost:9000/router"); // 獲取響應 HttpResponse response = httpclient.execute(httpget); // 根據 響應解析出字符串 System.out.println(EntityUtils.toString(response.getEntity())); } }
在main方法,調用了6次9000端口的router服務并輸出結果。完成編寫后,按以下順序啟動各個組件:
? 啟動兩個服務器端,控制臺中分別輸入“slave1”和“slave2”。
? 啟動兩個服務提供者,控制臺分別輸入8081與8082。
? 啟動服務調用者。
啟動了整個集群后,運行TestHttpClient,可以看到輸出如下:
{"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8081/person/1"} {"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8082/person/1"} {"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8081/person/1"} {"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8082/person/1"} {"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8081/person/1"} {"id":1,"name":"Crazyit","age":30,"message":"http://localhost:8082/person/1"}
根據輸出結果可知,8081與8082端口分別被請求了3次,可見已經達到負載均衡的目的。
關于怎么實現Eureka集群搭建就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。