目錄
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
<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
約定
<!-- 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注解
注意:路徑不要寫錯了
測試
主機名稱:服務名稱修改:
actuator與注冊微服務資訊完善
超連結點選服務報告ErrorPage
先有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資訊
Eureka的自我保護
什麼是自我保護模式?
預設情況下,如果EurekaServer在一定時間内沒有接收到某個微服務執行個體的心跳,EurekaServer将會登出該執行個體(預設90秒)。
但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。
Eureka通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間内丢失過多用戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。
一旦進入該模式,EurekaServer就會保護服務系統資料庫中的資訊,不再删除服務系統資料庫中的資料(也就是不會登出任何微服務)。
當網絡故障恢複後,該Eureka Server節點會自動退出自我保護模式。
在自我保護模式中,Eureka Server會保護服務系統資料庫中的資訊,不再登出任何服務執行個體。
當它收到的心跳數重新恢複到門檻值以上時,該Eureka Server節點就會自動退出自我保護模式。
它的設計哲學就是甯可保留錯誤的服務注冊資訊,也不盲目登出任何可能健康的服務執行個體。一句話講解:好死不如賴活着
綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是甯可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),
也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式。
Eureka服務發現
對外暴露方法了解本服務
第一步:需要在服務中提供描述自己的方法
@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 //服務發現
自測:先啟動EurekaServer,再啟動8001主啟動類,等一會讓他入住EurekaServer服務
http://localhost:8001/dept/discovery
完成後修改80消費者
@RequestMapping(value = "consumer/dept/discovery")
public Object discovery() {
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/discovery", Object.class);
}
運作結果:
Eureka叢集
建立springcloud-model-eureka-7002/ springcloud-model-eureka-7003
按照7001模闆粘體pom.xml到7002/7003
修改7002/7003得主啟動類
修改映射配置
找到C:\Windows\System32\drivers\etc路徑下的hosts檔案
一台是沒有問題,多台需要做域名映射
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
測試成功完成;