nacos基礎文章3篇
第一篇. nacos初識, 和eureka的比較, 在docker上安裝nacos: https://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上安裝nacos: https://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
