[TOC]
## **1. 為什么要用注冊中心**
1. 微服務數量眾多,要進行遠程調用就需要知道服務端的ip地址和端口,注冊中心幫助我們管理這些服務 的ip和端口。
2. 微服務會實時上報自己的狀態,注冊中心統一管理這些微服務的狀態,將存在問題的服務踢出服務列 表,客戶端獲取到可用的服務進行調用。
## 2. **Eureka簡介**
1. Spring Cloud Eureka 是對Netflix公司的Eureka的二次封裝,它實現了服務治理的功能。
2. Spring Cloud Eureka 提供 **Eureka Server 服務端**與 **Eureka Client 客戶端** ,服務端即是Eureka服務注冊中心,客戶端完成微服務向**Eureka服務的注冊與發現。**
下圖顯示了 Eureka Server 與 Eureka Client 的關系

如圖所示,
1. 對于web應用程序來說,server和client都是Eureka client。
2. **web應用服務端**向Eureka server注冊自己的服務信息(ip和端口號)
3. **web應用客戶端**向Eureka server查詢服務端的信息,然后進行訪問
## **3. 搭建單機版 Eureka Server 服務注冊中心**
### 3.1 創建Eureka 服務端工程
1. ide創建Eureka server工程,maven模塊




**2. 修改pom,導入Eureka server依賴啟動器**
~~~
...
<dependencies>
<!--導入Eureka 服務端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
~~~
**3. 配置 application.yml 文件**
~~~
server:
port: 6001 # 服務端口
eureka:
instance:
hostname: eureka6001.com # eureka服務端的實例名稱
client:
registerWithEureka: false # 服務注冊,false表示不將自已注冊到Eureka服務中
fetchRegistry: false # 服務發現,false表示自己不從Eureka服務中獲取注冊信息
serviceUrl: # Eureka客戶端與Eureka服務端的交互地址,集群版配置對方的地址,單機版配置自己(如果不配置則默認本機8761端口)
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false # 禁用自我保護機制
~~~
**4. 創建啟動類**
在啟動類上用`@EnableEurekaServer`注解標識Eureka注冊中心
~~~
package com.tuna.springcloud.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer //標識一個Eureka Server 服務注冊中心
@SpringBootApplication
public class EurekaServer_6001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer_6001.class, args);
}
}
~~~
### 3.2 啟動Eureka工程并測試
[http://localhost:6001/](http://localhost:6001/) 或者[http://eureka6001.com:6001/](http://eureka6001.com:6001/)

上圖還沒有Eureka客戶端進行注冊
## **4. 服務注冊到 Eureka Server 服務注冊中心**
**將web應用程序服務端注冊到Eureka Server**

**1. 修改web服務端pom,引入eureka-client 啟動器**
```
<!-- 導入Eureka客戶端的依賴,將 微服務提供者 注冊進 Eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
```
**2. 配置 application.yml 文件,向Eureka server注冊自己的服務信息**
~~~
eureka:
client:
registerWithEureka: true # 服務注冊開關
fetchRegistry: false #服務發現開關
serviceUrl: # 注冊到哪一個Eureka Server服務注冊中心,多個中間用逗號分隔
defaultZone: http://localhost:6001/eureka
instance:
instanceId: ${spring.application.name}:${server.port} # 等價于microservice-product:8001
# prefer-ip-address: true #訪問路徑就會顯示成IP地址
~~~
**3. 啟動類上加`@EnableEurekaClient` 注解,本服務啟動后會自動注冊進Eureka中心**
~~~
package com.tuna.springcloud.server;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@MapperScan("com.tuna.springcloud.server.mapper")
@SpringBootApplication
public class ProductProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(ProductProvider_8001.class, args);
}
}
~~~
**4. 啟動服務**
有圖看到,web server已經注冊到Eureka

### 解決訪問路徑顯示ip
鼠標放在Eureka client上邊時,不顯示ip

客戶端yml配置prefer-ip-address: true
~~~
prefer-ip-address: true #客戶端yml訪問路徑就會顯示成IP地址
~~~

再次訪問

## 5. Eureka Server自我保護機制
### **5.1 自我保護模式介紹**
1. 當Eureka Server 在一定時間內(默認90秒)沒有接收到某個微服務的心跳,Eureka Server會從服務列表將此服務實例注銷。但是如果出現網絡異常情況(微服務本身是正常的),微服務與Eureka Server之間無法正常通信!
**以上行為可能變得非常危險了——因為微服務本身其實是正常的,此時本不應該注銷這個微服務。**
2. Eureka Server有一種 **“自我保護模式”** 來解決這個問題——**當Eureka Server在短時間內丟失過多客戶端時(可能發 生了網絡故障),此時Eureka Server會進入自保護模式,一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server會自動退出自我保護模式。**
3. ***自我保護模式是一種應對網絡異常的安全保護措施。*** 它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何健康的微服務。使用自我保護模式,可以讓Eureka集群更加的健壯、穩定。
### 5.2 開啟自我保護機制
~~~
server:
enable-self-preservation: true # 禁用自我保護機制
~~~
## **6. 集群版 Eureka Server**
### 6.1 集群模式簡介
1. 為了保證Eureka的高可用性,spring提供了Eureka server的集群模式。
2. 集群模式下各個Eureka server之間互相注冊。
3. 微服務需要連接兩臺Eureka Server注冊,當其中一臺Eureka死掉也不會影響服務的注冊與發現。
4. 微服務會定時向Eureka Server發送心跳,報告自己的狀態。
5. 微服務從注冊中心獲取服務地址以RESTful方式發起遠程調用。

