Eureka服務註冊與發現
Eureka三大角色
- Eureka Server提供服務註冊和發現
- Service Provider服務提供方將自身服務註冊到Eureka, 從而使服務消費者能夠找到
- Service Consumer服務消費方從Eureka獲取註冊服務列表,從而能夠消費
1.Eureka Server註冊
在上述專案的父工程中新建microservicecloud-eureka-7001,這個module是Eureka的服務中心
POM.xml檔案
<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>
<parent>
<groupId>com.luo.springcloud</groupId>
<artifactId>microservicecloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservicecloud-eureka-7001</artifactId>
<dependencies>
<!--eureka-server服務端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
複製程式碼
application.yml檔案
server:
port: 7001
eureka:
instance:
hostname: localhost #eureka服務端的例項名稱
client:
register-with-eureka: false #false表示不向註冊中心註冊自己。
fetch-registry: false #false表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
service-url:
#單機 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設定與Eureka Server互動的地址查詢服務和註冊服務都需要依賴這個地址(單機)。
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
複製程式碼
EurekaServer主啟動類
@SpringBootApplication
@EnableEurekaServer// EurekaServer伺服器端啟動類,接收其它微服務註冊進來
public class EurekaServer7001_App {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7001_App.class, args);
}
}
複製程式碼
測試EurekaServer
瀏覽器輸入http://localhost:7001/,看到Spring Eureka介面表示成功,這個訪問連結和程式中的application.yml配置吻合。
2.微服務註冊
將microservicecloud-provider-dept-8001微服務註冊到microservicecloud-eureka-7001中
修改microservicecloud-provider-dept-8001的POM.xml檔案
<!-- 將微服務provider側註冊進eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
複製程式碼
修改microservicecloud-provider-dept-8001的application.yml檔案
eureka:
client: #客戶端註冊進eureka服務列表內
service-url:
defaultZone: http://localhost:7001/eureka
複製程式碼
說明:defaultZone的地址對應Eureka Server服務註冊中心的application.yml中的defaultZone路徑
microservicecloud-provider-dept-8001主程式類使用註解
@SpringBootApplication
@EnableEurekaClient // 本服務啟動後會註冊到Eureka服務註冊中心
public class DeptProvider8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
複製程式碼
測試是否註冊成功
先啟動Eureka服務註冊中心microservicecloud-eureka-7001,啟動微服務microservicecloud-provider-dept-8001,開啟瀏覽器輸入http://localhost:7001/,Application下出現MICROSERVICECLOUD-DEPT微服務名稱,這個名稱來源於microservicecloud-provider-dept-8001中application.ym檔案中的配置屬性,如下
spring:
application:
name: microservicecloud-dept
複製程式碼
3.微服務常用設定
主機名稱和服務名稱修改
在Eureka中註冊的微服務的Status的名稱顯示localhost或者顯示電腦主機名,所以要修改服務的主機名稱,修改方法如下,修改microservicecloud-provider-dept-8001中application.yml檔案,修改後如下
instance:
instance-id: microservicecloud-dept8001
複製程式碼
訪問資訊有IP資訊提示
修改microservicecloud-provider-dept-8001中application.yml檔案,修改後如下
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #訪問路徑可以顯示IP地址
複製程式碼
微服務info內容詳細資訊
增加microservicecloud-provider-dept-8001中POM.xml檔案
<!-- actuator監控資訊完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複製程式碼
總的父工程microservicecloud修改pom.xml新增構建build資訊
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<!-- 說明在src/main/resources目錄下的配置檔案 -->
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<!-- 表示以$開始和以$結束的表示方法 -->
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
複製程式碼
修改microservicecloud-provider-dept-8001中application.yml檔案,修改後如下
info:
app.name: luokangyuan-microservicecloud
company.name: www.luokangyuan.com
build.artifactId: $project.artifactId$
build.version: $project.version$
複製程式碼
4.Eureka的自我保護機制
導致的原因
預設情況下,如果EurekaServer在一定的時間內沒有接收到某一個微服務例項的心跳,EurekaServer將會登出該例項,頁面就會看見一串紅色提示,但是當網路分割槽發生故障時,微服務與EurekaServer無法進行正常的通訊,此時本不應該登出這個微服務例項,這個時候,Eureka的自我保護機制就可以解決這個問題,當EurekaServer節點在短時間內丟失過多的客戶端時(可能發生了網路故障),那麼這個節點就會進入自我保護模式,一旦進入該模式,EurekaServer就會保護服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務),當網路故障恢復後,該EurekaServer節點就會自動退出自我保護模式。
總結
在自我保護模式下,EurekaServer會保護服務登錄檔中的資訊,不再登出任何服務例項,當它收到的心跳數重新到閾值以上,該EurekaServer就會自動退出自我保護模式,也就是寧可保留錯誤的服務註冊資訊,也不盲目的刪除任何可能健康的服務例項。
5.服務發現
對於註冊近Eureka裡面的微服務,可以通過服務發現來獲取該服務的資訊
修改microservicecloud-provider-dept-8001的DeptController
@Autowired
private DiscoveryClient client;
@RequestMapping(value = "/dept/discovery", method = RequestMethod.GET)
public Object discovery(){
List<String> list = client.getServices();//得到Eureka中所有的微服務
System.out.println("**********" + list);
List<ServiceInstance> srvList = client.getInstances("MICROSERVICECLOUD-DEPT");
for (ServiceInstance element : srvList) {
System.out.println(element.getServiceId() + "\t"
+ element.getHost() + "\t" + element.getPort() + "\t"
+ element.getUri());
}
return this.client;
}
複製程式碼
microservicecloud-provider-dept-8001主啟動類新增註解
@SpringBootApplication
@EnableEurekaClient // 本服務啟動後會註冊到Eureka服務註冊中心
@EnableDiscoveryClient // 服務發現
public class DeptProvider8001_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_App.class, args);
}
}
複製程式碼
自測試
啟動服務註冊中心microservicecloud-eureka-7001,再啟動microservicecloud-provider-dept-8001,訪問http://localhost:8001/dept/discovery可以得到這個服務的info資訊,/dept/discovery介面就是microservicecloud-provider-dept-8001這個服務暴露給外部訪問的介面。使用http://localhost:8001/dept/discovery測試,就是自己測試能不能使用
外部訪服務暴露的介面
microservicecloud-consumer-dept-80呼叫microservicecloud-provider-dept-8001服務暴露在外的介面,修改microservicecloud-consumer-dept-80中的DeptController_Consumer,如下
// 測試@EnableDiscoveryClient,消費端可以呼叫服務發現
@RequestMapping(value = "/consumer/dept/discovery")
public Object discovery(){
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/discovery", Object.class);
}
複製程式碼
消費者訪問介面測試
啟動microservicecloud-consumer-dept-80訪問http://localhost/consumer/dept/discovery得到8001微服務資訊
總結
- microservicecloud-provider-dept-8001註冊到EurekaServer服務中心
- microservicecloud-provider-dept-8001將Controller中的某一個方法暴露出去(提供服務發現)
- microservicecloud-consumer-dept-80中的Controller就可以呼叫微服務暴露出來的介面