怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了樂業(yè)免費(fèi)建站歡迎大家使用!
1,什么是Eureka,什么是服務(wù)注冊與發(fā)現(xiàn)
Spring Boot作為目前最火爆的web框架。那么它與Eureka又有什么關(guān)聯(lián)呢?
Eureka是Netflix開源的一個RESTful服務(wù),主要用于服務(wù)的注冊發(fā)現(xiàn)。
Eureka由兩個組件組成:Eureka服務(wù)器和Eureka客戶端。Eureka服務(wù)器用作服務(wù)注冊服務(wù)器。
Eureka客戶端是一個java客戶端,用來簡化與服務(wù)器的交互、作為輪詢負(fù)載均衡器,并提供服務(wù)的故障切換支持。
Netflix在其生產(chǎn)環(huán)境中使用的是另外的客戶端,它提供基于流量、資源利用率以及出錯狀態(tài)的加權(quán)負(fù)載均衡。
2,先創(chuàng)建一個Eureka-Server服務(wù)注冊中心
這里需要用到spring-cloud的Eureka模塊,他是一個服務(wù)的注冊和發(fā)現(xiàn)模塊
如圖我們先new一個Spring-boot工程引入Eureka Server
Next>>>>Finish完成
我們來看看構(gòu)建好的Eureka-Server的pom.xml代碼
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.eureka</groupId> <artifactId>server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties> <dependencies> <!-- 引入的Eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
我們看到這里與普通的Spring-boot項(xiàng)目不同的是,這里引用了一個Eureka-Server包。
那么我們怎么使用它呢,怎么啟動它呢?
這里只需要啟動一個注解就可以啦,我們在Spring-Boot工程的啟動類上加>>>>>> @EnableEurekaServer
代碼如下:
package com.eureka.server; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * 啟動一個服務(wù)注冊中心 */ @EnableEurekaServer @SpringBootApplication public class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class, args); } }
差點(diǎn)忘了,我們還需要配置application.yml
Eureka是一個高可用的組件,每一個實(shí)例注冊之后需要向注冊中心發(fā)送心跳包,在默認(rèn)情況下erureka server也是一個eureka client ,必須要指定一個 server。
eureka server的配置文件appication.yml:
server: port: 8081 #服務(wù)注冊中心端口號 eureka: instance: hostname: 127.0.0.1 #服務(wù)注冊中心IP地址 client: registerWithEureka: false #是否向服務(wù)注冊中心注冊自己 fetchRegistry: false #是否檢索服務(wù) serviceUrl: #服務(wù)注冊中心的配置內(nèi)容,指定服務(wù)注冊中心的位置 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
我們來啟動一下吧
我們在瀏覽器上輸入http://127.0.0.1:8081/飛機(jī)直達(dá)
我們可以看到它的可視化界面
細(xì)心的朋友會發(fā)現(xiàn),這里沒有發(fā)現(xiàn)服務(wù)???No instance available
why? 因?yàn)槲覀冞€沒有服務(wù)向注冊中心注冊服務(wù),所以找不到啊
3,先創(chuàng)建一個Eureka-Client客戶端也就是服務(wù)提供者
客戶端在向注冊中心它會提供一些元數(shù)據(jù),例如主機(jī)和端口,URL,主頁等。Eureka server 從 每 個client實(shí)例接收心跳消息。 如果心跳超時,則通常將該實(shí)例從注冊server中刪除。
創(chuàng)建客戶端和服務(wù)端差不多,只是啟動注解有點(diǎn)不一樣,還有yml配置文件
Next>>>Finish完成啦
打開會發(fā)現(xiàn)pom.xml其實(shí)和Server注冊中心的類似
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.eureka</groupId> <artifactId>provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>provider</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
怎么證明它是Client呢
很簡單
在Spring-boot的啟動類上通過注解@EnableEurekaClient 表明自己是一個eurekaclient.
package com.eureka.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端 */ @RestController @EnableEurekaClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } /** * 假如這個客戶端要提供一個getUser的方法 * @return */ @GetMapping(value = "/getUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); data.put("id",id); data.put("userName","admin"); data.put("from","provider-A"); return data; } }
雖然加好了@EnableEurekaClient,總感覺差點(diǎn)什么,對了,配置文件yml
eureka: client: serviceUrl: #注冊中心的注冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8082 #服務(wù)端口號 spring: application: name: service-provider #服務(wù)名稱--調(diào)用的時候根據(jù)名稱來調(diào)用該服務(wù)的方法
我們來啟動看看吧
我們看到這個客戶端已經(jīng)向注冊中心注冊服務(wù)了,那么我們打開Eureka-server飛機(jī)直達(dá)
我們看到我們啟動的服務(wù)是不是加進(jìn)去了呢
我們看到我們的服務(wù)是不是加進(jìn)去了呢。
那么有人會問,那一大堆飆紅的什么意思啊。因?yàn)樽缘姆?wù)都是高可用的,這里只檢測到一個服務(wù),產(chǎn)生的預(yù)警,不影響使用,等下我們啟動多個實(shí)例就不會了。
我們先來測試下客戶端的方法是否可用 http://127.0.0.1:8082/getUser?id=1
顯然是沒有問題,那么我們提供好了服務(wù),sei來消費(fèi)呢?
下面我們就來建立一個消費(fèi)者
為了更簡單易懂,我還是一步一步出圖吧。
來,貼上pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.eureka</groupId> <artifactId>consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>consumer</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RC2</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
主要是啟動類,里面內(nèi)容就豐富啦,都在注釋里
package com.eureka.consumer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端-消費(fèi)者 */ @RestController @EnableEurekaClient @SpringBootApplication public class ConsumerApplication { @Autowired RestTemplate restTemplate; public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } /** * 實(shí)例化RestTemplate * @return */ @LoadBalanced @Bean public RestTemplate rest() { return new RestTemplate(); } /** * Rest服務(wù)端使用RestTemplate發(fā)起http請求,然后得到數(shù)據(jù)返回給前端----gotoUser是為了區(qū)分getUser怕小伙伴暈頭 * @param id * @return */ @GetMapping(value = "/gotoUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); /** * 小伙伴發(fā)現(xiàn)沒有,地址居然是http://service-provider * 居然不是http://127.0.0.1:8082/ * 因?yàn)樗蜃灾行淖粤朔?wù),服務(wù)名稱service-provider,我們訪問service-provider即可 */ data = restTemplate.getForObject("http://service-provider/getUser?id="+id,Map.class); return data; } }
配置文件和
eureka: client: serviceUrl: #注冊中心的注冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8083 #服務(wù)端口號 spring: application: name: service-consumer #服務(wù)名稱--調(diào)用的時候根據(jù)名稱來調(diào)用該服務(wù)的方法
我們啟動看看效果吧
看看我們的提供者和消費(fèi)者是不是都進(jìn)來了
那么我們看看我們消費(fèi)者的方法是否可用 飛機(jī)直達(dá)
哈哈,是不是很神奇
下面介紹個更神奇的東西--實(shí)現(xiàn)微服務(wù)負(fù)載均衡
我們把服務(wù)提供者復(fù)制一個工程出來,我們再做下小小的修改,看看是否能實(shí)現(xiàn)負(fù)載均衡。
我們需要修改兩個文件
一個是啟動類,改了哪些呢?看看就曉得咯
package com.eureka.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import java.util.HashMap; import java.util.Map; /** * Eureka客戶端 */ @RestController @EnableEurekaClient @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } /** * 假如這個客戶端要提供一個getUser的方法 * @return */ @GetMapping(value = "/getUser") @ResponseBody public Map<String,Object> getUser(@RequestParam Integer id){ Map<String,Object> data = new HashMap<>(); data.put("id",id); data.put("userName","admin"); data.put("from","provider-B");//改這里是為了讓大家更能理解它負(fù)載均衡的機(jī)制 return data; } }
還有就是yml配置文件
eureka: client: serviceUrl: #注冊中心的注冊地址 defaultZone: http://127.0.0.1:8081/eureka/ server: port: 8088 #服務(wù)端口號--該端口不要沖突 spring: application: name: service-provider #服務(wù)名稱--調(diào)用的時候根據(jù)名稱來調(diào)用該服務(wù)的方法--名字絕對不能改,改了就訪問不到了
我們來啟動一下吧
看看Eureka-server后臺的效果 ServerA ServerB
這個叫做Service-provider是不是有兩個實(shí)例啊
那么,我們分別訪問一下,看看效果怎么樣
看到了嗎,8082端口,from是provider-A,8088端口,from是provider-B.
那么我們訪問消費(fèi)者的服務(wù)器看看會出現(xiàn)什么樣的情況呢 飛機(jī)直達(dá)
一開始是from A,你刷新一下,誒? 變成 from B了。
說明這個時候兩臺提供者在交替工作,從而達(dá)到了一個負(fù)載均衡的作用。
來來來,我給你畫個圖
關(guān)于怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
本文題目:怎么在SpringBoot中利用Eureka實(shí)現(xiàn)微服務(wù)負(fù)載均衡
網(wǎng)站鏈接:http://www.chinadenli.net/article18/ippidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、標(biāo)簽優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站制作、商城網(wǎng)站、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)