【四】Eureka服務註冊與發現
1、是什麽
Eureka是Netflix的一個子模塊,也是核心模塊之一。Eureka是一個基於 REST 服務,用於定位服勞,以實現雲端中間層服務發現和故障轉移。服務註冊與發現對於微服務架構來說是非常重要的,有了服務發現與註冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的註冊中心,比如 Zookeeper。
Netflix在設計Eureka是遵循的就是AP原則
分布式系統的CAP理論:理論首先把分布式系統中的三個特性進行了如下歸納:
● 一致性(C):在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)
● 可用性(A):在集群中一部分節點故障後,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)
● 分區容錯性(P):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味著發生了分區的情況,必須就當前操作在C和A之間做出選擇。
CAP原則只能三選二
最多只能同時較好的滿足兩個。
CAP 理論的核心足:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這止個需求,因此,根據 CAP 原理將 NOSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三大類:
CA 單點集群,滿足一致性,可川性的系統,通常在可擴展性上不太強大。
CP 滿足一致性,分區容忍必的系統,通常性能不是特別高。
AP 滿足可用統,通常可能對一致性要求低一些。
Eureka遵守AP 原則
zookeeper遵守CP原則
雙11、618只能用AP
2、原理講解
2.1、Rureka的基本架構
SpringCloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務註冊和發現(請對比 Zookeeper )。
Eureka 采用了C-S的設計架構。Eureka Server 作為服務註冊功能的服務器,它是服務註冊中心。
而系統中的其他微服務,使用 Eureka 的客戶端連接到Eureka Server並維持心路連接。這樣系統的維護人員就可以通過 Eureka Server來監控系統中各個微服務是否正常運行。SpringCloud 的一些其他模塊(比如Zuul)就可以通過 Eureka Server來發現系統中的其他微服務,並執行相關的邏輯。
Eureka包含兩個組件: Eureka Server 和 Eureka Client
Eureka Server 提供服務註冊服務:各個節點啟動後,會在Eureka Server中進行註冊,這樣 Eureka Server中的服務註冊表中將會存儲所有可用服務節點的信息,服務節點的信息可以在界面中直觀的看到。
EurekaClient 是一個Java客戶端,用於簡化Eureka Server的交互,客戶端同時也具備一個內置的、使用輪詢(round-robin)法的負載均衡器。在應用啟動後,將會向 Eureka Server 發送心跳(默認周期為 30 秒)。如果 Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,Eureka Server 將會從服務註冊表中把這個服務節點移除(默認 90 秒)。
2.2、三大角色
Eureka Server提供服務註冊和發現
Server Provider服務提供方將自身服務註冊到Eureka,從而使服務消費方能夠找到Server Provider服務提供方將自身服務註冊到Eureka,從而使服務消費方能夠找到
Server Consumer 服務消費方從Eureka獲取註冊服務列表,從而能夠消費服務Server Consumer 服務消費方從Eureka獲取註冊服務列表,從而能夠消費服務
2.3、現在搭建的工程情況
|- 父工程
|- 通用模塊api
|- 服務提供者Peovider - 8001
|- 服務消費者Consumer - 80
3、構建步驟
3.1、新建一個工程 microservicecloud-eureka-7001
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <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"> <parent> <artifactId>microservicecloud</artifactId> <groupId>cn.hfbin.springcloud</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <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: eureka7001.com #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://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
3.2 、編寫主啟動類 EurekaServer7001_App
@SpringBootApplication @EnableEurekaServer public class EurekaServer7001_App { public static void main(String[] args) { SpringApplication.run(EurekaServer7001_App.class, args); } }
3.3、測試
啟動應用程序,在瀏覽器輸入http://localhost:7001/ ,看到下面頁面說明
3.4、將microservicecloud-provider-dept-8001入駐到Euerka中
在 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>
application.yml加入
eureka: client: #客戶端註冊進eureka服務列表內 service-url: defaultZone: http://localhost:7001/eureka
在啟動類加入註解 @EnableEurekaClient
3.5、入駐到Euerka中測試
1、先啟動 Euerka-Server
2、再啟動 microservicecloud-provider-dept-8001
3、在瀏覽器中打開http://localhost:7001
當啟動時間久了Euerka界面會提示一串紅色內容
這個是Euerka的自我保護!!!不是報錯
3.6、actuator與註冊微服務信息完善
1)主機名稱:服務名稱修改
默認:
在microservicecloud-provider-dept-8001 YML中加入
eureka: instance: instance-id: microservicecloud-dept8001
修改後,查看頁面:
2)訪問信息有IP信息提示
在microservicecloud-provider-dept-8001 YML中加入
eureka: instance: prefer-ip-address: true #訪問路徑可以顯示IP地址
修改後,查看頁面:
3)微服務info內容詳情
默認:
POM中加入
<!-- actuator監控信息完善 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
父工程POM
<build> <finalName>microservicecloud</finalName> <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>
YML
info: app.name: hfbin-microservicecloud company.name: www.hfbin.cn build.artifactId: $project.artifactId$ build.version: $project.version$
3.7、 Eureka的自我保護
一句話:某時刻某一個微服務不可用了,Eureka不會立即清理,依舊會對微服務的信息進行保護。
導致原因:
3.8、microservicecloud-provider-dept-8001服務發現Discovery
1、對於註冊進Euerka裏面的微服務,可以通過服務發現來獲得該服務的信息。
2、在microservicecloud-provider-dept-8001的DeptController.java中加入下面內容:
@Autowired private DiscoveryClient client; @RequestMapping(value = "/dept/discovery", method = RequestMethod.GET) public Object discovery() { List<String> list = client.getServices(); 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; }
3、在啟動類中加入 @EnableDiscoveryClient 註解
4、集群配置
新建工程microservicecloud-eureka-7002、microservicecloud-eureka-7003
復制7001的POM到7002、7003下
將住主啟動類復制到7002、7003下
7001 YML
server: port: 7001 eureka: instance: hostname: eureka7001.com #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://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
7002 YML
server: port: 7002 eureka: instance: hostname: eureka7002.com #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://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
7003 YML
server: port: 7003 eureka: instance: hostname: eureka7003.com #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://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
microservicecloud-provider-dept-8001 的YML 要弄成集群版
eureka: client: #客戶端註冊進eureka服務列表內 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: microservicecloud-dept8001 prefer-ip-address: true #訪問路徑可以顯示IP地址
在自己的host中加入端口映射
127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.com
測試:
5、作為服務註冊中心,Eureka比zookeeper好在哪
【四】Eureka服務註冊與發現