JavaEE進階知識學習-----SpringCloud(三)Eureka服務註冊與發現

讀書遛狗遠方發表於2018-05-06

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就可以呼叫微服務暴露出來的介面

相關文章