前置導(dǎo)入
我們在前文的案例中,我們采取如下的方式發(fā)送http請求:
我們將user-service的ip地址和端口硬編碼在了代碼當(dāng)中,這樣的寫法是有一定問題的。我們在公司開發(fā)中,可能會面臨多個環(huán)境,開發(fā)環(huán)境、測試環(huán)境等等,每一次環(huán)境的變更可能服務(wù)的地址也會發(fā)生變化,使用硬編碼顯然是不明智的選擇。
假如我們的服務(wù)提供者user-service部署了多個實例形成一個集群,如圖:
顯然在這種情況下,我們的硬編碼也是不明智的。
既然不能使用硬編碼,我們不由得思考以下的問題:
- order-service在發(fā)起遠(yuǎn)程調(diào)用的時候,該如何得知user-service實例的ip地址和端口?
- 有多個user-service實例地址,order-service調(diào)用時該如何選擇?
- order-service如何得知某個user-service實例是否依然健康,是不是已經(jīng)宕機?
Eureka的結(jié)構(gòu)和作用
以上的問題都可以使用注冊中心Eureke解決。
在Eureka架構(gòu)中,微服務(wù)角色有兩類:
- EurekaServer:服務(wù)端,注冊中心
- 記錄服務(wù)信息
- 心跳監(jiān)控
- EurekaClient:客戶端
- Provider:服務(wù)提供者,例如案例中的user-service
- 注冊自己的信息到EurekaServer
- 每隔30s向EurekaServer發(fā)送心跳
- consumer:服務(wù)消費者,例如案例中的order-service
- 根據(jù)服務(wù)名稱從EurekaServer拉取服務(wù)列表
- 基于服務(wù)列表做負(fù)載均衡,選中一個微服務(wù)后發(fā)起遠(yuǎn)程調(diào)用
- Provider:服務(wù)提供者,例如案例中的user-service
回答之前的各個問題。
問題1:order-service如何得知user-service實例地址?
獲取地址信息的流程如下:
- user-service服務(wù)實例啟動后,將自己的信息注冊到eureka-server(Eureka服務(wù)端)。這個叫服務(wù)注冊
- eureka-server保存服務(wù)名稱到服務(wù)實例地址列表的映射關(guān)系
- order-service根據(jù)服務(wù)名稱,拉取實例地址列表。這個叫服務(wù)發(fā)現(xiàn)或服務(wù)拉取
問題2:order-service如何從多個user-service實例中選擇具體的實例?
- order-service從實例列表中利用負(fù)載均衡算法選中一個實例地址
- 向該實例地址發(fā)起遠(yuǎn)程調(diào)用
問題3:order-service如何得知某個user-service實例是否依然健康,是不是已經(jīng)宕機?
- user-service會每隔一段時間(默認(rèn)30秒)向eureka-server發(fā)起請求,報告自己狀態(tài),稱為心跳
- 當(dāng)超過一定時間沒有發(fā)送心跳時,eureka-server會認(rèn)為微服務(wù)實例故障,將該實例從服務(wù)列表中剔除
- order-service拉取服務(wù)時,就能將故障實例排除了
- 例如8083現(xiàn)在宕機了:
注意:一個微服務(wù),既可以是服務(wù)提供者,又可以是服務(wù)消費者,因此eureka將服務(wù)注冊、服務(wù)發(fā)現(xiàn)等功能統(tǒng)一封裝到了eureka-client端
接下來我們進行三個方面的實踐去體驗Eureka注冊中心:
搭建eureka-server
首先注冊中心服務(wù)端:eureka-server,這必須是一個獨立的微服務(wù)
創(chuàng)建eureka-server服務(wù)
在cloud-demo父工程下,創(chuàng)建一個子模塊:
填寫模塊信息:
然后填寫服務(wù)信息:
引入eureka依賴
引入SpringCloud為eureka提供的starter依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
編寫啟動類
給eureka-server服務(wù)編寫一個啟動類,一定要添加一個@EnableEurekaServer注解,開啟eureka的注冊中心功能:
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
編寫配置文件
編寫一個application.yml文件,內(nèi)容如下:
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
這里的name和地址是為了做服務(wù)的注冊而準(zhǔn)備的
name配置的是微服務(wù)名稱,因為每個服務(wù)注冊的時候都要帶上名字。
defaultZone配置的是微服務(wù)的地址
euraka自身就是一個微服務(wù),他自己也要進行注冊。這是為了以后Eureka集群之間進行通信用的。比方說我啟動了三個Eureka,那么三個Eureka之間會相互做注冊,這樣他們就可以做數(shù)據(jù)交流了。這個時候的defaultZone會配置集群的多個地址,多個之間使用逗號隔開。
eureka.client.service-url
指定eureka服務(wù)端的注冊地址 (Eureka Server的分區(qū)地址)
這個是客戶端使用的,告訴客戶端服務(wù)的地址(讓其知道去哪注冊啊)
eureka.client.service-url 是個map,可以指定多個,有個默認(rèn)的defaultZone
eureka.client.service-url.defaultZone=http://local.register.com:${server.port}/eureka/
defaultZone是key, http://local.register.com:${server.port}/eureka/是value
這里的defaultZone中配置的地址有一個/eureka后綴,但是我們訪問的時候是沒有這個后綴的,這是因為在eureka server的實現(xiàn)中存在一個web請求過濾器,其url模式就是【/eureka/*】。
啟動服務(wù)
啟動微服務(wù),然后在瀏覽器訪問:http://127.0.0.1:10086
看到下面結(jié)果應(yīng)該是成功了:
我們進來之后重點關(guān)注一個地方:
這里顯示的是注冊到Eureka的實例
注意:這里的地址前半部分顯示的是主機名,你可以把它理解為哦localhost
總結(jié)
服務(wù)注冊
下面,我們將user-service注冊到eureka-server中去。
引入依賴
在user-service的pom文件中,引入下面的eureka-client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
在user-service中,修改application.yml文件,添加服務(wù)名稱、eureka地址:
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
啟動多個user-service實例
為了演示一個服務(wù)有多個實例的場景,我們添加一個SpringBoot的啟動配置,再啟動一個user-service。
首先,復(fù)制原來的user-service啟動配置:
然后,在彈出的窗口中,填寫信息:
現(xiàn)在,SpringBoot窗口會出現(xiàn)兩個user-service啟動配置:
不過,第一個是8081端口,第二個是8082端口。
啟動兩個user-service實例:
查看eureka-server管理頁面:
服務(wù)發(fā)現(xiàn)
下面,我們將order-service的邏輯修改:向eureka-server拉取user-service的信息,實現(xiàn)服務(wù)發(fā)現(xiàn)。
引入依賴
之前說過,服務(wù)發(fā)現(xiàn)、服務(wù)注冊統(tǒng)一都封裝在eureka-client依賴,因此這一步與服務(wù)注冊時一致。
在order-service的pom文件中,引入下面的eureka-client依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件
服務(wù)發(fā)現(xiàn)也需要知道eureka地址,因此第二步與服務(wù)注冊一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服務(wù)名稱、eureka地址:
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
服務(wù)拉取和負(fù)載均衡
最后,我們要去eureka-server中拉取user-service服務(wù)的實例列表,并且實現(xiàn)負(fù)載均衡。
不過這些動作不用我們?nèi)プ?,只需要添加一些注解即可?/p>
在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced注解:
修改order-service服務(wù)中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務(wù)名代替ip、端口:
spring會自動幫助我們從eureka-server端,根據(jù)userservice這個服務(wù)名稱,獲取實例列表,而后完成負(fù)載均衡。
我們使用postman測試一下:文章來源:http://www.zghlxwxcb.cn/news/detail-791586.html
注意:使用Service啟動服務(wù)集群的時候,即使顯示已經(jīng)啟動好了,還是會存在一些延遲。文章來源地址http://www.zghlxwxcb.cn/news/detail-791586.html
到了這里,關(guān)于【微服務(wù)】Eureka注冊中心的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!