一文快速瞭解Nacos

来源:https://www.cnblogs.com/magicmouseblogs/archive/2022/09/13/16690745.html
-Advertisement-
Play Games

前言 嗨嘍,大家好呀~這裡是愛看美女的茜茜吶 又到了學Python時刻~ 今天實現一下人臉識別。 先問大家一個問題什麼是百度Aip模塊? 百度AI平臺提供了很多的API介面供開發者快速的調用運用在項目中本文寫的是使用百度AI的線上介面SDK模塊(baidu-aip)進行實現人臉識別 除了人臉識別,其 ...


Nacos 是什麼

Nacos (Dynamic Naming and Configuration Service),其命名由三部分組成:

Na (naming/nameServer),即服務註冊中心。

co (configuration),即配置中心。

s (service),即服務,表示 Nacos 實現的服務註冊中心和配置中心都是以服務為核心的。

Nacos是由阿裡巴巴團隊使用 Java 語言開發的開源項目,是一個更易於構建雲原生應用的動態服務發現、配置管理和服務管理平臺(Nacos官網)。

Nacos 的特性

服務發現及管理

1、Nacos 註冊中心

註冊中心主要有三部分組成:

  • Nacos-Server:註冊中心

​ 提供服務的註冊和發現。

  • Nacos-Provider:服務提供方

​ 把自身的服務實例註冊到 Nacos Server 中。

  • Nacos-Consumer:服務調用方

​ 通過 Nacos Server 獲取服務列表,消費服務。

image-20220913095717703

2、服務發現及管理

  • 動態服務發現

    當服務實例啟動之後,向註冊中心登記自己的地址信息,這樣服務調用方就可以通過服務名稱從註冊中心獲取此服務的信息,從而調用此服務的實例。

    並且 Nacos 支持 Rest (Get、Post請求) 與 RPC (Dubbo) 模式的服務發現。

  • 實時健康檢查

    為防止將請求發往不健康的主機或服務實例。

    註冊的實例會定時向註冊中心發送請求,表明自己健康,當註冊中心無法再接收到實例發送的請求(實例請求停止或請求無法發送到註冊中心等不健康狀態),註冊中心就會清理該實例信息。

動態配置服務

微服務架構下關於配置文件的一些問題:

配置文件相對分散。在一個微服務架構下,配置文件會隨著微服務的增多變的越來越多,而且分散在各個微服務中,項目後期的配置管理困難。

配置文件無法區分環境。微服務項目可能會有多個環境,例如:測試環境、預發佈環境、生產環境。每一個環境所使用的配置理論上都是不同的,一旦需要修改,就需要我們去各個微服務下手動維護,這比較困難。

配置文件無法實時更新。修改配置文件之後,必須重新啟動微服務才能使配置生效,這對一個正在運行的項目來說是非常不友好的。

動態配置服務讓我們以中心化、外部化和動態化的方式管理所有環境的配置。通俗的講:

  • 中心化:

    把項目中各種配置全部放在一個地方集中統一管理。

  • 外部化:

    當服務需要獲取配置的時候,從配置中心拉取自己的配置。

  • 動態化:

    當配置中心中的參數更新的時候,各個服務也能實時同步最新配置,使之動態更新。

動態配置可以使配置變更時無需重新部署應用和服務。

Nacos 的下載與安裝 (Linux)

下載

下載地址:https://github.com/alibaba/nacos/tags

image-20220913095717703

以 1.4.1 版本為例

image-20220913103434924 image-20220913103434924

安裝

將安裝包上傳到Linux,解壓

[root@localhost ~]# cd /[upload]
[root@localhost [upload]]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local	

[upload]:上傳目錄

啟動和關閉

啟動:

[root@localhost local]# cd nacos/bin/
[root@localhost bin]# ./startup.sh -m standalone #非集群模式啟動
... ...
nacos is starting with standalone
nacos is starting,you can check the /usr/java/nacos/logs/start.out

關閉:

[root@localhost bin]# ./shutdown.sh
The nacosServer(3543) is running...
Send shutdown request to nacosServer(3543) OK
[root@localhost bin]#

Nacos 開機自啟:

  • 添加 nacos.service 文件
