溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nacos的作用是什么

發(fā)布時間:2021-06-18 16:12:54 來源:億速云 閱讀:2024 作者:chen 欄目:編程語言

這篇文章主要講解了“Nacos的作用是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Nacos的作用是什么”吧!


OpenAPI

在講注冊中心內(nèi)容時,我們已經(jīng)知道Nacos本質(zhì)上是一個服務,那么,是服務就會有接口,下面阿鑒給大家介紹一下注冊實例接口

更多OpenAPI可查看Nacos官網(wǎng):https://nacos.io/zh-cn/docs/open-api.html

注冊實例接口

接口:/nacos/v1/ns/instance

請求方式:POST

參數(shù):

名稱類型是否必選描述
ip字符串服務實例IP
portint服務實例port
namespaceId字符串命名空間ID
weightdouble權(quán)重
enabledboolean是否上線
healthyboolean是否健康
metadata字符串擴展信息
clusterName字符串集群名
serviceName字符串服務名
groupName字符串分組名
ephemeralboolean是否臨時實例

測試:

  1. 發(fā)送一個curl請求,當然使用Postman也可以

    curl -i -X POST \
       -H "Content-Type:application/json" \
     'http://192.168.2.11:8850/nacos/v1/ns/instance?serviceName=test&ip=123.123.123.123&port=8081&username=nacos&password=nacos'


  2. 打開Nacos控制臺查看效果

    Nacos的作用是什么

    由于只傳了必要參數(shù),所以命名空間和分組名稱都是默認的。

    注意:由于我們只注冊了實例,并未定時發(fā)送心跳,所以實例會在一定時間內(nèi)被Nacos剔除

  3. 打開詳情

    Nacos的作用是什么

    ip和端口號即為我們填入的信息

OpenAPI在服務中的關(guān)系

相信小伙伴已經(jīng)發(fā)現(xiàn)了,我們在調(diào)用接口時傳入的參數(shù)是什么,注冊到Nacos上的實例信息就是什么,那么在實際項目中能不能也這樣玩呢?

在之前我們使用Nacos時,我們使用的配置是這樣:

server:
  port: 8080
spring:
  application:
    name: my-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        username: nacos
        password: nacos

此時我們并未使用ip和port配置,Nacos將自動發(fā)現(xiàn)本地ip地址進行注冊, port則使用server.port

現(xiàn)在我們將ipport加上

server:
  port: 8080
spring:
  application:
    name: my-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: 123.123.123.123
        port: 1234
        username: nacos
        password: nacos

但實際上我本機ip地址為192.168.65.91

啟動服務并在控制臺查看服務詳情

Nacos的作用是什么

此時IP和端口就成了我們實際配置了的

心急的小伙伴這時候可能就會給阿鑒個大嘴巴子:講那么多,這有啥用?!

阿鑒:不急不急

容器部署

在實際項目使用時,我們肯定傾向于讓服務自己發(fā)現(xiàn)IP和端口號進行注冊。

多實例部署時,誰關(guān)心你的本機ip是個啥,一個服務一會在那臺機器,一會在這臺機器,不可能每次部署時都改下配置。

但是有一種情況讓Nacos自己發(fā)現(xiàn)IP是不可行的。那就是使用容器部署服務。

  1. 比如我們在192.168.2.11服務器上部署一個my-goods服務,此時Nacos自動發(fā)現(xiàn)的IP實際上是容器內(nèi)部IP,如172.19.0.16

  2. 現(xiàn)在嘗試使用在192.168.2.12的服務器上的my-order服務,對my-goods服務進行調(diào)用,此時會收到一個拒絕連接錯誤,因為調(diào)用的地址是172.19.0.16,但實際需要的地址是192.168.2.11

問題解決

簡單的辦法就是在配置文件中加上ip的配置,如

server:
  port: 8081
spring:
  application:
    name: my-goods
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: 192.168.2.11
        username: nacos
        password: nacos

此時my-goods注冊到Nacos上的地址就是服務器的地址了。

但是這種方式有個很明顯的弊端,就是服務遷移時需要改動配置,多實例部署時需要頻繁改動配置。

一個更優(yōu)雅的方式

我們把配置改成如下:

server:
  port: 8081
spring:
  application:
    name: my-goods
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: ${HOST_IP_ADDRESS:127.0.0.1}
        username: nacos
        password: nacos

此時ip配置中增加了變量:HOST_IP_ADDRESS

docker-compose.yaml

