全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用Java SDK操作Istio資源

更新時間:Jun 30, 2024

通過整合對應語言的SDK Client,您可以在代碼中直接操作Istio資源。本文以Java 11和SDK fabric8io/istio-client 6.0.0-RC1版本為例,介紹如何使用Java SDK操作Istio資源。

前提條件

準備工作

安裝依賴

Maven設定檔pom.xml中添加如下依賴項。
<dependencies>
  <dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>istio-client</artifactId>
    <version>6.0.0-RC1</version>
  </dependency>
</dependencies>

配置串連

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在網格詳情頁面左側導覽列單擊基本資料,然後在右側頁面單擊串連配置
  5. 串連配置面板,複製檔案內容到$HOME/.kube/config路徑下。
    說明 串連預設使用系統Kube Config檔案,如需指定使用特定的Kube Config檔案,請參考建立網關規則

組建組態檔案

在代碼中使用SDK操作Istio資源頁面建立的virtualService.yaml和gateway.yaml檔案儲存到專案靜態資源檔案夾中。
說明 對於Maven專案,預設為src/main/resources檔案夾。

建立虛擬服務

使用JAVA istio-client建立Istio資源時,您可以選擇使用YAML檔案或鏈式調用的方式。建立虛擬服務的具體操作步驟如下:

方式一:使用YAML檔案建立虛擬服務

import java.io.FileReader;
import java.io.IOException;

import io.fabric8.istio.api.networking.v1beta1.VirtualService;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.utils.IOHelpers;

public class VirtualServiceExample {
    public static void main( String[] args ) {
        IstioClient istioClient = new DefaultIstioClient();
        final String NAMESPACE = "default"; // 建立資源的命名空間。
        VirtualService virtualService = istioClient.v1beta1().virtualServices().load(
            VirtualServiceExample.class.getResourceAsStream("/virtualService.yaml")
            ).get();
        istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(virtualService).create();
        printAllVirtualServices(istioClient);
        istioClient.close();
    }


    // 列印網格中所有的VirtualService。
    static void printAllVirtualServices(IstioClient istioClient) {
        istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
    }
}

方式二:使用鏈式調用建立虛擬服務

istio-client提供了鏈式調用的能力,支援以純程式碼的方式建立虛擬服務。

import io.fabric8.istio.api.networking.v1beta1.VirtualServiceBuilder;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;

public class VirtualServiceChainingExample {
    public static void main(String[] args) {
        IstioClient istioClient = new DefaultIstioClient();
        final String NAMESPACE = "default";
        istioClient.v1beta1().virtualServices().inNamespace(NAMESPACE).resource(
            new VirtualServiceBuilder()
            .withNewMetadata()
            .withName("bookinfo")
            .endMetadata()
            .withNewSpec()
                .addToHosts("*")
                .addToGateways("bookinfo-gateway")
                .addNewHttp()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/productpage").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchPrefixType("/static").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/login").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchExactType("/logout").endUri().endMatch()
                    .addNewMatch().withNewUri().withNewStringMatchPrefixType("/api/v1/products").endUri().endMatch()
                    .addNewRoute()
                        .withNewDestination()
                            .withHost("productpage")
                            .withNewPort()
                                .withNumber(9080)
                            .endPort()
                        .endDestination()
                    .endRoute()
                .endHttp()
            .endSpec()
            .build()
            ).create();
        printAllVirtualServices(istioClient);
        istioClient.close();
    }

    // 列印網格中所有的VirtualService。
    static void printAllVirtualServices(IstioClient istioClient) {
        istioClient.v1beta1().virtualServices().list().getItems().forEach(System.out::println);
    }
}

建立網關規則

使用指定的Kube Config檔案配置串連後,您可以在default命名空間建立gateway.yaml指定的網關規則。下文以使用YAML檔案建立網關規則為例,鏈式調用請參考方式二:使用鏈式調用建立

import java.io.FileReader;
import java.io.IOException;

import io.fabric8.istio.api.networking.v1beta1.Gateway;
import io.fabric8.istio.client.DefaultIstioClient;
import io.fabric8.istio.client.IstioClient;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.utils.IOHelpers;

public class GateWayExample {
    public static void main(String[] args) throws IOException {
        // 讀取Kube Config串連設定檔。
        String kubeconfigContents = null;
        FileReader reader = new FileReader("{path to kube config file}"); // 將{}內容替換成Kube Config實際路徑。
        kubeconfigContents = IOHelpers.readFully(reader);
        Config config = Config.fromKubeconfig(null, kubeconfigContents, null);

        IstioClient istioClient = new DefaultIstioClient(config);
        final String NAMESPACE = "default"; // 建立資源的命名空間。
        Gateway gateway = istioClient.v1beta1().gateways().load(
            GateWayExample.class.getResourceAsStream("/gateway.yaml")
        ).get();
        istioClient.v1beta1().gateways().inNamespace(NAMESPACE).resource(gateway).create();
        printAllGateways(istioClient);
        istioClient.close();
    }

    // 列印網格中所有的Gateway。
    static void printAllGateways(IstioClient istioClient) {
        istioClient.v1beta1().gateways().list().getItems().forEach(System.out::println);
    }
}

後續步驟

虛擬服務和網關規則建立完成後,您可以在瀏覽器中訪問http://{入口網關服務的IP地址}/productpage,查看Bookinfo應用。