(1) 創(chuàng)建shop_eureka_server子模塊
在 shop_parent 下創(chuàng)建子模塊 shop_eureka_server
(2) 引入maven坐標(biāo)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(3) 配置application.yml
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
registerWithEureka: 是否將自己注冊(cè)到Eureka服務(wù)中,本身就是所有無需注冊(cè)
fetchRegistry : 是否從Eureka中獲取注冊(cè)信息
serviceUrlEureka: 客戶端與Eureka服務(wù)端進(jìn)行交互的地址
(4) 配置啟動(dòng)類
在 cn.muziwk.eureka 下創(chuàng)建啟動(dòng)類 EurekaServerApplication
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
EnableEurekaServer : 激活Eureka Server端配置
服務(wù)注冊(cè)中心管理后臺(tái)
打開瀏覽器訪問http://localhost8761即可進(jìn)入EurekaServer內(nèi)置的管理控制臺(tái),顯示效果如下

服務(wù)注冊(cè)到Eureka注冊(cè)中心
商品服務(wù)注冊(cè)
(1) 商品模塊中引入坐標(biāo)
在 shop_service_product 的pom文件中添加eureka client的相關(guān)坐標(biāo)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
(2) 配置application.yml文件
在工程的 application.yml 中添加Eureka Server的主機(jī)地址
eureka:
client:
serviceUrl: # eureka server的路徑
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true #使用ip注冊(cè)
(3) 修改啟動(dòng)類添加服務(wù)注冊(cè)注解
@SpringBootApplication
//@EnableDiscoveryClient
//@EnableEurekaClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
從Spring Cloud Edgware版本開始, @EnableDiscoveryClient 或 @EnableEurekaClient 可 省略。只需加上相關(guān)依賴,并進(jìn)行相應(yīng)配置,即可將微服務(wù)注冊(cè)到服務(wù)發(fā)現(xiàn)組件上。
訂單服務(wù)注冊(cè)
和商品微服務(wù)一樣,只需要引入坐標(biāo)依賴,在工程的 application.yml 中添加Eureka Server的主機(jī)地址 即可
用戶服務(wù)注冊(cè)
和商品微服務(wù)一樣,只需要引入坐標(biāo)依賴,在工程的 application.yml 中添加Eureka Server的主機(jī)地址 即可
Eureka中的自我保護(hù)
微服務(wù)第一次注冊(cè)成功之后,每30秒會(huì)發(fā)送一次心跳將服務(wù)的實(shí)例信息注冊(cè)到注冊(cè)中心。通知 Eureka Server 該實(shí)例仍然存在。如果超過90秒沒有發(fā)送更新,則服務(wù)器將從注冊(cè)信息中將此服務(wù)移除。 Eureka Server在運(yùn)行期間,會(huì)統(tǒng)計(jì)心跳失敗的比例在15分鐘之內(nèi)是否低于85%,如果出現(xiàn)低于的情況 (在單機(jī)調(diào)試的時(shí)候很容易滿足,實(shí)際在生產(chǎn)環(huán)境上通常是由于網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致),Eureka Server會(huì) 將當(dāng)前的實(shí)例注冊(cè)信息保護(hù)起來,同時(shí)提示這個(gè)警告。保護(hù)模式主要用于一組客戶端和Eureka Server 之間存在網(wǎng)絡(luò)分區(qū)場(chǎng)景下的保護(hù)。一旦進(jìn)入保護(hù)模式,Eureka Server將會(huì)嘗試保護(hù)其服務(wù)注冊(cè)表中的信息,不再刪除服務(wù)注冊(cè)表中的數(shù)據(jù)(也就是不會(huì)注銷任何微服務(wù)) 驗(yàn)證完自我保護(hù)機(jī)制開啟后,并不會(huì)馬上呈現(xiàn)到web上,而是默認(rèn)需等待 5 分鐘(可以通過 eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分鐘后你會(huì)看到下面的提示信息:

如果關(guān)閉自我保護(hù)
通過設(shè)置 eureka.enableSelfPreservation=false 來關(guān)閉自我保護(hù)功能。
Eureka中的元數(shù)據(jù)
Eureka的元數(shù)據(jù)有兩種:標(biāo)準(zhǔn)元數(shù)據(jù)和自定義元數(shù)據(jù)。
- 標(biāo)準(zhǔn)元數(shù)據(jù):主機(jī)名、IP地址、端口號(hào)、狀態(tài)頁(yè)和健康檢查等信息,這些信息都會(huì)被發(fā)布在服務(wù)注 冊(cè)表中,用于服務(wù)之間的調(diào)用。
- 自定義元數(shù)據(jù):可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存儲(chǔ)格式。這 些元數(shù)據(jù)可以在遠(yuǎn)程客戶端中訪問。
在程序中可以使用DiscoveryClient 獲取指定微服務(wù)的所有元數(shù)據(jù)信息
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RestTemplateTest {
@Autowired
private DiscoveryClient discoveryClient;
@Test
public void test() {
//根據(jù)微服務(wù)名稱從注冊(cè)中心獲取相關(guān)的元數(shù)據(jù)信息
List<ServiceInstance> instances = discoveryClient.getInstances("shop?service-product");
for (ServiceInstance instance : instances) {
System.out.println(instance);
}
}
}