[root@localhost bin]# vim /lib/systemd/system/nacos.service

[Unit]
Description=nacos
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh
ExecStop=/usr/local/nacos/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
~
~

[root@localhost bin]#
  • 修改JAVA_HOME路徑為絕對路徑並註釋之後的3行配置,如下:
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_181 
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/opt/taobao/java
#[ ! -e "$JAVA_HOME/bin/java" ] && unset JAVA_HOME
  • 設置開機自啟
[root@localhost bin]# systemctl daemon-reload        #重新載入服務配置
[root@localhost bin]# systemctl enable nacos.service #設置為開機啟動
[root@localhost bin]# systemctl start nacos.service  #啟動nacos服務
[root@localhost bin]# systemctl stop nacos.service   #停止nacos服務

測試

使用瀏覽器訪問:http://192.168.233.132:8848/nacos,預設用戶名/密碼為:nacos/nacos

image-20220913111734910

Nacos 與 Spring Cloud

首先讓我們搭建一個簡單的項目來體驗Nacos

創建 springcloud_parent 管理項目依賴

pom:

<dependencyManagement>
    <dependencies>
        <!--Spring Boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.3.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud Netflix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR9</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--spring cloud 阿裡巴巴-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.6.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

創建 springcloud_common

pojo:

public class User {
    private Integer id;
    private String name;
    private Integer age;

    public User() {
    }

    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

創建 nacos_provider

pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.magicmouse</groupId>
        <artifactId>springcloud_common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

service:

@Service
public class UserServiceImpl implements UserService {

	@Override
	public User getUserById(Integer id) {
		return new User(id,"Nacos",4);
	}
}

controller:

@RestController
@RequestMapping("/provider")
public class ProviderController {
	
	@Autowired
	private UserService userService;

	@RequestMapping("/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		return userService.getUserById(id);
	}
}

創建 nacos_consumer

pom:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.bjpowernode</groupId>
        <artifactId>springcloud_common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

config:

@Configuration
public class ConfigBean {

	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}
}

controller:

調用其它服務發佈的介面,具體實現會在後面介紹

註冊中心

nacos_provider

1、引入依賴

<dependencies>
    ··· ···
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    ··· ···
</dependencies>

2、修改配置文件 application.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.233.132:8848 #nacos服務的地址
  application:
    name: nacos-provider #向註冊中心註冊的名字

3、啟動類添加 @EnableDiscoveryClient 註解

image-20220913111344228

4、測試

image-20220913111344228

nacos_consumer

1、引入依賴

<dependencies>
    ··· ···
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    ··· ···
</dependencies>

2、修改配置文件 application.yml

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.233.132:8848 #nacos服務的地址
  application:
    name: nacos-consumer #向註冊中心註冊的名字

3、啟動類添加 @EnableDiscoveryClient 註解

4、controller

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
	
	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private DiscoveryClient discoveryClient;

	@RequestMapping("/getUserById/{id}")
	public User getUserById(@PathVariable Integer id){
		//獲取nacos中註冊的所有服務信息
		List<String> serviceList = discoveryClient.getServices();
		
		//獲取nacos中註冊的指定服務信息
		ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
		String serviceUrl = instance.getHost() + ":" + instance.getPort();

		String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
		return restTemplate.getForObject(url, User.class);
	}
}

5、測試

image-20220913121317212

配置中心

創建 nacos_config

1、引入依賴

<!-- 添加 Nacos 配置中心依賴 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2、修改配置文件 bootstrap.yml

配置文件的名稱需要為:bootstrap.yml

bootstrap.yml 比 application.yml 優先載入

  • bootstrap.yml 可以理解為用於系統級參數的配置,這些參數一般是不會變動。並且bootStrap.yml 被載入後,內容不會被覆蓋。
  • application.yml 用於SpringBoot項目的自動化配置。

bootstrap.yml:

spring:
  cloud:
    nacos:
      config:
        server-addr: 192.168.233.132:8848 #nacos服務的地址
        file-extension: yaml #尾碼名,只支持 properties 和 yaml 類型
        prefix: nacos-config #文件名,如果沒有配置則預設為 ${spring.appliction.name}

