本文介绍了EDAS如何实现多语言应用与Java Spring Cloud服务的互通。

背景信息

随着非Java服务越来越多,Java服务与非Java服务(例如C++、Go、Python等)实现互通的需求也越来越迫切。针对这一问题EDAS提供了多语言服务和Java Spring Cloud服务互通的能力,帮助您完美应对此类场景。EDAS多语言互通服务架构图如下:

应用托管概览
  • Java应用通过Agent获取服务网格中的多语言服务发现数据。
  • Java应用通过多语言应用的服务名调用多语言应用。

前提条件

须同时满足以下条件:

操作指南

  • 场景一:Java Spring Cloud服务调用多语言应用

    Java Spring Cloud服务调用多语言应用的模式与Java应用之间互相调用的模式一样,如示例代码中通过restTemplate来调用Spring Cloud服务(应用名称为go-sc-a)的A接口:

    restTemplate.getForObject("http://go-sc-a/A", String.class)

    您也可以使用其他方式来实现调用,不需要对应服务的端口号,即可直接访问。

  • 场景二:多语言应用调用Java服务

    多语言应用调用Java服务,可以直接使用Java服务的K8s Service实现调用。

部署Spring Cloud服务和多语言服务

部署Spring Cloud服务

  1. 登录容器服务控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目目标集群右侧操作列下的应用管理
  4. 在集群管理页面左侧导航栏选择工作负载 > 无状态,选择集群的命名空间,单击使用YAML创建资源
  5. 创建页面选择示例模板,并在模板区域编辑创建应用的YAML文件,然后单击创建

    部署Spring Cloud应用的YAML模板如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: sc-c
      name: sc-c
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: sc-c
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
            msePilotAutoEnable: "on"
            msePilotCreateAppName: "sc-c"
          labels:
            app: sc-c
        spec:
          containers:
            - env:
                - name: throwException
                  value: 'true'
                - name: JAVA_TOOL_OPTIONS
                  value: '-Dspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848' //请替换成应用实际注册的Nacos地址。
                - name: profile.micro.service.envoy.xds.server
                  value: 'istiod.istio-system:15012'
                - name: profile.micro.service.envoy.xds.enable
                  value: 'true'
              image: >-
                registry.cn-hangzhou.aliyuncs.com/alibabacloud-microservice-demo/sc-c:demo
              imagePullPolicy: Always
              name: sc-c
              resources:
                requests:
                  cpu: 250m
                  memory: 512Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    -----
    
    apiVersion: v1
    kind: Service
    metadata:
      name: sc-c
      labels:
        app: sc-c
        service: sc-c
    spec:
      ports:
      - port: 20003
        name: http
      selector:
        app: sc-c
    您可在无状态页面下查看所创建的Spring Cloud应用。

部署多语言服务

  1. 在集群管理页面左侧导航栏选择工作负载 > 无状态,选择集群的命名空间,单击使用YAML创建资源
  2. 创建页面选择示例模板,并在模板区域编辑创建应用的YAML文件,然后单击创建

    部署多语言应用的YAML模板如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        version: v1
      name: go-sc-a-v1
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          version: v1
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: go-sc-a
            version: v1
        spec:
          containers:
            - env:
                - name: LOG_DIR
                  value: /tmp/logs
              image: 'registry.cn-hangzhou.aliyuncs.com/edas_test1/helloa:demo'
              imagePullPolicy: IfNotPresent
              name: go-sc-a
              ports:
                - containerPort: 8085
                  protocol: TCP
              resources: {}
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                - mountPath: /tmp
                  name: tmp
                - mountPath: /opt/ibm/wlp/output
                  name: wlp-output
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
            - emptyDir: {}
              name: wlp-output
            - emptyDir: {}
              name: tmp
              
    -----
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: go-sc-a
        service: go-sc-a
      name: go-sc-a
      namespace: default
    spec:
      ports:
      - port: 8085
        name: http
      selector:
        app: go-sc-a
    您可在无状态页面下查看所创建的多语言应用。

配置支持Spring Cloud服务和多语言服务互通的环境变量

  1. 登录容器服务控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目目标集群右侧操作列下的应用管理
  4. 在集群管理页面左侧导航栏选择工作负载 > 无状态,选择集群命名空间ARMS-pilot ,选择对应ARMS pilot应用操作列的编辑
  5. 环境变量区域单击新增,添加以下环境变量,然后单击右侧的更新

    新增环境变量如下:

    profile.micro.service.envoy.xds.enabletrue

  6. 无状态应用列表页面,选择Spring Cloud应用的命名空间,然后单击目标应用操作列下的编辑
  7. 环境变量区域单击新增,添加以下环境变量和JVM应用的启动参数,然后单击右侧的更新

    新增环境变量和参数如下:

    • profile.micro.service.envoy.xds.serveristiod.istio-system:15012
    • profile.micro.service.envoy.xds.enabletrue

互相调用Spring Cloud服务和多语言服务

Spring Cloud服务与服务网格的多语言服务可以实现互通,且Spring Cloud服务调用多语言服务的方式和Java调用一致,您不需要修改任何代码。

Spring Cloud服务调用多语言服务

Spring Cloud服务访问多语言服务:
curl localhost:20003/go
说明 您可以在Java服务内部通过访问自身服务接口来访问多语言服务。
返回结果如下:
[Java Spring Cloud ] -> [Service Mesh APP10.191.XX.XX ]

多语言服务调用Spring Cloud服务

多语言服务访问Spring Cloud服务:
curl localhost:8085/java
返回结果如下:
[ Service Mesh APP ] -> [Java Spring Cloud10.191.XX.XX]