version: '3.5'
services:
  my-goods:
    restart: always
    image: my-goods
    container_name: my-goods
    environment:
      HOST_IP_ADDRESS: $HOST_IP_ADDRESS
      TZ: Asia/Shanghai
    ports:
      - 8081:8081

在執(zhí)行docker-compose前,將HOST_IP_ADDRESS輸出到環(huán)境變量中

export HOST_IP_ADDRESS=$(ifconfig eth0 | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | awk '{ print $2 }'| cut -f2 -"d:")

這行命令表示將本機ip輸出到環(huán)境變量HOST_IP_ADDRESS

這個步驟可根據(jù)不同的部署工具進行執(zhí)行,比如阿鑒用的是gitlab-ci,就是在gitlab-ci中執(zhí)行的。

如此,使用容器部署的方式便優(yōu)雅完成了~

邊車掛載

奇技淫巧

當我們發(fā)現(xiàn)了奧秘:只要我們配了IP,配的IP是啥,注冊到Nacos的IP就是啥。

掌握奇技淫巧的程序員們有沒有想到一些騷操作呢?阿鑒這里卻是想到了一個哦~

<img src="https://notes.zijiancode.cn/nacos/my-sidecar.png"  />

my-sidercar將my-integral的信息注冊到Nacos上

  1. 新建一個my-sidecar服務,配置如下

    server:
      port: 8082
    spring:
      application:
        name: my-sidecar
      main:
        allow-bean-definition-overriding: true
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.11:8850
            namespace: public
            service: my-integral
            ip: 192.168.65.91
            port: 8083
            username: nacos
            password: nacos
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"

     

    注冊到Nacos的信息是my-integral服務的

  2. 新建一個Spring Boot my-integral服務(注意不是SpringCloud服務,不集成Nacos),配置如下

    server:
      port: 8083
    spring:
      application:
        name: my-integral

     

    spring.application.name 配置加不加無所謂

  3. my-integral服務中編寫接口

    @Slf4j
    @RestController
    @RequestMapping("/integral")
    public class IntegralController {
    
        @GetMapping("/remain")
        public String remain(){
            log.info("積分服務被調(diào)用了");
            Random random = new Random();
            int i = random.nextInt(100);
            return "您當前的積分為:" + i;
        }
    }


  4. 啟動項目并打開控制臺

    Nacos的作用是什么

    該信息是由my-sidecar注冊而來,而非my-integer所注冊的,因為my-integral并未集成Nacos

  5. my-order編寫調(diào)用代碼

    @RestController
    @RequestMapping("/order")
    public class OrderController {
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/integral")
        public String integral(){
            String url = "http://my-integral/integral/remain";
            return restTemplate.getForObject(url, String.class);
        }
    }


  6. 啟動my-order測試

    Nacos的作用是什么

    服務調(diào)用成功了

回顧一下我們做了什么:我們使用配置ip的奧秘將一個并未集成Nacos的my-integral信息注冊到了Nacos上,然后通過my-order成功發(fā)起了調(diào)用~

意義

這樣做有什么意義呢?難道真就為了騷一把?不是的。

假設我們現(xiàn)在有這樣的需求,有一個老項目old-project想要加入到微服務系統(tǒng)中,但是這個old-project集成Nacos的成本過高,那么我們就可以使用這樣的方式了。

這樣的方式支持非Java語言哦~

這里阿鑒偷偷告訴大家,這個方式其實有個術(shù)語,叫做:邊車模式。

Nacos的邊車模式

其實Nacos已經(jīng)實現(xiàn)了邊車模式,集成方式非常簡單

  1. 在原Nacos項目(my-sidecar)中引入依賴

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sidecar</artifactId>
    </dependency>


  2. 編寫配置

    server:
      port: 8082
    spring:
      application:
        name: my-sidecar
      main:
        allow-bean-definition-overriding: true
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.11:8850
            service: my-integral
    sidecar:
      ip: 127.0.0.1
      port: 8083
      health-check-url: http://127.0.0.1:8083/integral/health
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"

     

    ip:my-integral的IP

    port: my-integral的端口

    health-check-url: my-integral的健康檢查地址

  3. my-integral服務中增加接口

    @RestController
    @RequestMapping("/integral")
    public class IntegralController {
    
        @GetMapping("/health")
        public Map<String,String> health(){
            Map<String, String> map = new HashMap<>(2);
            map.put("status", "UP");
            return map;
        }
    }

     

    返回的內(nèi)容必須是:status: UP

  4. 測試

    Nacos的作用是什么

感謝各位的閱讀,以上就是“Nacos的作用是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Nacos的作用是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI