All Products
Search
Document Center

Platform For AI:Memanggil layanan dengan penemuan Nacos

Last Updated:Jul 16, 2026

Untuk layanan ber-QPS tinggi dan lalu lintas tinggi seperti layanan gambar, memanggil layanan melalui koneksi langsung VPC secara signifikan meningkatkan performa dan mengurangi latensi. Namun, metode ini tidak menyediakan load balancing di antara beberapa instans layanan. Jika Anda telah menggunakan Nacos dalam arsitektur microservice Anda, Anda dapat mengintegrasikannya dengan EAS untuk mengelola akses layanan dan mengaktifkan load balancing sisi klien. Topik ini menjelaskan cara memanggil layanan EAS dengan mengaitkannya ke instans Nacos.

Penting

Integrasi Nacos saat ini tidak mendukung routing cerdas untuk LLM.

Cara kerja

  1. Setelah Anda mengonfigurasi VPC untuk layanan EAS, sistem menetapkan alamat IP VPC ke setiap Pod layanan tersebut.

  2. EAS mendaftarkan Pod dari layanan inferensi ke instans Nacos terkait.

  3. Klien berlangganan event pendaftaran layanan dari Nacos.

  4. Nacos mendorong perubahan pada daftar alamat IP layanan EAS ke klien.

  5. Klien menggunakan SDK untuk memilih sebuah instans. SDK tersebut mencakup algoritma load balancing weighted round-robin (WRR) bawaan.

  6. Klien menggunakan alamat IP dan Port yang dikembalikan oleh SDK untuk memanggil layanan.

Metode konfigurasi

Konfigurasi Konsol

Pada halaman konfigurasi penerapan, di bagian Network Information, konfigurasikan VPC dan aktifkan Service Discovery Nacos.

  1. Konfigurasi VPC. Untuk mengaitkan dengan Nacos, Anda harus mengonfigurasi VPC, vSwitch, dan security group untuk layanan EAS. Jika belum membuatnya, lihat Create and manage a VPC dan Manage security groups.

    • Instans Nacos harus berada dalam VPC dan vSwitch yang sama dengan layanan EAS.

    • Pastikan Blok CIDR vSwitch memiliki cukup alamat IP yang tersedia.

      Penting

      Aturan security group mengontrol akses jaringan antara klien, seperti Instance ECS, dan layanan PAI-EAS.

      • Secara default, instans dalam security group dasar yang sama dapat saling berkomunikasi melalui jaringan internal. Anda dapat menempatkan klien dan layanan PAI-EAS dalam security group yang sama.

      • Jika klien dan layanan PAI-EAS harus menggunakan security group berbeda, Anda harus mengonfigurasi aturan untuk mengizinkan komunikasi di antara keduanya. Untuk informasi lebih lanjut, lihat Allow access between instances in different security groups in a classic network.

  2. Aktifkan Service Discovery Nacos dan pilih instans Nacos dari kotak dialog yang muncul. Jika belum memiliki instans, Create an MSE registry instance terlebih dahulu.

    • Anda dapat mengaitkan beberapa instans Nacos ke satu layanan untuk disaster recovery. Layanan tersebut akan didaftarkan ke semua instans terkait.

Konfigurasi JSON

Parameter JSON berikut diperlukan untuk mengaitkan instans Nacos. Untuk informasi lebih lanjut tentang setiap parameter, lihat Configure in the console.

Parameter

Deskripsi

cloud

networking

vpc_id

ID VPC, vSwitch, dan security group untuk layanan EAS.

vswitch_id

security_group_id

networking

nacos

nacos_id

ID instans Nacos yang telah Anda buat.

Contoh konfigurasi:

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

Verifikasi pendaftaran layanan

Setelah layanan diterapkan, EAS mendaftarkannya ke instans Nacos terkait. Informasi pendaftarannya adalah sebagai berikut:

  • cluster: Default ke kluster DEFAULT.

  • namespace: namespace publik default.

  • serviceName: Nama layanan Anda.

  • groupName: Nilai yang dihasilkan sistem: pai-eas.

Verifikasi bahwa jumlah instans dan statusnya benar:

Di tab Providers pada halaman detail layanan, pastikan Health Status dan Online/Offline Status instans keduanya normal (hijau), dan Weight-nya 100.

Pemanggilan dari 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)

    // Ganti host dengan alamat IP dan port dari informasi pemanggilan Anda di Konsol.
	url := fmt.Sprintf("http://%s:%s/api/predict/xxxxxxx", instance.Ip, strconv.FormatUint(instance.Port, 10))
	fmt.Println(url)

    // TODO: Panggil layanan menggunakan URL tersebut.
}    

Python

Catatan

SDK Python Nacos resmi tidak memiliki algoritma load balancing bawaan, sehingga Anda harus mengimplementasikannya sendiri, misalnya weighted round-robin.

Instal dependensi

pip install nacos-sdk-python

Panggil layanan

# -*- 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__':
    # Berikan fungsi callback sebagai daftar
    client.add_config_watchers(SERVICE_NAME, "pai-eas", [callback])

    # Ambil dan cetak detail instans naming
    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"]
        # Ganti host dengan alamat IP dan port dari informasi pemanggilan Anda di Konsol.
        url = f"http://{ip}:{port}/api/predict/xxxxxxx"
        print(url)
     # TODO: Panggil layanan menggunakan URL tersebut.        

Java

Tambahkan dependensi Maven

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

Panggil layanan

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());
            // Ganti host dengan alamat IP dan port dari informasi pemanggilan Anda di Konsol.
            String url = String.format("http://%s:%d/api/predict/xxxxxxx", instance.getIp(), instance.getPort());
            System.out.println(url);
            
            // TODO: Panggil layanan menggunakan URL tersebut.
            
        } catch (NacosException e) {
            e.printStackTrace();
        }
    }
}