3、啟動類添加 @EnableDiscoveryClient 註解

4、controller

@RestController
@RefreshScope //重新從BeanFactory獲取一個新的實例(該實例使用最新的配置)
public class ConfigController {

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.type}")
    private String type;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        System.out.println(this);
        String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
                +password+"<br>"+type;
        return configInfo;
    }
}

在 Nacos 中添加配置信息

Nacos的Data ID

  • 在 Nacos 中,dataId(配置文件的命名規則) 的完整格式如下:

    ${spring.cloud.nacos.config.prefix}.${spring.cloud.nacos.config.file-extension}

  • 說明:

    • spring.cloud.nacos.config.prefix:預設是當前服務的服務名稱
    • spring.cloud.nacos.config.file-extension:配置文件的格式(尾碼),目前只支持yaml和properties

總的來說:一定要和 bootstrap.yml 中的配置相同

創建配置文件

server:
  port: 80
spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.233.132:8848
  application:
    name: nacos-config
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/user?characterEncoding=UTF-8
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

發佈成功後點擊返回即可。

測試

啟動時會從Nacos載入配置文件:

瀏覽器訪問:http://127.0.0.1/config/info

image-20220913195610957

當修改配置文件後nacos監聽到MD5有變化則推送消息給客戶端,客戶端收到消息後會拉取最新配置:

刷新瀏覽器頁面:

image-20220913195610957
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #【設計模式】工廠模式 相對來說,寫的比較亂,但是看一下實例,其實理解很快 ##抽象工廠模式(這裡主要介紹抽象工廠模式) 核心的工廠類不再負責所有對象的創建,而是將具體的創建工作交給子類去做。這個類則搖身一變變成了一個抽象工廠角色,僅僅負責給出具體工廠子類必須實現的介面。 舉個例子: 我有個雞廠,我 ...
  • Hello,我是你們的好朋友小烤鴨,這過了個中秋節,胡吃海喝了兩日,學習拉下了,今天返崗,繼續把我們的設計模式撿起,希望我能堅持完這個系列吧,下麵我們就進入正題吧。 在軟體開發過程中,我們需要重覆使用某個對象的時候,如果重覆地new這個對象,不停地申請記憶體空間,會造成記憶體空間的極大浪費,在之後程式運 ...
  • 本文主要給出了電商平臺通用取貨碼的完整設計思路,按此思路可以實現大多數核銷類券碼的生成問題,也能夠滿足SaaS化的業務 ...
  • 我的博客在看到這個標題時候肯定有人會想,我寫SQL直接在資料庫工具上執行就行了啊,工具會自動識別註釋的,就是不用工具,把SQL寫到存儲過程里,資料庫也會識別註釋不執行的,幹嘛非要去掉,費力不討好。 其實是最近在做一個項目,需要在行雲庫里執行SQL,並且SQL是寫在腳本上的,通過JDBC調用,眾所周知 ...
  • 前言 CMake是C++的必學部分,本篇文章從安裝環境開始,通過使用CMake構建一個最簡單的cpp項目和g++直接編譯作對比瞭解CMake的構建過程,為接下來深入學習CMake打下基礎。 一、系統環境 操作系統:Windows7 sp1 專業版 構建工具:CMake 3.24.1 下載地址:htt ...
  • 函數的地址是存儲其機器語言代碼的記憶體的開始地址。可以編寫將另一個函數的地址作為參數的函數,它允許在不同的時間傳遞不同函數的地址,這意味著可以在不同的時間使用不同的函數。 ...
  • 可用七種不同的方式將 const 關鍵字用於二級指針,如下所示: //方式一:所指一級指針指向的數據為常量,以下幾種為等效表示 const int ** pptc; //方式一 int const ** pptc; //方式二 //方式二:所指一級指針為常量 int *const* pcpt; // ...
  • 可用三種不同的方式將 const 關鍵字用於一級指針,如下所示: //方式一:指向常量數據的指針,以下幾種為等效表示 const int * ptc; //方式一 int const * ptc; //方式二 //方式二:指針本身為常量,需在聲明時初始化 int x = 55; int * cons ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...