全部产品
Search
文档中心

Platform For AI:Memanggil layanan menggunakan Nacos

更新时间:Jul 06, 2025

Untuk layanan dengan permintaan per detik (QPS) tinggi seperti layanan gambar, mengaktifkan koneksi langsung VPC dapat secara signifikan meningkatkan Kinerja Akses dan mengurangi latensi. Namun, ini tidak memberikan kemampuan penyeimbangan beban di antara beberapa instance. Jika Anda sudah memiliki layanan mikro yang menggunakan Nacos, Anda dapat memanfaatkan Nacos untuk menerapkan kontrol akses. Topik ini menjelaskan cara memanggil layanan Elastic Algorithm Service (EAS) dengan memasang instance Nacos.

Prasyarat

  • Sebuah virtual private cloud (VPC), vSwitch, dan kelompok keamanan telah dibuat. vSwitch harus memiliki jumlah IP yang cukup tersedia. EAS akan mendaftarkan alamat IP dari instance layanan Anda pada antarmuka jaringan elastis (ENI). Untuk informasi lebih lanjut, lihat Membuat dan Mengelola VPC dan Mengelola Kelompok Keamanan.

    Penting

    Kelompok keamanan mengelola lalu lintas arah masuk dan arah keluar untuk Instance ECS, serta interaksi jaringan dengan instance layanan EAS. Secara default, instance dalam kelompok keamanan dasar yang sama dapat berinteraksi melalui VPC. Saat mengonfigurasi koneksi langsung VPC, pilih kelompok keamanan yang sesuai untuk Instance ECS yang memerlukan akses ke layanan EAS untuk memfasilitasi komunikasi antar-instance. Untuk mengaktifkan komunikasi antara kelompok keamanan yang berbeda, Anda harus mengonfigurasi aturan kelompok keamanan tersebut.

  • Koneksi langsung VPC telah diaktifkan untuk EAS. Untuk informasi lebih lanjut, lihat Konfigurasi Konektivitas Jaringan.

  • Instance Nacos tersedia, lihat Buat Instance.

  • VPC dan vSwitch tempat instance Nacos diterapkan sama dengan yang dikonfigurasi untuk koneksi langsung VPC.

Cara kerjanya

  1. Buat instance Nacos dalam VPC dan vSwitch yang sama dengan yang dikonfigurasi untuk koneksi langsung VPC.

  2. Saat menerapkan layanan inferensi EAS, pastikan Anda menentukan Nacos yang akan dipasang.

  3. EAS mendaftarkan pod yang terkait dengan layanan inferensi ke instance Nacos Anda.

  4. Klien memulai pendengar pendaftaran layanan Nacos.

  5. Nacos mendorong pembaruan ke daftar IP layanan EAS ke klien.

  6. Klien menggunakan SDK untuk memilih instance (SDK mencakup algoritma penyeimbangan beban: round-robin berbobot).

  7. Klien menggunakan IP dan port dari instance layanan yang disediakan oleh SDK untuk mengakses layanan dan memulai panggilan.

Mount Nacos

Untuk mengasosiasikan instance Nacos, sertakan parameter kunci berikut dalam file konfigurasi JSON saat menerapkan atau memperbarui layanan. Konfigurasi ini mendukung array, memungkinkan pendaftaran dengan beberapa instance Nacos secara bersamaan untuk skenario seperti pemulihan bencana. Contoh:

{
    "cloud": {
        "networking": {
            "security_group_id": "sg-*****",
            "vpc_id": "vpc-***",
            "vswitch_id": "vsw-****"
        }
    },
    "networking": {
        "nacos": [
            {
                "nacos_id": "mse_regserverless_cn-****"
            }
        ]
    }
}

Parameter

Deskripsi

cloud

networking

vpc_id

Aktifkan koneksi langsung VPC dengan mengonfigurasi VPC, vSwitch, dan kelompok keamanan.

Penting
  • Gunakan VPC yang sama dengan instance Nacos.

  • Pastikan segmen alamat IP dari vSwitch memiliki cukup IP.

vswitch_id

security_group_id

networking

nacos

id

ID dari instance Nacos yang dibuat.

Periksa pendaftaran layanan Nacos

Setelah penyebaran layanan berhasil, EAS akan mendaftarkannya dengan instance Nacos Anda. Detail pendaftaran:

  • cluster: Cluster DEFAULT

  • namespace: Namespace publik default

  • serviceName: Nama layanan Anda

  • groupName: Bidang statis yang dihasilkan sistem, pai-eas

Verifikasi akurasi informasi layanan yang dibuat:

挂载Nacos

Konfirmasikan jumlah dan status instance dalam layanan:

Nacos实例状态

Pemanggilan klien

Go

 package main

import (
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/v2/clients"
	"github.com/nacos-group/nacos-sdk-go/v2/clients/naming_client"
	"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
	"github.com/nacos-group/nacos-sdk-go/v2/model"
	"github.com/nacos-group/nacos-sdk-go/v2/util"
	"github.com/nacos-group/nacos-sdk-go/v2/vo"
	"strconv"
	"testing"
	"time"
)

var Clients = make(map[string]NacosClientManager)

type NacosClientManager struct {
	userId   string
	endPoint string
	client   naming_client.INamingClient
}

