3. nacos服務發現


nacos基礎文章3篇

第一篇. nacos初識, 和eureka的比較, 在docker上安裝nacoshttps://www.cnblogs.com/ITPower/p/12624248.html

第二篇. nacos服務配置中心https://www.cnblogs.com/ITPower/p/12630193.html

第三篇. nacos服務發現 :https://www.cnblogs.com/ITPower/p/12651152.html


 

本文講解以下幾個方面的內容:

1. nacos服務發現原理

2. spring cloud服務協作流程

3.搭建nacos服務端

4. 搭建nacos服務發現客戶端

5. nacos服務發現的數據模型


 

一. nacos服務發現的原理

 

有兩個微服務A和B, A調用B, 那么A是如何調用B的呢?我們可以通過http請求,進行調用. 也可以使用rpc進行調用. 

不管使用什么方式, A需要知道B的地址和端口號. 那么A是如何知道B的地址和端口好的呢? 如上圖:

1. B服務啟動的時候, 會注冊到服務發現中心, 告訴他,我的ip和端口號是什么?這里應該也是接口調用,通知服務發現中心的.

2. A服務啟動的時候, 也會注冊的服務發現中心, 告訴他, 我的ip和端口號是什么? 同時, 服務發現中心會告訴我, 當前已注冊的服務的ip和端口號. 這里通過一個接口請求和參數返回就可以實現.

3. 拿到了B服務的ip和port, 接下來就可以調用服務B了. 

 二. spring cloud服務協作流程

我們要基於spring cloud生態環境進行開發. 所以,先來了解spring cloud的服務寫作流程

 

 

 前面注冊和發現就都不說了, 上面說過了, 這里多了兩個東西, 一個是Ribbon, 另一個是feign.

Ribbon是負載均衡器, Feign是遠程調用, 自動進行http請求.

2.1 服務負載均衡 -- Ribbon

 客戶端Service A 要調用ServiceB的實例1和實例2. 那么到底調用ServiceB的哪個實例呢? 使用Ribbon負載均衡, 要看使用什么樣的算法了, 可以使用輪詢算法, 或者其他算法, 如加權算法

負載均衡有兩種: 服務端負載均衡, 客戶端負載均衡

  • 服務端負載均衡

    在負載均衡中維護一個可用的服務實例清單, 當客戶端請求來臨時, 負載均衡服務器按照某種配置好的規則(負載均衡算法), 從可用服務實例清單中, 選取其一去處理客戶端請求, 這就是服務端負載均衡, 例如Nginx. 通過nginx進行負載均衡, 客戶端發送請求值Nginx, nginx通過負載均衡算法, 在多個服務器之間選擇一個進行訪問. 

 

 

  • 客戶端負載均衡

    接下來, 我們要講的ribbon, 就屬於客戶端負載均衡, 在ribbon客戶端會有一個服務實例地址列表, 在發送請求前, 通過負載均衡算法, 選擇一個服務實例, 然后進行訪問, 這是客戶端負載均衡. 即在客戶端進行負載均衡算法分配.

 

    服務的調用方, 我們就可以理解為是一個客戶端. 

    負載均衡算法:

    

 

 

     可通過下面的方式, 在spring boot配置中修改默認的負載均衡的策略

    

account-service.ribbon.NFLoadBalanceRuleClassName=com.netflix.loadBalancer.RandomRule

    其中: account-service: 是調用的服務的名稱. 后面的組成部分是固定的. 

 

2.2 服務間接口的調用---Feign

  feign是服務端http接口的調用. 

  feign可以幫助我們更快捷, 優雅的調用httpApi. 原來我們在調用http請求的時候, 需要使用的是RestTemplate, 傳輸域名和端口號, 進行http調用. 使用feign后, 不用再使用RestTemplate模擬請求了, feign能夠通過服務名, 找到對應的接口. 不需要我們在拼接地址+端口了, 提供了簡單方便的操作.

 

  使用方法:

      1. 在Service B定義一個接口

  

 

 

   2. 聲明feign客戶端

  

 

 

  新建一個類, 聲明為FeignClient類型的接口. 指定調用的服務名. 然后將指定接口. 這樣在調用的時候, 就可以通過服務名, + 接口, 自動找到對應的項目接口了.    

三. 搭建nacos服務端

  這里上一節已經搭建過了(地址: https://www.cnblogs.com/ITPower/articles/12630193.html), 在服務的最后, 我們搭建了nacos的集群

 

四. 搭建nacos服務發現客戶端

  因為對於服務發現來說, 有很多配置都是公用的, 因此, 我們搭建一個父工程, 將通用的配置都添加到里面取. 

4.1 搭建父工程.

創建一個maven工廠, 引入jar包即可. pom文件如下

<?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.lxl.www</groupId>
    <artifactId>parent-discovery</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 這是一個父類工程, 所以, 需要設置打包類型為pom -->
    <packaging>pom</packaging>

    <properties>
        <project.build.sourceEncodding>UTF-8</project.build.sourceEncodding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- 這里我們使用的是alibaba的spring cloud -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>

    </dependencyManagement>


</project>

4.2 創建一個服務提供者, 也就是生產者. 

在父工程下創建一個子工程. 我們要做一下三件事

1. 修改pom文件, 引入服務發現, feign, 和spring boot web

<dependencies>
        <!-- 引入服務發現的包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- 定義接口訪問, 引入spring boot web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 服務之間http調用, 引入feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2. 添加application.yml配置文件

指定服務端口號, nacos服務的地址

server:
  port: 56010
spring:
application:
name: productor cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #nacos的服務器地址 logging: level: root: info org.springframework: info

3. 定義一個啟動類, 用來啟動spring boot新項目

需要增加兩個引入. 1個啟用服務發現, 另一個是啟用feign

package com.lxl.www.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

import javax.swing.*;

@SpringBootApplication // 引入服務發現 @EnableDiscoveryClient // 使用feign接口調用 @EnableFeignClients public class ProductorApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductorApplication.class, args);
    }
}

 

