天天看點

Spring Cloud Alibaba 服務治理---Nacos Discovery

在了解nacos之前我們需要知道什麼是服務治理?
服務治理是微服務架構中最核心最基本的子產品,用于各個子產品的自動化注冊和發現。
           
  • 服務注冊: 在服務治理架構中,都會建構一個注冊中心,每個服務單元向注冊中心登記自己提供服務資訊,并在注冊中心形成一張服務的清單,服務注冊中心需要以心跳的方式取檢測清單中的服務是否可用,如果不可以用,需要在服務清單中删除不可用的服務。
  • 服務發現: 服務調用方向注冊中心詢問服務,并擷取是以服務的執行個體清單,實作對具體執行個體的通路。
    Spring Cloud Alibaba 服務治理---Nacos Discovery
    通過上面關系圖我們可以看出,除了微服務之外,我們還有一個注冊中心它是微服務架構非常重要的一個元件,在微服務架構裡主要起道了協調者作用,注冊中心一般包含以下幾個功能:

服務發現:

  • 服務注冊:儲存服務提供者和調用者的資訊
  • 服務訂閱:服務調用和訂閱服務消息。注冊中心向訂閱者推送提供者的消息

服務配置:

  • 配置訂閱:服務提供者和服務調用者訂閱微服務相關配置
  • 配置下發:主動将配置推送給服務提供者和服務調用者

服務健康檢查

  • 檢查服務提供者的健康狀況,如果發現異常,執行服務删除

常見的注冊中心

  • Zookeeper

    zookeeper是一個分布式服務架構,是Apache Hadoop的一個子項目,它主要是用來解決分布式應用中經常遇到的一些資料管理問題。如:統一命名服務,叢集管理,分布式應用配置項的管理。

  • Eureka

    Eureka是SpringCloud Netfilx中的重要元件,主要作用是做服務注冊和發現,但是現在已經閉源(2.0版本以後)

  • Consul

    Consul是基于GO語言開發的開源工具,主要面向分布式,服務化的系統提供服務注冊,服務發現和配置管理的功能,Consul的功能都很實用,其中包括:服務注冊/發現、健康檢查、Key/Value的存儲、多資料中心和分布式一緻性等特性,Consul本身是一個二進制的可執行檔案,是以安裝和部署都非常簡單,隻需要重官網下載下傳後,在執行對應的啟動腳步即可。

  • Nacos

    Nacos是一個更易于建構原生态應用的動态服務發現,配置管理和服務管理平台,它是Spring Cloud Alibaba元件之一,負責服務注冊與發現和服務配置,可以認為nacos=enueka+config

Nacos入門使用

nacos控制台搭架

  1. 安裝nacos

    下載下傳位址:https://github.com/alibaba/nacos/releases

  2. 啟動nacos

    輕按兩下bin目錄下的startup.cmd檔案

  3. nacos控制台通路

    http://localhost:8848/nacos,預設密碼nacos/nacos

項目內建Nacos元件

  1. pom.xml添加nacos用戶端的依賴
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
               
  2. 在啟動類上添加 @EnableDiscoveryClient
  3. 配置檔案添加nacos位址
    spring:
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
               
通過以上方式項目中都已經內建好noacos了,如果服務都已經正常啟動,在nacos控制台會發現服務消費以及注冊資訊,但是我們兩個服務直接如何通信呢?

服務直接如何通路

如果A服務需要通路B服務,通過我們隻需要通過隻需要知道B服務的 ip+端口+接口路徑是不是就可以通路了?這樣當然是可以的,Nacos提供DiscoveryClient也可以通過該方式獲得ip+端口

使用DiscoveryClient 用戶端進行微服務接口通路

1. 注入用戶端對象
   @Autowired
   private DiscoveryClient discoveryClient;
2. 擷取執行個體資訊,提供服務方端口以及ip
   List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
   ServiceInstance serviceInstance = instances.get(0);
           

通過以上的的方式,也能進行通路,但是使用這個方式進行服務直接的通信是否可行呢?通過微服務的名稱我們可以獲得多個微服務執行個體,然後取出第一個擷取ip+端口,然後在拼接上路徑,這樣就可以通路了,這會帶來什麼問題?

  1. 如果微服務有多個執行個體,我們一直都是擷取第一個?那負載均衡如何實作?
  2. 每一個接口的調用,我們都需要寫這麼多與業務無關的代碼,你不覺得煩嗎?

    當然這些都一定會有解決辦法的,這就是接下來要學習的Ribbon以及Feign

上一篇:Spring Cloud Alibaba入門概念

下一篇:Spring Cloud Alibaba 服務調用負載均衡—Ribbon