【Spring Cloud】之 Eureka
Eureka 簡介
服務治理
Spring Cloud 封裝了 Netflix 公司開發的 Eureka 模組來實現服務治理。
在傳統的 rpc 遠端呼叫框架中,管理每個服務與服務之間依賴關係比較複雜,管理比較複雜,所以需要使用服務治理,管理服務與服務之間的依賴關係,可以實現服務呼叫、負載均衡、容錯等,實現服務發現與註冊。
服務註冊與發現
Eureka 採用了 CS 的設計架構,Eureka Server 作為服務註冊功能的伺服器,它是服務註冊中心。而系統中的其他微服務,使用 Eureka Client 客戶端連線到 Eureka Server 並維持心跳連線。這樣系統的維護人員就可以通過 Eureka Server 來監控系統各個微服務是否執行正常。
在服務註冊與發現中,有一個註冊中心,當服務啟動時會把自己當前的服務資訊,比如服務通訊地址等以別名的方式註冊到註冊中心去,而另一個服務則可以以該別名的方式去註冊中心上獲取實際的服務通訊地址,然後實現本地 RPC 呼叫遠端 RPC。遠端呼叫框架的的核心設計思想在於註冊中心,因為註冊中心管理每個服務與服務之間的依賴關係。
Eureka 兩大元件
Eureka 包含兩個元件:Eureka Server
和Eureka Client
- Eureka Server:提供服務註冊。各個微服務節點通過配置啟動後,會在 Eureka Server 中進行註冊,這樣 Eureka Server 中的服務登錄檔中將會儲存所有可用服務節點的資訊,服務節點的資訊可以在潔面中直觀看到。
- Eureka Client:可以通過註冊中心進行訪問的 Java 客戶端,用於簡化 Eureka Server 的互動,其具備一個內建的、使用輪詢(round-robin)負載演算法的負載均衡器。在應用啟動後,客戶端將會想 Eureka Server 傳送心跳(預設週期為30秒)。如果 Eureka Server 在多個心跳週期內沒有接收到某個節點的心跳,Eureka Server 將會從服務登錄檔中把這個服務節點移除(預設90秒)。
構建單機 Eureka
建立 Eureka Server 服務註冊中心
1、建立微服務模組(Module)
2、引入 pom 依賴
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
注意:Eureka 依賴有兩個版本 1.x
和2.x
:
-
1.x 老版本中服務端和客戶端都使用同一個依賴包:
<!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
-
2.x 新版中把服務端和客戶端的依賴分開來了:
<!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
3、修改 yml 檔案配置資訊
server:
port: 7001
eureka:
instance:
hostname: localhost # eureka 服務端的例項名稱
client:
# false 表示不向註冊中心註冊自己
register-with-eureka: false
# false 表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
fetch-registry: false
service-url:
# 設定與 Eureka Server 互動的地址,查詢服務和註冊服務需要依賴這個地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4、修改主啟動類
在 SpringBoot 主啟動類中新增 @EnableEurekaServer
註解
修改完後啟動服務,然後訪問配置檔案中的服務地址:localhost:7001/eureka/
即可看到 Eureka 服務註冊中心頁面。
建立 Eureka Client 客戶端
1、建立微服務模組(Module)
2、引入 pom 依賴
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3、修改 yml 檔案配置資訊
server:
port: 8001
spring:
application:
# 服務名稱,註冊中心將使用這個名稱
name: cloud-service-1
eureka:
client:
# 表示是否將自己註冊進 Eureka Server 預設為 true
register-with-eureka: true
# 是否從 EurekaServer 抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為 true 才能配合ribbon 使用負載均衡
fetch-registry: true
service-url:
# Eureka Server 服務地址
defaultZone: http://localhost:7001/eureka
4、修改主啟動類
在 SpringBoot 主啟動類中新增 @EnableEurekaClient
和 @EnableDiscoveryClient
註解,其中 @EnableEurekaClient
是專門用於 Eureka 的,而 @EnableDiscoveryClient
是所有微服務發現都要用的。
構建 Eureka 叢集
微服務 RPC 遠端呼叫最核心的就是:高可用。為了避免單機突然故障而導致服務不可用,我們需要搭建 Eureka 註冊中心叢集,實現負載均衡 + 故障容錯。
搭建 Eureka Server 叢集
Eureka Server 叢集的原理就是互相註冊、相互守望,說白了就是多臺機器的 Eureka Server 可以互相訪問並共享註冊資訊。
假如有兩臺單機版的 Eureka Server 微服務模組,想要叢集需要修改其 yml 配置資訊。
機器1的配置資訊:
server:
port: 7001
spring:
application:
name: cloud-eureka-service-1
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 註冊到另一臺 Eureka Server 中
defaultZone: http://eureka7002.com:7002/eureka/
機器2的配置資訊:
server:
port: 7002
spring:
application:
name: cloud-eureka-service-2
eureka:
instance:
hostname: eureka7002.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 註冊到另一臺 Eureka Server 中
defaultZone: http://eureka7001.com:7001/eureka/
Eureka Serve 叢集搭建好啟動並可以訪問之後需要修改客戶端的服務註冊地址為:
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
# Eureka Server 叢集服務地址
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
客戶端註冊好後,叢集的 Eureka Serve 註冊中心的註冊列表都可以看到該服務。
搭建 Eureka Client 客戶端叢集
所謂 Eureka Client 客戶端叢集,指的是多個提供相同的功能的微服務通過註冊中心集合在一起,比如有5臺機器都是提供支付服務的,然後把這5臺機器叢集註冊到註冊中心,當遠端呼叫該服務的時,註冊中心就會通過負載均衡演算法去呼叫其中一臺機器服務介面。
構建 Eureka Client 服務叢集需要修改微服務面模組中的 yml 配置檔案內容如下:
# 設定服務埠
server:
port: 8001
# 設定微服務名稱
spring:
application:
name: cloud-payment-service
# 配置 eureka
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
# 註冊中心服務地址,叢集版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
instance:
# 設定叢集服務的例項名稱
instance-id: payment8001
# 訪問路徑可以顯示IP地址
prefer-ip-address: true
這裡需要注意的是,叢集中的每個 Eureka Client 需要使用同一個服務名稱,埠可以不一樣,註冊到註冊中心時也需要使用註冊中心的叢集地址。
當 Eureka Client 都成功叢集到註冊中心時,註冊中心就會看到服務列表的 cloud-payment-service
服務下有多個例項服務,我們可以通過 eureka.instance.instance-id
來設定服務例項名稱,通過 eureka.instance.prefer-ip-address
設定點選服務例項時可以顯示服務的IP地址。
測試 Eureka Client 服務叢集呼叫
我們使用 RestTemplate 來進行服務呼叫:
// 建立 RestTemplate 例項
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced // 提供負載均衡能力
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
// 遠端呼叫服務時只需要填寫註冊中心的服務名即可
@RestController
@Slf4j
public class OrderController
{
// 遠端呼叫的服務名
public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")
public CommonResult<Payment> create(Payment payment)
{
return restTemplate.postForObject(PAYMENT_URL +"/payment/create",payment,CommonResult.class);
}
}
注意:要遠端呼叫其它服務,自己本身也要註冊到註冊中心去。
相關文章
- Spring Cloud 之 Eureka.SpringCloud
- 4、Spring Cloud EurekaSpringCloud
- java Spring Cloud企業快速開發架構之SpringCloud-Spring Cloud EurekaJavaSpringCloud架構GC
- 服務治理: Spring Cloud EurekaSpringCloud
- (8)SpringCloud-Spring Cloud EurekaSpringGCCloud
- Spring Cloud— 五、註冊中心EurekaSpringCloud
- Spring Cloud Eureka 學習記錄SpringCloud
- Spring Cloud應用(一)---eureka使用SpringCloud
- Spring Cloud Eureka 實現安全控制SpringCloud
- Spring Cloud系列(四):Eureka原始碼解析之客戶端SpringCloud原始碼客戶端
- Spring Cloud系列(三):Eureka原始碼解析之服務端SpringCloud原始碼服務端
- 初識Spring Cloud Eureka(三)(Eureka客戶端之間 服務的相互呼叫)SpringCloud客戶端
- Spring Cloud認知學習(一):Spring Cloud介紹與Eureka使用SpringCloud
- Spring Cloud Gateway 整合Eureka路由轉發SpringCloudGateway路由
- spring cloud: 使用consul來替換eurekaSpringCloud
- Spring Cloud服務發現元件EurekaSpringCloud元件
- Spring Cloud原始碼分析之Eureka篇第七章:續約SpringCloud原始碼
- Spring cloud(2)-服務發現(Eureka,Consul)SpringCloud
- Spring Cloud:Zookeeper和Eureka的區別在哪?SpringCloud
- Spring Cloud系列(二):Eureka應用詳解SpringCloud
- springcloud學習筆記(一)Spring Cloud EurekaSpringGCCloud筆記
- Spring cloud系列教程第十篇- Spring cloud整合Eureka總結篇SpringCloud
- Spring Cloud(九)高可用的分散式配置中心 Spring Cloud Config 整合 Eureka 服務SpringCloud分散式
- Spring Cloud 系列(二)Eureka 高可用註冊中心SpringCloud
- Spring Cloud Netflix—示例在Ribbon中禁用Eureka使用SpringCloud
- Spring Cloud原始碼分析之Eureka篇第五章:更新服務列表SpringCloud原始碼
- Spring Cloud原始碼分析之Eureka篇第一章:準備工作SpringCloud原始碼
- Spring Cloud Eureka Server高可用之:線上擴容SpringCloudServer
- Spring-Cloud 從0開始(一) Eureka-ServerSpringCloudServer
- spring cloud微服務架構-Eureka保護機制SpringCloud微服務架構
- 【Spring Cloud】Eureka實現微服務釋出與呼叫SpringCloud微服務
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- Spring Cloud Netflix—服務發現:Eureka伺服器SpringCloud伺服器
- 普通springcloud eureka 和 spring cloud Alibaba nacos 註冊中心SpringGCCloud
- Spring-cloud學習筆記--- Eureka原始碼剖析之服務註冊介面SpringCloud筆記原始碼
- Spring Cloud原始碼分析之Eureka篇第六章:服務註冊SpringCloud原始碼
- Spring cloud 之GatewaySpringCloudGateway
- Spring Cloud 系列(一)Eureka 服務註冊與發現SpringCloud