SpringCloud全家桶學習之服務注冊與發現及Eureka高可用集群搭建(二)


、Eureka服務注冊與發現

(1)Eureka是什么?

  Eureka是NetFlix的一個子模塊,也是核心模塊之一。Eureka是一個基於REST的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務注冊與發現對於微服務架構來說是非常重要的,有了服務發現與注冊,只需要使用服務的標識符,就可以訪問到服務,而不需要修改服務調用的配置文件了。功能類似於dubbo的注冊中心,比如Zookeeper

  Eureka采用C-S的設計架構,Eureka Server作為服務注冊功能的服務器,它是服務注冊中心。

  系統中的其他微服務,使用Eureka的客戶端連接到Eureka Server並維持心跳連接。這樣系統的維護人員就可以通過Eureka Server來監控系統中各個微服務是否正常運行。SpringCloud的一些其他模塊(比如Zuul)就可以通過Eureka Server來發現系統中的其他微服務,並執行相關的邏輯。

(2)Eureka的三大功能

①Eureka Server:提供服務注冊和發現

②Service Provider:服務提供方將自身服務注冊到Eureka,從而使服務消費方能夠找到

③Service Consumer:服務消費方從Eureka獲取注冊服務列表,從而消費服務

二、Eureka-Server構建

  本工程代碼已上傳至Githubhttps://github.com/Simple-Coder/microservice-demo-study

  使用工具:IDEA2018.2、Maven 3.6.1、JDK1.8

(1)Maven工程結構

  

(2)Eureka-pom文件

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
Eureka-pom

(3)Eureka-application.yml屬性配置如下:

server:
  port: 8001
spring:
  application:
    name: microservice-eureka
eureka:
  instance:
    hostname: localhost #eureka服務端實例名稱
  client:
    register-with-eureka: false #false表示不向注冊中心注冊自己
    fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,並不需要去檢索服務
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務
  server:
    enable-self-preservation: false #禁用自我保護模式
application.yml

(4)Eureka啟動類

@SpringBootApplication
@Slf4j
@EnableEurekaServer
public class Application {
    public static void main(String[] args) {
        try {
            SpringApplication.run(ApplicationBoot.class, args);
        } catch (Throwable t) {
            log.error("啟動失敗", t);
            throw t;
        }
    }
}
Application.java

(5)瀏覽器訪問:localhost:8001

 

  至此,Eureka-Server已經構建完成!

 三、Eureka客戶端構建

(1)Maven工程結構

(2)miscroservice-provider-pom文件

  <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
Provider-pom

(3)micro-service-provider-application.yml文件

server:
  port: 9001
spring:
  application:
    name: microservice-provider-test
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
  instance:
    instance-id: microservice-provider9001  #自定義服務名稱信息
    prefer-ip-address: true #訪問路徑可以顯示IP地址

info:
  app.name: microservice-privder-9001
  company.name: www.baidu.com
  build.artifactId: $project.artifactId$
  build.version:  $project.version$
Application.yml

(4)測試Controller

@RestController
public class HelloWorldController {
    @Value("${server.port}")
    String port;

    @RequestMapping("/hello")
    public String home(String name)
    {
        return "hi " + name + ",i am from port:" + port;
    }
}
HelloWorldController

(5)啟動類

@SpringBootApplication
@Slf4j
@EnableEurekaClient
public class Application {
    public static void main(String[] args) {
        try {
            SpringApplication.run(ApplicationBoot.class, args);
        } catch (Throwable t) {
            log.error("啟動失敗", t);
            throw t;
        }
    }
}
Application.java

(6)測試:先啟動Eureka-Server,再啟動Provider,瀏覽器訪問:localhost:8001

(7)測試controller:瀏覽器訪問:localhost:9001/hello?name=zhangsan

 至此,Provider已經搭建完成!

四、服務發現

(1)Maven工程結構

  注入服務發現,並暴露地址訪問,如下:

 (2)microservice-consumer測試

 (3)瀏覽器訪問:http://localhost:7001/consumer/hello/discover

  服務發現測試成功!

五、Eureka的集群模式(3個節點)

(1)Maven的工程結構

 (2)application.yml文件配置(3個節點)