4. 定義一個controller, 寫一個接口

package com.lxl.www.nacos.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/productor")

public class ProductorController {

    @GetMapping("/service")
    public String service() {
        System.out.println("provider invoke");
        return "provider invoke";
    }

}

 

5. 啟動程序, 在nacos中查看服務注冊列表

 

 最終項目結構如下:

 

4.3 創建一個服務消費者. 

其中前3步驟和創建服務生產者是一樣的

在父工程下創建一個子工程. 我們要做一下三件事

1. 修改pom文件, 引入服務發現, feign, 和spring boot web

<dependencies>
        <!-- 引入服務發現的包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- 定義接口訪問, 引入spring boot web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 服務之間http調用, 引入feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2. 添加application.yml配置文件

指定服務端口號, nacos服務的地址

server:
  port: 56010 spring:
 application:
name: consumer
cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #nacos的服務器地址 logging: level: root: info org.springframework: info

3. 定義一個啟動類, 用來啟動spring boot新項目

需要增加兩個引入. 1個啟用服務發現, 另一個是啟用feign

package com.lxl.www.nacos;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication // 引入服務發現 @EnableDiscoveryClient // 使用feign接口調用 @EnableFeignClients public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class, args); } }

 4. productor生產者遠程代理定義

package com.lxl.www.nacos.feign.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "productor")
public interface ProductorFeign {

    @GetMapping("/productor/service")
    String service();

}

5. 通過feign調用productor的的接口

package com.lxl.www.nacos.controller;

import com.lxl.www.nacos.feign.client.ProductorFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/")
public class ConsumerController {
    @Autowired
    private ProductorFeign productorFeign;


    @GetMapping("consumer")
    public String cunsumer() {
        String service = productorFeign.service();
        System.out.println(service);
        return service;
    }

}

6. 啟動服務, 查看nacos客戶端, 並調用接口測試

 

 nacos生產上已經注冊發現了兩題服務

同時調用接口, 可以獲取到productor返回的內容.

 4.4 spring cloud的默認負載均衡方式--輪詢

我們可以通過啟動多個服務的方式, 來測試服務的負載均衡策略.

 

1. 修改productor的啟動端口號為動態端口號. 目的是方便啟動的時候動態配置端口號, 啟動集群

 

 

 2. 修改配置, 添加動態端口號

 

 

 

 

 

 vm options配置中設置動態端口號為-Dport=56010, 56011. 點擊復制按鈕, 可以增加一個應用, 然后配置參數后, 啟動兩個應用. 

3. 在nacos控制台查看啟動效果

 

 我們看到, nacos的productor 有兩台服務實例. 點擊詳情可查看具體的服務實例信息:

 4. 調用consumer的接口, 訪問productor, 默認采用輪詢的負載均衡算法

  http://localhost:56020/consumer

 

五. nacos服務發現的數據模型

nacos的注冊發現是一種三層模型: 即 服務--集群--實例.如下圖:

 

 nacos最外層是服務. 最里層是多台實例. 多個實例之間組成一個服務集群.

5.1 命名空間

命名空間不僅適用於配置管理, 同樣適用於服務發現. namespace的常用場景之一是不同環境的配置隔離.如: 開發, 生成, 測試環境資源的隔離.

 

productor啟動了兩個實例, 點擊詳情進去可以看到他是一個集群. 集群里有兩台實例.

5.2 服務. 

  在命名空間下, 有各個服務.比如我們上面定義的是在public命名空間下, 定義了兩個服務. 一個是productor, 一個是consumer.

  服務有服務名實例.  遠程調用的時候, 需要指定服務名.

5.3 實例

  實例是基於網絡協議通訊, 所以必須要有一個ip:端口號

 

5.4 元信息

  在及群里點擊某一個實例-->編輯, 可以看到如下頁面, 可以設置元信息

  

 

   那么元信息是什么呢? 每台服務器都可能會設置自己的個性化的信息. 這就是每台服務器的元數據信息

5.5 實操---指定集群的命名空間為dev

 

 只需要在配置中增加命名空間就可以了. 

我們也可以修改集群的名字, 集群的默認名字是DEFAULT. 我們這里將其修改為default. 在控制台dev命名空間下, 可以看到啟動了服務customer.

  


nacos基礎文章3篇

第一篇. nacos初識, 和eureka的比較, 在docker上安裝nacoshttps://www.cnblogs.com/ITPower/p/12624248.html

第二篇. nacos服務配置中心https://www.cnblogs.com/ITPower/p/12630193.html

第三篇. nacos服務發現 :https://www.cnblogs.com/ITPower/p/12651152.html

 


 


免責聲明!

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



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