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.
PentingKelompok 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
Buat instance Nacos dalam VPC dan vSwitch yang sama dengan yang dikonfigurasi untuk koneksi langsung VPC.
Saat menerapkan layanan inferensi EAS, pastikan Anda menentukan Nacos yang akan dipasang.
EAS mendaftarkan pod yang terkait dengan layanan inferensi ke instance Nacos Anda.
Klien memulai pendengar pendaftaran layanan Nacos.
Nacos mendorong pembaruan ke daftar IP layanan EAS ke klien.
Klien menggunakan SDK untuk memilih instance (SDK mencakup algoritma penyeimbangan beban: round-robin berbobot).
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
|
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:

Konfirmasikan jumlah dan status instance dalam layanan:

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
SDK Python resmi untuk Nacos tidak mencakup algoritma penyeimbangan beban. Anda perlu mengimplementasikan round-robin berbobot sendiri.
Instal dependensi
pip install nacos-sdk-pythonMulai 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();
}
}
}