天天看點

spring cloud-eurake服務注冊與發現(二)

目錄

Eurake是什麼

Eurake的基本架構

三大角色

springcloud-eureka-7001    eureka服務注冊中心 Module

修改springcloud-model-provider-dept-8001

actuator與注冊微服務資訊完善

Eureka的自我保護

Eureka服務發現

Eureka叢集

Eurake是什麼

Eureka是Netflix的一個子子產品,也是核心子產品之一。Eureka是一個基于REST的服務,用于定位服務,以實作雲端中間層服務發現和故障轉移。

服務注冊與發現對于微服務架構來說是非常重要的,有了服務發現與注冊,隻需要使用服務的辨別符,就可以通路到服務,而不需要修改服務調用的配置檔案了。

功能類似于dubbo的注冊中心,比如Zookeeper。

Eurake的基本架構

Spring Cloud 封裝了 Netflix 公司開發的 Eureka 子產品來實作服務注冊和發現(請對比Zookeeper)。

Eureka 采用了 C-S 的設計架構。Eureka Server 作為服務注冊功能的伺服器,它是服務注冊中心。

而系統中的其他微服務,使用 Eureka 的用戶端連接配接到 Eureka Server并維持心跳連接配接。這樣系統的維護人員就可以通過

Eureka Server 來監控系統中各個微服務是否正常運作。SpringCloud 的一些其他子產品(比如Zuul)就可以通過

Eureka Server 來發現系統中的其他微服務,并執行相關的邏輯。

請注意和Dubbo的架構對比

Eureka包含兩個元件:Eureka Server和Eureka Client

Eureka Server提供服務注冊服務

各個節點啟動後,會在EurekaServer中進行注冊,這樣EurekaServer中的服務系統資料庫中将會存儲所有可用服務節點的資訊,服務節點的資訊可以在界面中直覺的看到

EurekaClient是一個Java用戶端,用于簡化Eureka Server的互動,用戶端同時也具備一個内置的、使用輪詢(round-robin)負載算法的負載均衡器。

在應用啟動後,将會向Eureka Server發送心跳(預設周期為30秒)。如果Eureka Server在多個心跳周期内沒有接收到某個節點的心跳,

EurekaServer将會從服務系統資料庫中把這個服務節點移除(預設90秒)

三大角色

Eureka Server 提供服務注冊和發現

Service Provider服務提供方将自身服務注冊到Eureka,進而使服務消費方能夠找到

Service Consumer服務消費方從Eureka擷取注冊服務清單,進而能夠消費服務

springcloud-eureka-7001    eureka服務注冊中心 Module

spring cloud-eurake服務注冊與發現(二)
<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.jiangjy.springcloud</groupId>
    <artifactId>springcloud-model</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>springcloud-model-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>
           
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互動的位址查詢服務和注冊服務都需要依賴這個位址。   
           
package com.jiangjy.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer  //EurekaServer伺服器端啟動類,接受其它微服務注冊進來
public class EurekaServer7001_APP {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServer7001_APP.class, args);
	}
}

           

修改springcloud-model-provider-dept-8001

spring cloud-eurake服務注冊與發現(二)

約定

<!-- Euraka用戶端  将微服務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>
           

配置

eureka:
  client:   #用戶端注冊進eureka服務清單内
    service-url:
      defalutZone: http://localhost:7001/eureka/
           

主啟動類添加@EnableEurekaClient注解

spring cloud-eurake服務注冊與發現(二)
spring cloud-eurake服務注冊與發現(二)

注意:路徑不要寫錯了

測試

spring cloud-eurake服務注冊與發現(二)
spring cloud-eurake服務注冊與發現(二)
spring cloud-eurake服務注冊與發現(二)

主機名稱:服務名稱修改:

spring cloud-eurake服務注冊與發現(二)

actuator與注冊微服務資訊完善

超連結點選服務報告ErrorPage

spring cloud-eurake服務注冊與發現(二)

先有jar支援  在 配置  在編碼

操作: 1.在springcloud-model-provider-dept-8001中pom.xml

<!-- actuator監控資訊完善 -->
  		<dependency>
  			<groupId>org.springframework.boot</groupId>
  			<artifactId>spring-boot-starter-actuator</artifactId>
  		</dependency>
           

2.在總的父工程microservicecloud修改pom.xml添加建構build資訊

<build>
  	<!-- 所有資源的目錄在src/main/resources下面 -->
  	<resources>
			<resource>
				<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>
           

application.yml   在添加了jar包支援的情況下

info:
  app.name: jiangjy-springcloud
  company.name: www.jiangjy.com
  build.artifactId: $project.artifactId$ 
  build.version: $project.version$
           

展示info資訊

spring cloud-eurake服務注冊與發現(二)

Eureka的自我保護

什麼是自我保護模式? 