### 6.2 集群模式搭建
**1. 按照單機版Eureka server,再次新建一個Eureka02**

**2. 參考Eureka單機版修改pom,啟動類**
**3. 修改yml文件**
修改配置
6002端口的指向6001端口,**多個用逗號分隔,**即要向集群中的其他Eureka 節點注冊自己的信息
~~~
serviceUrl:
defaultZone: http://eureka6001.com:6001/eureka/ # 集群版,指向其他Eureka server節點
~~~
完整
~~~
server:
port: 6002 # 服務端口
eureka:
instance:
hostname: eureka6002.com # eureka服務端的實例名稱
client:
registerWithEureka: false # 服務注冊,false表示不將自已注冊到Eureka服務中
fetchRegistry: false # 服務發現,false表示自己不從Eureka服務中獲取注冊信息
serviceUrl:
defaultZone: http://eureka6001.com:6001/eureka/ # 集群版,指向其他Eureka server節點
# Eureka客戶端與Eureka服務端的交互地址,集群版配置對方的地址,單機版配置自己(如果不配置則默認本機8761端口)
server:
enable-self-preservation: true # 禁用自我保護機制
~~~
**4. 配置域名,區分兩個Eureka server**
`C:\Windows\System32\drivers\etc\hosts `文件
```
127.0.0.1 eureka6001.com
127.0.0.1 eureka6002.com
```


## 7. Eureka 集群模式 client如何配置
yml文件中,將所有節點連接加入即可
```
serviceUrl: # 注冊到哪一個Eureka Server服務注冊中心,多個中間用逗號分隔
#defaultZone: http://localhost:6001/eureka
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
```
完整
```
eureka:
client:
registerWithEureka: true # 服務注冊開關
fetchRegistry: true # 服務發現開關
serviceUrl: # 注冊到哪一個Eureka Server服務注冊中心,多個中間用逗號分隔
#defaultZone: http://localhost:6001/eureka
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
instance:
instanceId: ${spring.application.name}:${server.port} # 等價于microservice-product:8001
prefer-ip-address: true #訪問路徑就會顯示成IP地址
```
應用在兩個集群節點都進行了注冊


- springcloud
- springcloud的作用
- springboot服務提供者和消費者
- Eureka
- ribbon
- Feign
- feign在微服務中的使用
- feign充當http請求工具
- Hystrix 熔斷器
- Zuul 路由網關
- Spring Cloud Config 分布式配置中心
- config介紹與配置
- Spring Cloud Config 配置實戰
- Spring Cloud Bus
- gateway
- 概念講解
- 實例
- GateWay
- 統一日志追蹤
- 分布式鎖
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安裝
- 1.2 特性
- 1.3 實例
- 1. 整合nacos服務發現
- 2. 整合nacos配置功能
- 1.4 生產部署方案
- 環境隔離
- 原理講解
- 1. 服務發現
- 2. sentinel
- 3. Seata事務
- CAP理論
- 3.1 安裝
- 分布式協議
- 4.熔斷和降級
- springcloud與alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服務框架付費
- SkyWalking
- 介紹與相關資料
- APM系統簡單對比(zipkin,pinpoint和skywalking)
- server安裝部署
- agent安裝
- 日志清理
- 統一日志中心
- docker安裝部署
- 安裝部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定時清理數據
- index Lifecycle Management
- 沒數據排查思路
- ELK自身組件監控
- 多租戶方案
- 慢查詢sql
- 日志審計
- 開發
- 登錄認證
- 鏈路追蹤
- elk
- Filebeat
- Filebeat基礎
- Filebeat安裝部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安裝
- rpm安裝
- docker安裝Logstash
- grok調試
- Grok語法調試
- Grok常用表達式
- 配置中常見判斷
- filter提取器
- elasticsearch
- 安裝
- rpm安裝
- docker安裝es
- 使用
- 概念
- 基礎
- 中文分詞
- 統計
- 排序
- 倒排與正排索引
- 自定義dynamic
- 練習
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- kibana
- 安裝
- docker安裝
- rpm安裝
- 整合
- 收集日志
- 慢sql
- 日志審計s
- 云
- 分布式架構
- 分布式鎖
- Redis實現
- redisson
- 熔斷和降級