??各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛
💡spring cloud知識點速覽
- 🌕 Eureka
- 🌓 什么是服務治理?為什么需要服務治理?
- 🌓 什么是服務注冊與發現?
- 🌓 Eureka的兩大組件
- 🌕 Eureka的使用
- 🌓 Eureka服務端server的創建
- 🌓 Eureka客戶端client的創建
- 🌕 集群搭建
- 🌓 Eureka服務端的集群搭建
- 🌓 Eureka客戶端的集群搭建
- 🌓 微服務模塊的相關配置
- 🌕 服務發現
- 🌕 自我保護機制
- 🌓 什么是自我保護機制
- 🌓 如何禁用自我保護機制
🌕 Eureka
🌓 什么是服務治理?為什么需要服務治理?
??服務治理是主要針對分布式服務框架的微服務,處理服務調用之間的關系、服務發布和發現、故障監控與處理,服務的參數配置、服務降級和熔斷、服務使用率監控等。
需要服務治理的原因:
- 過多的服務 URL 配置困難
- 負載均衡分配節點壓力過大的情況下,需要部署集群
- 服務依賴混亂,啟動順序不清晰
- 過多服務,導致性能指標分析難度較大,需要監控
- 故障定位與排查難度較大
🌓 什么是服務注冊與發現?
??服務注冊主要針對服務提供者,服務啟動后需要將本身以別名的方式注冊到注冊中心上;而服務發現主要是針對消費者(服務使用者),它在調用服務的時候需要通過別名去注冊中心獲取到相應的服務,然后再實現本地RPC調用遠程RPC的功能。
🌓 Eureka的兩大組件
??Eureka Server: 提供注冊服務,各節點啟動時,會在EurekaServer中進行注冊,各服務的節點信息會儲存在EurekaServer中的服務注冊表中。
??Eureka Client: 其本質是一個Java客戶端,用于簡化Eureka Server的交互,客戶端同時也具備一個內置的使用負載算法的負載均衡器在啟動應用后將會向Eureka Server發送心跳(默認周期30s),如果EurekaServer在多個心跳周期內沒有接收到某節點的心跳,將會把該節點從服務注冊表上移除(默認周期90s)
🌕 Eureka的使用
🌓 Eureka服務端server的創建
??首先是創建一個子模塊作為eureka的服務器模塊,主要與其他的子模塊有以下三處不同:
一、導入eureka服務端的依賴
<!-- 服務注冊中心的服務端 eureka-server -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
二、配置文件配置eureka相關
# eureka的單機版配置
eureka:instance:hostname: localhost #eureka服務端的實例名字client:register-with-eureka: false #表示不向注冊中心注冊自己fetch-registry: false #表示自己就是注冊中心,職責是維護服務實例,并不需要去檢索服務service-url:#設置與eureka server交互的地址查詢服務和注冊服務都需要依賴這個地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
三、主程序類上使用注解開啟服務器
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {public static void main(String[] args) {SpringApplication.run(EurekaMain7001.class, args);}
}
🌓 Eureka客戶端client的創建
??之前創建的支付子模塊8001就可以標記為Eureka的客戶端,我們需要做的和Eureka服務端的三步一樣:
一、導入eureka客戶端的依賴
<!--Eureka客戶端依賴-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
二、配置文件配置eureka相關
eureka:client:register-with-eureka: true #是否向注冊中心注冊自己fetchRegistry: true #是否從注冊中心抓取已有的注冊信息 默認trueservice-url:defaultZone: http://localhost:7001/eureka #服務端的地址
三、主程序類使用注解開啟客戶端
@SpringBootApplication
@EnableEurekaClient
public class Payment8001Application {public static void main(String[] args) {SpringApplication.run(Payment8001Application.class, args);}
}
??紅框顯示當前名稱為CLOUD-PAYMENT-SERVICE的服務狀態為UP,也就是說這個模塊已經被注冊進了eureka服務
??目前為止,我們的eureka服務端上就只有一個支付模塊作為服務的提供者注冊進eureka服務器,并沒有服務的調用者,于是乎我們可以將80端口的消費者模塊通過以上三步,將其作為eureka客戶端注冊進eureka服務器,讓其實現服務的調用
🌕 集群搭建
🌓 Eureka服務端的集群搭建
??想必集群的好處這里就不需要再進行贅述了,單體的服務器一旦出現故障整個項目就搞崩了,如果是集群就不一樣了,一個故障其他頂上,服務之間可以實現互相注冊相互守望
??現在我們就創建一個新的服務端子模塊命名7002,作為集群中的另一個模塊使用。那么,如何實現互相注冊相互守望呢?答案就是:分別在配置文件中配置,使集群中的服務都能互相發現,其中最重要的就是defaultZone字段的對應值
server:port: 7001# eureka的單機版配置
eureka:instance:hostname: eureka7001.com #eureka服務端的實例名字,這里以localhost代替client:register-with-eureka: false #表示不向注冊中心注冊自己fetch-registry: false #表示自己就是注冊中心,職責是維護服務實例,并不需要去檢索服務service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 單機版,指向的是自己# 集群版,指向集群中的其他服務defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
server:port: 7002# eureka的單機版配置
eureka:instance:hostname: eureka7002.com #eureka服務端的實例名字,這里以localhost代替client:register-with-eureka: false #表示不向注冊中心注冊自己fetch-registry: false #表示自己就是注冊中心,職責是維護服務實例,并不需要去檢索服務service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 單機版,指向的是自己# 集群版,指向集群中的其他服務defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
server:port: 7003# eureka的單機版配置
eureka:instance:hostname: localhost # eureka服務端的實例名字,這里以localhost代替client:register-with-eureka: false #表示不向注冊中心注冊自己fetch-registry: false #表示自己就是注冊中心,職責是維護服務實例,并不需要去檢索服務service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 單機版,指向的是自己# 集群版,指向集群中的其他服務defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
??集群搭建完畢之后,服務也要向集群中的所有模塊進行注冊,那么就需要使用配置文件了,這里以服務調用者80端口為例
server:port: 80spring:application:name: cloud-order-serviceeureka:client:register-with-eureka: true #是否向注冊中心注冊自己fetchRegistry: true #是否從注冊中心抓取已有的注冊信息 默認trueservice-url:
# defaultZone: http://localhost:7001/eureka #服務端的地址#服務端的地址,服務端為集群版,向所有的模塊都注冊defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka
🌓 Eureka客戶端的集群搭建
??從8001模塊copy一個為8002,作為客戶端集群的另一個模塊,同樣使用配置文件,將其也注冊進服務端集群。此時就可以使用服務調用者80進行調用了,但是80的controller是直接寫死的域名和端口,于是需要將域名端口改為微服務的名稱,然后在服務調用者80模塊開啟負載均衡讓請求合理的分配到服務集群的每一個模塊
將原先的指定域名+端口改為指定服務
配置中開啟負載均衡
這樣集群就部署好了,可以實現服務調用對8001和8002的輪詢
🌓 微服務模塊的相關配置
配置服務的名稱
eureka:instance:instance-id: payment8001
訪問路徑顯示IP地址
eureka:instance:prefer-ip-address: true
🌕 服務發現
??所謂的服務發現就是對于已經注冊進eureka里的微服務,可以通過這個方式來獲得該服務的相關信息,實現服務發現功能分三步走:
一、對象注入
@Resource
private DiscoveryClient discoveryClient;
二、調用api獲取服務信息
@GetMapping(value = "/discovery")
public Object discovery() {List<String> services = discoveryClient.getServices();for (String service : services) {log.info("***********service: " + service);}List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");for (ServiceInstance instance : instances) {log.info(instance.getServiceId() + "\t"+ instance.getHost() + "\t"+ instance.getPort() + "\t"+ instance.getUri());}return this.discoveryClient;
}
三、主程序入口注解開啟發現功能
@EnableDiscoveryClient
這樣即可打印服務的相關信息
🌕 自我保護機制
🌓 什么是自我保護機制
??EurekaServer會檢查最近15分鐘內所有EurekaClient正常心跳占比,如果低于85%就會觸發自我保護機制,此時Eureka暫時把這些失效的服務保護起來,不會立即將其剔除。Eureka在啟動完成后,每隔60秒會檢查一次服務健康狀態,如果這些暫時失效的服務過一段時間后(默認90秒)還是沒有恢復,就會把這些服務剔除。反之這個服務就不會因為網絡的延時、卡頓、擁擠等問題而被錯誤刪除。
??總而言之,自我保護機制就是說某一時刻微服務不可用時,Eureka不會立即將其剔除,而是在一段時間內等待其正常發送心跳。這屬于CAP原則的AP分支,主要保證了可用性和分區容錯性
🌓 如何禁用自我保護機制
??服務端使用配置文件關閉eureka的自我保護機制
eureka:server:# 關閉自我保護機制,保證不可用服務被及時踢除enable-self-preservation: false# eviction-interval-timer-in-ms: 2000
??客戶端使用配置文件設置心跳相關配置
eureka:instance:# Eureka客戶端向服務端發送心跳的時間間隔,單位為秒(默認是30秒)lease-renewal-interval-in-seconds: 1# Eureka服務端在收到最后一次心跳后等待時間上限,單位為秒(默認是90秒),超時將剔除服務lease-expiration-duration-in-seconds: 2