預設情況下,如果EurekaServer在一定時間内沒有接收到某個微服務執行個體的心跳,EurekaServer将會登出該執行個體(預設90秒)。

但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。

Eureka通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間内丢失過多用戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。

一旦進入該模式,EurekaServer就會保護服務系統資料庫中的資訊,不再删除服務系統資料庫中的資料(也就是不會登出任何微服務)。

當網絡故障恢複後,該Eureka Server節點會自動退出自我保護模式。

在自我保護模式中,Eureka Server會保護服務系統資料庫中的資訊,不再登出任何服務執行個體。

當它收到的心跳數重新恢複到門檻值以上時,該Eureka Server節點就會自動退出自我保護模式。

它的設計哲學就是甯可保留錯誤的服務注冊資訊,也不盲目登出任何可能健康的服務執行個體。一句話講解:好死不如賴活着

綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是甯可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),

也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式。

Eureka服務發現

對外暴露方法了解本服務

第一步:需要在服務中提供描述自己的方法

spring cloud-eurake服務注冊與發現(二)
@Autowired
	private DiscoveryClient client;
	
	@RequestMapping(value="dept/discovery",method = RequestMethod.GET)
	public Object discovery() {
		List<String> services = client.getServices();
		System.out.println("*********" + services);
		for (String service : services) {
			System.out.println("service: " + service);	
		}
		List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-MODEL-DEPT");
		for (ServiceInstance serviceInstance : instances) {
			System.out.println(serviceInstance.getServiceId() + "\t" + serviceInstance.getHost() 
			+ "\t" + serviceInstance.getPort() +"\t" + serviceInstance.getUri());
		}
		
		return this.client;
	}
           

主啟動類添加注解@EnableDiscoveryClient //服務發現

spring cloud-eurake服務注冊與發現(二)

自測:先啟動EurekaServer,再啟動8001主啟動類,等一會讓他入住EurekaServer服務

http://localhost:8001/dept/discovery

spring cloud-eurake服務注冊與發現(二)

完成後修改80消費者

spring cloud-eurake服務注冊與發現(二)

@RequestMapping(value = "consumer/dept/discovery")
	public Object discovery() {
		return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
	}
           

運作結果:

spring cloud-eurake服務注冊與發現(二)

Eureka叢集

建立springcloud-model-eureka-7002/ springcloud-model-eureka-7003

按照7001模闆粘體pom.xml到7002/7003

修改7002/7003得主啟動類

修改映射配置

       找到C:\Windows\System32\drivers\etc路徑下的hosts檔案

spring cloud-eurake服務注冊與發現(二)

一台是沒有問題,多台需要做域名映射

127.0.0.1       eureka7001.com

127.0.0.1       eureka7002.com

127.0.0.1       eureka7003.com

3台eureka伺服器得application.yml配置/7001/7002/7003

server:
  port: 7001
  
eureka:
  instance:
    #hostname: localhost  #eureka服務端的執行個體名稱
    hostname: eureka7001.com  #eureka服務端的執行個體名稱-在hosts中做得配置
  client:
    register-with-eureka: false    #false表示不向注冊中心注冊自己。   
    fetch-registry: false   #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
    service-url:
      #單機版 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/  #多台伺服器配置
server:
  port: 7002
  
eureka:
  instance:
    #hostname: localhost  #eureka服務端的執行個體名稱
    hostname: eureka7002.com  #eureka服務端的執行個體名稱-在hosts中做得配置
  client:
    register-with-eureka: false    #false表示不向注冊中心注冊自己。   
    fetch-registry: false   #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
    service-url:
      #單機版 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/  #多台伺服器配置
server:
  port: 7003
  
eureka:
  instance:
    #hostname: localhost  #eureka服務端的執行個體名稱
    hostname: eureka7003.com  #eureka服務端的執行個體名稱-在hosts中做得配置
  client:
    register-with-eureka: false    #false表示不向注冊中心注冊自己。   
    fetch-registry: false   #false表示自己端就是注冊中心,我的職責就是維護服務執行個體,并不需要去檢索服務
    service-url:
      #單機版 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #設定與Eureka Server互動的位址查詢服務和注冊服務都需要依賴這個位址。
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/  #多台伺服器配置
           

springcloud-model-provider-dept-8001微服務釋出到上面3台eureka叢集配置中

單機版得時候隻需要注冊到一台,現在多台伺服器注冊,需要修改

#單機版      defaultZone: http://localhost:7001/eureka/
        defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

           

測試:啟動eureka服務7001/7002/7003

再啟動8001

此時:通路位址改變了:應該是

eureka7001.com:7001

eureka7002.com:7002

eureka7003.com:7003

spring cloud-eurake服務注冊與發現(二)
spring cloud-eurake服務注冊與發現(二)
spring cloud-eurake服務注冊與發現(二)

測試成功完成;

繼續閱讀