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.
Integrasi Nacos saat ini tidak mendukung routing cerdas untuk LLM.
Cara kerja
Setelah Anda mengonfigurasi VPC untuk layanan EAS, sistem menetapkan alamat IP VPC ke setiap Pod layanan tersebut.
EAS mendaftarkan Pod dari layanan inferensi ke instans Nacos terkait.
Klien berlangganan event pendaftaran layanan dari Nacos.
Nacos mendorong perubahan pada daftar alamat IP layanan EAS ke klien.
Klien menggunakan SDK untuk memilih sebuah instans. SDK tersebut mencakup algoritma load balancing weighted round-robin (WRR) bawaan.
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.
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.
PentingAturan 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.
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
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-pythonPanggil 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();
}
}
}