microservice-eureka:application.yml(端口8001)

server:
  port: 8001  #服務端口號
eureka:
  client:
    service-url:
      #相互注冊,組成一個集群,實現高可用
      defaultZone: http://eureka8002:8002/eureka/,http://eureka8003:8003/eureka/
  instance:
    #主機名
    hostname: eureka8001
spring:
  application:
    #服務名稱
    name: eureka-availability-server

microservice-eureka8002:application.yml(端口8002)

#集群模式Eureka
server:
  port: 8002  #服務端口號
eureka:
  client:
    service-url:
      #相互注冊,組成一個集群,實現高可用
      defaultZone: http://eureka8001:8001/eureka/,http://eureka8003:8003/eureka/
  instance:
    #主機名
    hostname: eureka8002
spring:
  application:
    #服務名稱
    name: eureka-availability-server

microservice-eureka8003:application.yml(端口8003)

server:
  port: 8003  #服務端口號
eureka:
  client:
    service-url:
      #相互注冊,組成一個集群,實現高可用
      defaultZone: http://eureka8001:8001/eureka/,http://eureka8002:8002/eureka/
  instance:
    #主機名
    hostname: eureka8003
spring:
  application:
    #服務名稱
    name: eureka-availability-server

(3)Eureka-Client的application.yml配置

server:
  port: 9001
spring:
  application:
    name: microservice-provider-test
eureka:
  client:
    service-url:
      defaultZone: http://eureka8001:8001/eureka/,http://eureka8002:8002/eureka/,http://eureka8003:8003/eureka/
  instance:
    instance-id: microservice-provider9001  #自定義服務名稱信息
    prefer-ip-address: true #訪問路徑可以顯示IP地址

info:
  app.name: microservice-privder-9001
  company.name: www.baidu.com
  build.artifactId: $project.artifactId$
  build.version:  $project.version$

(4)配置本地hosts文件:C:\Windows\System32\drivers\etc

 (5)測試:依次啟動eureka-server8001、eureka-server8002、eureka-server8003、provider

瀏覽器訪問:eureka8001:8001,出現以下紅框內容說明測試成功!

 同樣,分別訪問eureka8002:8002、eureka8003:8003,如下圖所示,說明Eureka的高可用集群搭建完成!

 

 

  至此,Eureka的高可用集群搭建完成(3個節點)搭建完成,是不是學習起來很簡單呢?代碼的世界真好玩!

六、Actuator與注冊微服務信息完善

(1)添加pom依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
pom

(2)主機名稱:服務名稱修改

eureka.instance. instance-id: emp-provide #自定義服務名稱信息

(3)訪問信息有IP信息提示

eureka.client. instance.prefer-ip-address: true #訪問路徑可以顯示IP地址

(4)微服務info內容詳細信息

 修改application.yml即可,訪問瀏覽器:localhost:8001

七、Eureka的自我保護機制

  默認情況下,如果EurekaServer在一定的時間內沒有接收到某個微服務實例的心跳,EurekaServer將會注銷該實例(默認90s),但是當網絡分區故障發生時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險了-----因為微服務本身其實是健康的,此時本不應該注銷這個微服務。Eureka通過“自我保護機制”來解決這個問題-----當EurekaServer節點在短時間內丟失過多客戶端時(可能發生網絡分區故障),那么這個節點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務注冊表中的信息,不再刪除服務注冊表中的信息(也就是不會注銷任何微服務)。當網絡故障恢復后,該EurekaServer節點會自動退出自我保護模式。

  在自我保護模式中,Eureka Server會保護服務注冊表中的信息,不再注銷任何服務實例。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會退出自我保護模式。它的設計哲學就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。

  綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目注銷任何可能健康的微服務實例。使用自我保護模式,可以讓Eureka集群更加的健壯和穩定。

  一句話概括:某一時刻某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的信息進行保存

  在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false  禁用自我保護模式

八、總結

  至此,以上是關於SpringCloud的HelloWorld入門學習。期間也遇到很多問題如下

(1)如圖,出現紅色警告

 解決方案:編輯Eureka Server模塊的application.yml添加如下配置:

 

  至此,Spring Cloud入門學習之HelloWorld已經搭建完成!


免責聲明!

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



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