func NewAndGetNacosClient(userId string, endPoint string) (*NacosClientManager, error) {
	key := generateKey(userId, endPoint)
	client, exists := Clients[key]

	if exists {
		return &client, nil
	}

	client, exists = Clients[key]
	if exists {
		return &client, nil
	}

	newClient, err := clients.NewNamingClient(
		vo.NacosClientParam{
			ClientConfig: constant.NewClientConfig(
				constant.WithNamespaceId(""),
				constant.WithTimeoutMs(5000),
				constant.WithNotLoadCacheAtStart(true),
				constant.WithLogDir("/tmp/nacos/log"),
				constant.WithCacheDir("/tmp/nacos/cache"),
				constant.WithLogLevel("debug"),
			),
			ServerConfigs: []constant.ServerConfig{
				*constant.NewServerConfig(endPoint, 8848, constant.WithContextPath("/nacos")),
			},
		},
	)
	if err != nil {
		return nil, err
	}
	nacosClient := NacosClientManager{
		userId:   userId,
		endPoint: endPoint,
		client:   newClient,
	}
	Clients[key] = nacosClient
	return &nacosClient, nil
}

func (p *NacosClientManager) SelectOneHealthyInstance(param vo.SelectOneHealthInstanceParam) (*model.Instance, error) {
	instance, err := p.client.SelectOneHealthyInstance(param)
	if err != nil {
		return nil, fmt.Errorf("SelectOneHealthyInstance failed: %v", err)
	}
	fmt.Printf("SelectOneHealthyInstance success, param: %+v\n", param)
	return instance, nil
}

func (p *NacosClientManager) Subscribe(service string, group string) error {
	subscribeParam := &vo.SubscribeParam{
		ServiceName: service,
		GroupName:   group,
		SubscribeCallback: func(services []model.Instance, err error) {
			fmt.Printf("callback return services:%s \n\n", util.ToJsonString(services))
		},
	}
	return p.client.Subscribe(subscribeParam)
}

func generateKey(userId string, endPoint string) string {
	return userId + fmt.Sprintf("-%s", endPoint)
}

func Test(t *testing.T) {

	nacosClient, err := NewAndGetNacosClient("yourAliyunUid", "yourNacosEndpoint")
	if err != nil {
		panic(err)
	}

	nacosClient.Subscribe("your_service", "pai-eas")

	params := vo.SelectOneHealthInstanceParam{
		ServiceName: "your_service",
		GroupName:   "pai-eas",
	}
	
	instance, err := nacosClient.SelectOneHealthyInstance(params)
	fmt.Println(instance)

    // periksa info panggilan Anda sendiri di konsol dan ganti host dengan ip:port
	url := fmt.Sprintf("http://%s:%s/api/predict/xxxxxxx", instance.Ip, strconv.FormatUint(instance.Port, 10))
	fmt.Println(url)

    //todo panggil layanan melalui url
}    

Python

Catatan

SDK Python resmi untuk Nacos tidak mencakup algoritma penyeimbangan beban. Anda perlu mengimplementasikan round-robin berbobot sendiri.

Instal dependensi

pip install nacos-sdk-python

Mulai pemanggilan

# -*- coding: utf8 -*-
import nacos

# Konfigurasi server Nacos
SERVER_ADDRESSES = "yourNacosEndpoint"
NAMESPACE = ""  # Gunakan namespace default jika kosong
SERVICE_NAME = "your_service"
GROUP_NAME = "pai-eas"

# Buat klien Nacos
client = nacos.NacosClient(SERVER_ADDRESSES, namespace=NAMESPACE)


def callback(args):
    print(args)


if __name__ == '__main__':
    # Teruskan fungsi callback dengan benar sebagai daftar
    client.add_config_watchers(SERVICE_NAME, "pai-eas", [callback])

    # Ambil dan cetak detail instance penamaan
    b = client.list_naming_instance(SERVICE_NAME, None, None, GROUP_NAME, True)
    print(b)
    if b"hosts":
        print("ip", b["hosts"][0]["ip"])
        ip = b["hosts"][0]["ip"]
        port = b["hosts"][0]["port"]
        # periksa info panggilan Anda sendiri di konsol dan ganti host dengan ip:port
        url = f"http://{ip}:{port}/api/predict/xxxxxxx"
        print(url)
     #todo panggil layanan melalui url        

Java

Tambahkan dependensi Maven

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>2.3.2</version>
</dependency>

Mulai pemanggilan

package test;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;



import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.AbstractEventListener;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.EventListener;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;

public class NacosTest {
    public static void main(String[] args) {
        try {
            String serverAddr = "yourNacosEndpoint:8848";
            NamingService namingService = NacosFactory.createNamingService(serverAddr);

            ExecutorService executorService = Executors.newFixedThreadPool(1);
            EventListener serviceListener = new AbstractEventListener() {
                @Override
                public void onEvent(Event event) {
                    if (event instanceof NamingEvent) {
                        System.out.println(((NamingEvent) event).getServiceName());
                        System.out.println(((NamingEvent) event).getGroupName());
                    }
                }

                @Override
                public Executor getExecutor() {
                    return executorService;
                }
            };
            namingService.subscribe("your_service", "pai-eas", serviceListener);
            Instance instance = namingService.selectOneHealthyInstance("your_service", "pai-eas");
            System.out.println(instance.getIp());
            System.out.println(instance.getPort());
            // periksa info panggilan Anda sendiri di konsol dan ganti host dengan ip:port
            String url = String.format("http://%s:%d/api/predict/xxxxxxx", instance.getIp(), instance.getPort());
            System.out.println(url);
            
            //todo panggil layanan melalui url
            
        } catch (NacosException e) {
            e.printStackTrace();
        }
    }
}