目錄
一、Eureka的結構和作用
二、搭建eureka-server
三、服務注冊
四、服務發現
假如我們的服務提供者user-service部署了多個實例,如圖:
存在的問題:
-
order-service在發起遠程調用的時候,該如何得知user-service實例的ip地址和端口?
-
有多個user-service實例地址,order-service調用時該如何選擇?
-
order-service如何得知某個user-service實例是否依然健康,是不是已經宕機?
一、Eureka的結構和作用
?
?問題1:order-service如何得知user-service實例地址?
獲取地址信息的流程如下:
user-service服務實例啟動后,將自己的信息注冊到eureka-server(Eureka服務端)。這個叫服務注冊
eureka-server保存服務名稱到服務實例地址列表的映射關系
order-service根據服務名稱,拉取實例地址列表。這個叫服務發現或服務拉取
問題2:order-service如何從多個user-service實例中選擇具體的實例?
order-service從實例列表中利用負載均衡算法選中一個實例地址
向該實例地址發起遠程調用
問題3:order-service如何得知某個user-service實例是否依然健康,是不是已經宕機?
user-service會每隔一段時間(默認30秒)向eureka-server發起請求,報告自己狀態,稱為心跳
當超過一定時間沒有發送心跳時,eureka-server會認為微服務實例故障,將該實例從服務列表中剔除
order-service拉取服務時,就能將故障實例排除了
二、搭建eureka-server
?首先注冊中心服務端:eureka-server,這必須是一個獨立的微服務
引入SpringCloud為eureka提供的starter依賴:
<dependency>
? ? <groupId>org.springframework.cloud</groupId>
? ? <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>?
給eureka-server服務編寫一個啟動類,一定要添加一個@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文件,內容如下:
server:
? port: 10086
spring:
? application:
? ? name: eureka-server
eureka:
? client:
? ? service-url:?
? ? ? defaultZone: http://127.0.0.1:10086/eureka
啟動微服務,然后在瀏覽器訪問:http://127.0.0.1:10086
看到下面結果應該是成功了:
三、服務注冊
下面,我們將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文件,添加服務名稱、eureka地址:
spring:
? application:
? ? name: userservice
eureka:
? client:
? ? service-url:
? ? ? defaultZone: http://127.0.0.1:10086/eureka
為了演示一個服務有多個實例的場景,我們添加一個SpringBoot的啟動配置,再啟動一個user-service。
首先,復制原來的user-service啟動配置:
?然后,在彈出的窗口中,填寫信息(不同版本界面不一樣)
?現在,SpringBoot窗口會出現兩個user-service啟動配置:
不過,第一個是8081端口,第二個是8082端口。
啟動兩個user-service實例:
?查看eureka-server管理頁面:
四、服務發現
下面,我們將order-service的邏輯修改:向eureka-server拉取user-service的信息,實現服務發現。
之前說過,服務發現、服務注冊統一都封裝在eureka-client依賴,因此這一步與服務注冊時一致。
在order-service的pom文件中,引入下面的eureka-client依賴:
<dependency>
? ? <groupId>org.springframework.cloud</groupId>
? ? <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
服務發現也需要知道eureka地址,因此第二步與服務注冊一致,都是配置eureka信息:
在order-service中,修改application.yml文件,添加服務名稱、eureka地址:
spring:
? application:
? ? name: orderservice
eureka:
? client:
? ? service-url:
? ? ? defaultZone: http://127.0.0.1:10086/eureka
最后,我們要去eureka-server中拉取user-service服務的實例列表,并且實現負載均衡。
不過這些動作不用我們去做,只需要添加一些注解即可。
在order-service的OrderApplication中,給RestTemplate這個Bean添加一個@LoadBalanced注解:
?
修改order-service服務中的cn.itcast.order.service包下的OrderService類中的queryOrderById方法。修改訪問的url路徑,用服務名代替ip、端口:
spring會自動幫助我們從eureka-server端,根據userservice這個服務名稱,獲取實例列表,而后完成負載均衡。 ?