euerka總結
- 2021 年 12 月 6 日
- 筆記
- SpringCloud
一、euerka的基本知識
1. 服務治理
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模塊來實現服務治理
在傳統的rpc遠程調用框架中,管理每個服務與服務之間依賴關係比較複雜,
管理比較複雜,所以需要使用服務治理,管理服務於服務之間依賴關係,
可以實現服務調用、負載均衡、容錯等,實現服務發現與註冊。
2. 服務註冊
Eureka採用了CS的設計架構,Eureka Server 作為服務註冊功能的服務器,它是服務註冊中心。
而系統中的其他微服務,使用 Eureka的客戶端連接到 Eureka Server並維持心跳連接。
這樣系統的維護人員就可以通過 Eureka Server 來監控系統中各個微服務是否正常運行。
在服務註冊與發現中,有一個註冊中心。當服務器啟動的時候,會把當前自己服務器的信息
比如:服務地址通訊地址等以別名方式註冊到註冊中心上。另一方(消費者|服務提供者),
以該別名的方式去註冊中心上獲取到實際的服務通訊地址,
然後再實現本地RPC調用RPC遠程調用框架核心設計思想:
在於註冊中心,因為使用註冊中心管理每個服務與服務之間的一個依賴關係(服務治理概念)。
在任何rpc遠程框架中,都會有一個註冊中心(存放服務地址相關信息(接口地址))
3. Eureka包含兩個組件:Eureka Server和Eureka Client
Eureka Server提供服務註冊服務
各個微服務節點通過配置啟動後,會在EurekaServer中進行註冊,
這樣EurekaServer中的服務註冊表中將會存儲所有可用服務節點的信息,
服務節點的信息可以在界面中直觀看到。EurekaClient通過註冊中心進行訪問
是一個Java客戶端,用於簡化Eureka Server的交互,客戶端同時也具備一個內置的、
使用輪詢(round-robin)負載算法的負載均衡器。
在應用啟動後,將會向Eureka Server發送心跳(默認周期為30秒)。
如果Eureka Server在多個心跳周期內沒有接收到某個節點的心跳,
EurekaServer將會從服務註冊表中把這個服務節點移除(默認90秒)
二、euerka的Server端以及單機集群的相關配置
-
啟動類
在啟動類上添加註解:
@EnableEurekaServer // 標明該服務是euerka的一個服務註冊中心 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) // 避免加載數據庫報錯
-
配置文件:使用yml配置文件
server: port: 7000 eureka: instance: hostname: eureka7000 # eureka服務端的實例名稱 client: register-with-eureka: false # false表示不向註冊中心註冊自己。 fetch-registry: false # false表示自己端就是註冊中心,我的職責就是維護服務實例,並不需要去檢索服務 service-url: # 集群配置,指向其他euerka defaultZone: //eureka7001:7001/eureka/ # 單機配置 # defaultZone: //eureka7000:7000/eureka/ # server: # 關閉自我保護機制,保證不可用服務被及時踢除 # enable-self-preservation: false # eviction-interval-timer-in-ms: 2000
三、euerka的client端以及單機集群的相關配置
-
啟動類
@EnableEurekaClient // 標明將該服務註冊到euerka註冊中心
-
配置文件:yml配置文件
server:
port: 8000 # 端口號
spring:
application:
name: payment # 服務名
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
url: jdbc:mysql://127.0.0.1:3306/spring-cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root # 用戶名
password: root # 密碼
eureka:
client:
# 表示是否將自己註冊進EurekaServer默認為true。
register-with-eureka: true
# 是否從EurekaServer抓取已有的註冊信息,默認為true。單節點無所謂,集群必須設置為true才能配合ribbon使用負載均衡
fetchRegistry: true
service-url:
# 單機版
# defaultZone: //localhost:7000/eureka
# 集群版
defaultZone: //eureka7000:7000/eureka,//eureka7001:7001/eureka
instance:
instance-id: payment8000 # euerka註冊中心中顯示的實例名
# 訪問路徑可以顯示IP地址
prefer-ip-address: true
#Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(默認是30秒)
#lease-renewal-interval-in-seconds: 1
#Eureka服務端在收到最後一次心跳後等待時間上限,單位為秒(默認是90秒),超時將剔除服務
#lease-expiration-duration-in-seconds: 2
mybatis-plus:
mapperLocations: classpath:com/kl/payment/mapper/xml/*.xml # 掃描xml文件
四、euerka的自我保護機制
當某些服務發送的心跳數沒有按照設定的時間間隔正常返回時,euerka會觸發自我保護機制。
開啟保護機制的情況下euerka不會立即將對應的服務下線,而是認為該服務可能出現了例如網絡延時
這樣的問題,只要在到達強制下線的時間才會將服務正式下線。
默認心跳時間:30秒一次
默認強制下線時間:90秒
-
配置文件中的具體配置
eureka: instance: # Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(默認是30秒) lease-renewal-interval-in-seconds: 1 # 可以根據具體場景進行修改 # Eureka服務端在收到最後一次心跳後等待時間上限,單位為秒(默認是90秒),超時將剔除服務 lease-expiration-duration-in-seconds: 10 # 可以根據具體場景進行修改
五、服務發現
對於註冊進eureka裏面的微服務,可以通過服務發現來獲得該服務的信息
-
主啟動類
@EnableDiscoveryClient // 服務發現
-
需要用的到controller、service直接注入
@Autowired private DiscoveryClient discoveryClient;
// 調用例子 @GetMapping(value = "/payment/discovery") public Object discovery(){ List<String> services = discoveryClient.getServices(); for (String element : services) { System.out.println(element); } List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE"); for (ServiceInstance element : instances) { System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t" + element.getUri()); } return this.discoveryClient; }
六、 actuator微服務信息完善
-
主機名稱:服務名稱修改、訪問信息有IP信息提示
eureka: instance: # 服務名稱 instance-id: payment8000 # 訪問路徑可以顯示IP地址 prefer-ip-address: true
-
服務健康檢查
檢查服務order
瀏覽器輸入 //IP:端口號/actuator/health,顯示 status : “UP” 說明服務正常