本文介绍了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服务
- 登录容器服务控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目目标集群右侧操作列下的应用管理。
- 在集群管理页面左侧导航栏选择,选择集群的命名空间,单击使用YAML创建资源。
- 在创建页面选择示例模板,并在模板区域编辑创建应用的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应用。
部署多语言服务
关于部署多语言服务的具体操作,请参见部署多语言微服务应用。
- 在集群管理页面左侧导航栏选择,选择集群的命名空间,单击使用YAML创建资源。
- 在创建页面选择示例模板,并在模板区域编辑创建应用的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服务和多语言服务互通的环境变量
- 登录容器服务控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目目标集群右侧操作列下的应用管理。
- 在集群管理页面左侧导航栏选择,选择集群命名空间为ARMS-pilot ,选择对应ARMS pilot应用操作列的编辑。
- 在环境变量区域单击新增,添加以下环境变量,然后单击右侧的更新。
新增环境变量如下:
profile.micro.service.envoy.xds.enable:true
- 在无状态应用列表页面,选择Spring Cloud应用的命名空间,然后单击目标应用操作列下的编辑。
- 在环境变量区域单击新增,添加以下环境变量和JVM应用的启动参数,然后单击右侧的更新。
新增环境变量和参数如下:
- profile.micro.service.envoy.xds.server:
istiod.istio-system:15012
- profile.micro.service.envoy.xds.enable:
true
互相调用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]