微服務:整合 Spring Cloud Eureka - 高可用集群


目錄

   微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server 

   微服務:整合 Spring Cloud Eureka - 服務注冊 Eureka Client  

   微服務:整合 Spring Cloud Eureka - 服務發現 DiscoveryClient 

   微服務:整合 Spring Cloud Eureka - 服務消費以及Ribbon簡單使用 

   微服務:整合 Spring Cloud Eureka - 高可用集群  

   微服務:整合 Spring Cloud Eureka - .NET Core Mvc Api (C#) 

   微服務:整合 Spring Cloud Eureka - 服務治理機制  

   微服務:整合 Spring Cloud Eureka - 服務事件監聽  

   微服務:整合 Spring Cloud Eureka - 高級屬性Region、Zone

   微服務:整合 Spring Cloud Eureka - Rest接口文檔 

   微服務:整合 Spring Cloud Eureka - Security 安全保護

一、前言

  前面我們已經說明了如何搭建Rureka注冊中心,如何將服務提供者的服務地址注冊到注冊中心、已經服務消費者如何消費遠程服務。其實前面都是基於單個實例進行講解。今天將給大家講解如何構建高可用的Eureka注冊中心。

二、如何設計高可用注冊中心

1、單實例架構圖

  從上圖可以看出來,Eureka注冊中心、Provider服務、Consumer服務,三個掛掉任何一個,都會讓整個系統不可用。雖然這三個服務可以發布在三台服務器上,提高了系統性能,但是宕機的風險也越來越大。如果Eureka注冊中心的可用性=90%、Provider服務的可用性=90%、Consumer服務的可用性=90%,那么整個系統的可用性就是0.9*0.9*0.9=0.729,即72.9%。這個可用性並不是我們想要的。於是高可用的服務集群就因運而生。

2、高可用架構圖

 

  • 在上圖,我們將Eureka做了一個注冊中心集群,共有三個實例。每個實例的可用性=90%,那么這三個注冊中心的集群的可用心就是 1-(1-0.9)*(1-0.9)*(1-0.9)=99.9%。這個可用性就足以令人滿意。
  • Provider服務集群,假如我們的Provider服務是一個OAuth2的服務,那么其他的業務服務如:銷售、訂單、倉儲服務就都是Consumer服務。如果OAuth2的服務只有一個,也會降低整體服務的可用性。因此OAuth2的服務也應該做服務集群以提高鑒權服務的可用性。三個Provider(OAuth2)服務也可以組成一個高可用集群。可用性也是 1-(1-0.9)*(1-0.9)*(1-0.9)=99.9%
  • 對於Eureka而言,Consumer和Provider是一樣的,都需要將服務地址注冊到Eureka中。比如倉儲服務調用OAuth2服務,那么倉儲就是Consumer,OAuth2就是Provider。如果訂單服務調用倉儲服務,那么訂單服務就是Consumer,倉儲服務就是Provider。也就是說Consumer和Provider的角色是可以互換的。
  • Consumer通過Ribbon負載均衡策略調用Provider集群中一個可用的服務。

三、Eureka服務注冊中心集群代碼實現

 其實Eureka集群很容易實現,只需要簡單的幾個步驟就好了,因為Eureka內部已經幫我們做了大量的工作了。

1、修改Hosts文件,地址在:C:\Windows\System32\drivers\etc

     

 

     添加如下配置:

    127.0.0.1 peer1
    127.0.0.1 peer2
    127.0.0.1 peer3

2、項目結構

 

 

  具體符合編寫,請參考:微服務:整合 Spring Cloud Eureka - 注冊中心 Eureka Server  

3、修改application.yml

第一個實例的application.yml配置

server:
  port: 8001
  servlet:
    context-path: /register

spring:
  application:
    name: demo-register

eureka:
  instance:
    hostname: peer1
  client:
    #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server
    register-with-eureka: true
    #是否允許該客戶端從eureka server上獲取注冊信息
    fetch-registry: true
    instance-info-replication-interval-seconds: 30
    serviceUrl:
      defaultZone: http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/

第二個實例的application.yml配置:

server:
  port: 8002
  servlet:
    context-path: /register

spring:
  application:
    name: demo-register

eureka:
  instance:
    hostname: peer2
  client:
    #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server
    register-with-eureka: true
    #是否允許該客戶端從eureka server上獲取注冊信息
    fetch-registry: true
    instance-info-replication-interval-seconds: 30
    serviceUrl:
      defaultZone: http://peer1:8001/register/eureka/,http://peer3:8003/register/eureka/

第三個實例的application.yml配置:

server:
  port: 8003
  servlet:
    context-path: /register

spring:
  application:
    name: demo-register

eureka:
  instance:
    hostname: peer3
  client:
    #是否將該實例信息注冊到其他eureka server上;如果設置為false,那么該server無法被其他server發現,但是仍然可以發現其他server
    register-with-eureka: true
    #是否允許該客戶端從eureka server上獲取注冊信息
    fetch-registry: true
    instance-info-replication-interval-seconds: 30
    serviceUrl:
      defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/

4、運行效果:

第一個注冊中心實例地址:http://localhost:8001/register/

 

 

第二個注冊中心實例地址:http://localhost:8002/register/

 

 

 

第三個注冊中心實例地址:http://localhost:8003/register/

 

 

 

四、將服務注冊到Eureka注冊中心集群中

將Provider服務注冊到Rureka集群中,只需要修改一個配置即可:application.yml

server:
  port: 8101

spring:
  application:
    name: demo-service-provider

eureka:
  instance:
    lease-renewal-interval-in-seconds: 20
    hostname: peer1
  client:
    register-with-eureka: true
    fetch-registry: true
    instance-info-replication-interval-seconds: 30
    registry-fetch-interval-seconds: 10
    serviceUrl:
      defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/

 

為了方便測試,我們修改 ProviderHelloController類:

package com.demo.service.provider.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class ProviderHelloController {

    @Value("${server.port}")
    String server_port;

    @RequestMapping("/sayhello/{name}")
    public String sayHello(@PathVariable("name")String name){
        return "(port:"+ server_port +")hello , " + name;
    }
}

 

啟動三個實例,單個端口號為:8101,8102,8103

 

查看注冊中心:http://localhost:8001/register/http://localhost:8002/register/http://localhost:8003/register/。此時服務出現在三個注冊中心里面。

 

 此時,Provider將三個服務地址注冊到了三個注冊中心。接下來測試服務消費者。

 

五、服務消費者

1、第一步同樣是修改application.yml配置:

server:
  port: 8201

spring:
  application:
    name: demo-service-consumer

eureka:
  instance:
    lease-renewal-interval-in-seconds: 10
    lease-expiration-duration-in-seconds: 20
  client:
    register-with-eureka: true
    fetch-registry: true
    instance-info-replication-interval-seconds: 30
    registry-fetch-interval-seconds: 10
    serviceUrl:
      defaultZone: http://peer1:8001/register/eureka/,http://peer2:8002/register/eureka/,http://peer3:8003/register/eureka/

調用接口服務消費者接口地址:http://localhost:8201/hello/java,多刷新幾次。

 我們可以看到Consumer控制台已經打印出服務提供者的地址了。很明顯得可以看出負載均衡、服務集群都已經實現。並且Ribbon默認采用的負載均衡機制是輪詢。

五、總結

  現在看起來,是不是微服務架構很簡單,並沒有那么神秘。至此,我們已經能夠搭建一個高可用的微服務架構,雖然這個微服務架構比較簡單,但是已經適用於很多場景了。接下來小編還會和大家繼續探討Eureka的高級應用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM