Dubbo是一个开源分布式框架,致力于提供高性能和透明化的远程服务调用方案。遵循Dubbo框架的服务即为Dubbo服务。您可以通过ASM专业版托管Dubbo服务,从而可以对Dubbo服务进行流量管理。本文介绍如何通过ASM托管Dubbo服务。

前提条件

背景信息

以下是ASM托管Dubbo服务后的架构示意图,其中Istiod就是托管的ASM实例。注册中心可以采用Nacos、Zookeeper、Eureka等。 Istiod通过MCP over XDS协议对接注册中心,同步服务信息到Sidecar。MSE的Nacos原生支持MCP协议,您只需要在开通ASM实例时开启Nacos注册中心功能,推荐使用MSE的Nacos。

Dubbo服务框架

步骤一:创建服务注册中心

  1. 创建1.2.1及以上版本的Nacos引擎。具体操作,请参见创建Nacos引擎
  2. 开启MCP功能。
    说明 仅1.2.1及以上版本的Nacos引擎支持开启MCP功能。
    1. 登录MSE管理控制台
    2. 在左侧导航栏选择注册配置中心 > 实例列表
    3. 实例列表页面单击具体实例名称。
    4. 实例详情页面左侧菜单栏选择参数设置
    5. 单击编辑,在MCPEnabled参数下方选择,然后单击保存并重启实例
  3. 如果当前Dubbo应用服务采用其他注册中心,您可以通过迁移工具同步到MSE Nacos。具体操作,请参见如何将Dubbo应用的注册中心迁移至MSE

步骤二:创建ASM专业版

  1. 创建ASM专业版。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 网格管理页面单击创建新网格
    5. 创建新网格面板配置参数,以下为重点参数说明,其他参数,请参见创建ASM实例
      参数 说明
      规格 选择专业版
      Nacos注册服务 选中Nacos注册服务,然后选择Nacos引擎。
      说明 Nacos引擎需要与ASM实例处于同一VPC,不然无法选择到Nacos引擎。
    6. 了解和接受服务协议,并已阅读和同意阿里云服务网格服务条款和免责声明,选中该选项。然后单击确定
  2. 开启Sidecar自动注入。具体操作,请参见多种方式灵活开启自动注入
  3. 添加ACK集群到ASM。具体操作,请参见添加集群到ASM实例
  4. 部署默认入口网关。具体操作,请参见添加入口网关服务

步骤三:在ACK集群部署Dubbo服务

在ACK中部署一个consumer服务,一个v1版本provider服务,一个v2版本provider服务。consumer
  1. 通过kubectl工具连接集群
  2. 执行以下命令,部署Dubbo服务。
    说明 关于Dubbo服务的YAML文件,请参见dubbo-nacos-example
    export NACOS_ADDRESS=xxxx # xxxx为MSE的Nacos地址,建议使用内网地址。
    curl https://raw.githubusercontent.com/AliyunContainerService/asm-labs/main/dubbo/dubbo-nacos-example/demo.yaml 
    sed -e "s/_NACOS_SERVER_CLUSTERIP_/$NACOS_ADDRESS/g" demo.yaml |kubectl apply -f - 
  3. 执行以下命令,查看部署结果。
     kubectl get pods

    预期输出:

    NAME                           READY   STATUS    RESTARTS   AGE
    consumer-7448bc59b7-p9gt8      2/2     Running   0          5d20h
    provider-v1-5f4496cfd-77cjq    2/2     Running   0          5d20h
    provider-v2-6d7d59fcc4-7gcq4   2/2     Running   0          5d20h

步骤四:创建ASM自定义资源

  1. 通过kubectl连接ASM实例
  2. 部署网关规则虚拟服务
    1. 使用以下内容,创建名为gateway的YAML文件。
      ---
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: test-gateway
      spec:
        selector:
          istio: ingressgateway # use istio default controller
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
      
      ---
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: consumerhttp
      spec:
        hosts:
        - "*"
        gateways:
        - test-gateway
        http:
        - match:
          - uri:
              prefix: /com.alibaba.edas.DemoService
          route:
          - destination:
              host: consumer.default.svc.cluster.local
              port:
                number: 8080
    2. 执行以下命令,部署网关规则虚拟服务
      kubectl apply -f gateway.yaml

结果验证

  1. 查看Ingress Gateway的IP地址。
    1. 登录ASM控制台
    2. 在左侧导航栏,选择服务网格 > 网格管理
    3. 网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理
    4. 在网格详情页面左侧导航栏单击ASM网关,在ASM网关页查看Ingress Gateway Kubernetes服务下的IP地址。
  2. 执行以下命令,通过Ingress Gateway向Dubbo服务发起请求。
    curl <Ingress Gateway的IP地址>/com.alibaba.edas.DemoService0/sayHello

    预期输出:

    Genervice Service v1 implement, invoke method:sayHello