1. 程式人生 > 其它 >SpringCloud(2)Eureka與Ribbon

SpringCloud(2)Eureka與Ribbon

一:主要內容

什麼是註冊中心,常見的註冊中心有哪些,為什麼需要註冊中心,什麼是Eureka註冊中心,Eureka的快遞Demo,Eureka的架構原理,Ribbon是什麼,有哪些負債均衡策略,區別是什麼,Ribbon的負載均衡策略設定。

一:Eureka註冊中心學習目標

Eureka服務註冊中心,服務註冊中心是服務實現化管理的核心元件,類似目錄服務的作用,主要用來儲存服務信心,譬如提供者url串,路由資訊等,服務註冊中心是被微服務架構中最基礎的設施之一。

在微服務架構流行之前,註冊中心就已經開始出現在分散式架構的系統中,Dubbo是一個在國內比較流行的分散式架構,被大量的中小型網際網路公司多采用,它提供了比較完善的服務治理功能,而服務治理的實現主要依靠的就是註冊中心。

目標:什麼是註冊中心,常見的註冊中心有哪些,為什麼需要註冊中心,註冊中心解決了什麼問題,什麼是Eureka註冊中心,Eureka註冊中心三種角色,Eureka安全認證,Eureka優雅停服,Eureka自我保護,CAP原則,Eureka架構原理,高可用Eureka註冊中心。

1.什麼是註冊中心

註冊中心可以說是微服務架構中的通訊錄,它記錄了服務和服務地址的對映關係,在分散式架構中,服務會註冊到這裡,當服務需要呼叫其它服務時,就到這裡找到服務的地址,進行呼叫。

舉個現實生活中的例子,比如說,我們手機中的通訊錄的兩個使用場景:
當我想給張三打電話時,那我需要在通訊錄中按照名字找到張三,然後就可以找到他的手機號撥打電話。——
服務發現
李四辦了手機號並把手機號告訴了我,我把李四的號碼存進通訊錄,後續,我就可以從通訊錄找到他。—— 服
務註冊
通訊錄 —— ?什麼角色(服務註冊中心)
總結:服務註冊中心的作用就是服務的註冊和服務的發現 2.常見的註冊中心 Netflix Eureka ,Alibaba Nacos ,HashiCorp Consul ,Apach ZooKeeper , CoreOS etcd ,CNCF CoreDns

3.為什麼需要註冊中心

瞭解了什麼是註冊中心,那麼我們繼續談談,為什麼需要註冊中心。在分散式系統中,我們不僅僅是需要在註冊

中心找到服務和服務地址的對映關係這麼簡單,我們還需要考慮更多更復雜的問題: 服務註冊後,如何被及時發現 服務宕機後,如何及時下線 服務如何有效的水平擴充套件 服務發現時,如何進行路由 服務異常時,如何進行降級 註冊中心如何實現自身的高可用 這些問題的解決都依賴於註冊中心。簡單看,註冊中心的功能有點類似於 DNS 伺服器或者負載均衡器,而實際 上,註冊中心作為微服務的基礎元件,可能要更加複雜,也需要更多的靈活性和時效性。所以我們還需要學習更多 Spring Cloud 微服務元件協同完成應用開發。
註冊中心解決了什麼問題 服務管理 服務的依賴關係管理 4.Eureka服務註冊中心
Eureka 是 Netflflix 開發的服務發現元件,本身是一個基於 REST 的服務。Spring Cloud 將它整合在其子專案 Spring Cloud Netflflix 中,實現 Spring Cloud 的服務註冊與發現,同時還提供了負載均衡、故障轉移等能力。 5.Eureka註冊中心的三種角色 Eureka Server 通過 Register、Get、Renew 等介面提供服務的註冊和發現。 Application Service(Service Provider) 服務提供方,把自身的服務例項註冊到 Eureka Server 中。 Application Client(Service Consumer) 服務呼叫方,通過 Eureka Server 獲取服務列表,消費服務。

6.Eureka入門案列

①:建立父工程

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!-- 專案座標地址 -->
  <groupId>com.example</groupId>
  <!-- 專案模組名稱 -->
  <artifactId>eureka-demo</artifactId>
  <!-- 專案版本名稱 快照版本SNAPSHOT、正式版本RELEASE -->
  <version>1.0-SNAPSHOT</version>
  <!-- 繼承 spring-boot-starter-parent 依賴 -->
  <!-- 使用繼承方式,實現複用,符合繼承的都可以被使用 -->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.7.RELEASE</version>
  </parent>
  <!--
    集中定義依賴元件版本號,但不引入,
    在子工程中用到宣告的依賴時,可以不加依賴的版本號,
    這樣可以統一管理工程中用到的依賴版本
   -->
  <properties>
    <!-- Spring Cloud Hoxton.SR1 依賴 -->
    <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
  </properties>
  <!-- 專案依賴管理 父專案只是宣告依賴,子專案需要寫明需要的依賴(可以省略版本資訊) -->
  <dependencyManagement>
    <dependencies>
      <!-- spring cloud 依賴 -->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring-cloud.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

②:建立子專案

名字叫eurkea-server

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xxxx</groupId>
  <artifactId>eureka-server</artifactId>
  <version>1.0-SNAPSHOT</version>


  <parent>
    <groupId>com.xxxx</groupId>
    <artifactId>eureka-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</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-test</artifactId>
      <scope>test</scope>
      <exclusions>
        <exclusion>
         <groupId>org.junit.vintage</groupId>
         <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
      </exclusions>
     </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
      <version>2.2.4.RELEASE</version>
    </dependency>


  </dependencies>

</project>

③:建立一個啟動類和一個yml檔案

配置yml檔案

此時如果直接啟動專案是會報錯的,錯誤資訊: com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect ,這是因為 Eureka 預設開啟了將自己註冊至注 冊中心和從註冊中心獲取服務註冊資訊的配置,如果該應用的角色是註冊中心並是單節點的話,要關閉這兩個配置 項。 啟動:
package com.xxxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer  //通過註冊中心來啟動這個應用
@SpringBootApplication
public class EurekaServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class);
	}

}

如果啟動的時候出現錯誤的時候;

我們可以在這個加這個:

開啟網頁輸入localhost:8761