这个云原生开发的痛点你遇到了吗?

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
简介: 上云从来都不是一片坦途,在此过程中我们总会遇到一些困难和挑战,得益于云原生技术的日益成熟,这些问题一定会有相应的解法。

作者:纳海

端云互联最佳实践:https://help.aliyun.com/document_detail/200032.html


背景  

在云原生时代,国内外众多云厂商释放出强大的技术红利,如何利用廉价、稳定且高效的云设施是当今的一个主要命题。在云上,我们可以很方便地创建虚拟网络、虚拟机、数据库、消息队列等基础设施和中间件,也可以使用容器服务、EDAS、SAE、函数计算等PaaS和Serverless服务来减轻应用管控的压力。


但事情并不是一帆风顺的。应用上云已是历史大潮不可阻挡,但随之而来开发者很快就体会到上云的另一面:由云上和云下网络不通所带来的开发体验割裂感。在上云之前,开发者可以在本地完成代码开发、测试、联调等开发流程闭环;而上云之后,数据库、缓存、消息队列和其他微服务应用都部署在云上的虚拟网络之中,我们再无法在本地完成开发流程。


截屏2021-04-23 下午5.11.40.png

云上网络

云下网络

注册中心

....

运行

访问

微服务应用

微服务应用

微服务应用

微服务应用

微服务应用

微服务应用

访问

微服务应用

开发人员

数据库

消息队列

缓存

云服务


如果是中东土豪,他可能会考虑使用物理专线来打通网络。因为他只需支付光纤铺设费、楼内光缆租赁费、端口占用费、流量费等百万量级的钱,同时说服安全团队来允许完全打通环境而已。


如果是专业运维人员,他可能会考虑搭建VPN来打通网络。当他花费精力搭建VPN服务器,发现同事们还是用不起来,纷纷抱怨:


  • “一打开VPN,整个本地系统网络流量都转发到云端了,其他事情干不了啦!”
  • “除了配置VPN,还要配置应用运行参数,太麻烦了!”
  • “云端服务怎么调用不了本地服务,云端网络路由添加了吗?”
  • ...

 

看到这些问题,运维小哥内心也感到心累...


而现在,我们提供了一个开箱即用的插件工具,无需你花费大量的金钱或者人力。你所需要的只是在IDE中一键开启开关,然后通过IDE所启动的应用就能访问到云端环境里的数据库、MQ、缓存和其他微服务。所有的事情都由插件来帮你完成。


介绍

这款工具是我们自主研发的“端云互联”插件,“端”指的是开发端,“云”指的是云上网络,通过某种方式实现“端”和“云”的双向互通,并且没有传统VPN的问题。


截屏2021-04-27 上午10.12.45.png

云下网络

云上网络

注册中心

运行

**肉肉**白肉商

微服务应用

微服务应用

微服务应用

微服务应用

微服务应用

微服务应用

微服务应用

端云互联

开发人员

数据库

消息队列

云服务

缓存


端云互联功能集成在Alibaba Cloud Toolkit(简称ACT)这个上云工具产品中,并支持Intellij IDEA和Eclipse两款IDE。你只需在插件市场中搜索“Alibaba Cloud Toolkit”进行安装即可,例如在Intellij IDEA中搜索如下:


截屏2021-04-20 下午10.33.25.png

Preferences

Plugins

lnstalled

Marketplace

AlibabaCloudToolkit

x

Appearance&Behavior

AlibabacloudToolkit

lnstalled

AlibabaCloudToolkit

SortBy:Relevance

SearchResults(1)

380.1K4.50AlibabaCloud

Keymap

AlibabaCloudToolkit

InSTalled

4月16,2021

CloudSupport2021.4.1

Editor

出380.1K4.50

宿

Plugins

Pluginhomepage

VersionControl

BUILDExecution

AlibabaCloudToolkitisapluginforIDEssuchsEclipseorIntelli

IDEA.Helpdevelopersdevelopmoreefficientlyde

Languages&Frameworks

diagnose,lplictioraloo

Tools

operations

WhyuseAlibabaCloudToolkit?

Zerocost:Freeforalldeveloper

Extremelyefficient:Easytomanageyourcode,a

getridofpastrecurringdeploymentmethods,lug-in

automateddeployment

Fourusescenriosildcogquicl

Managedcode.Withthisplugic

associateremotecoderepositoriesfom

codereviewmgeqsdmore

DeploytoEcS.Thereisnoneedtoswitchbetween

Maven,Gitah&i

developerscanconfigureitonagraphicalinterfaceto

deployapplicationstoEcsinasustainableand

convenientmanner.

DeploytoEDAS.EnterpriseDistributedApplication

ServicesEDASisaPaasplatformforapplicationsand

microservicesthatoffersawiderangeofapplication

deliveryandlightweighticlti

AlibabaCloudEDASdevelopers,ocllicationsand

clouddeploymentshavebeenopenedontheplugin.

Cancel

Apply


我们在2018年就开始了端云互联项目的研发,这个过程中迭代了大大小小的版本,共经历了三个里程碑,至今有数十万人次的使用。下面来介绍它的特性支持和实现原理。


端云互联1.0


1.0阶段解决了本地和云端双向互联的问题,使得本地服务不仅仅可访问云端资源,还可以跟云端服务互相通信。


双向互联


以下为端云互联的核心架构,整体分为两个模块:通道服务和代理机。


截屏2021-04-27 上午10.39.10.png

云上网络

云下网络

注册

注册中心

发现

调用

加密通道

运行

流量

微服务应用

微服务应用

微服务应用

代理机

微服务应用

通道服务

调用

流量

微服务应用

微服务应用

微服务应用

开发人员

访问

数据库

缓存

消息队列

云服务


其中,模块功能如下:


  • 代理机:负责云端的流量转发。端云互联方案对代理机的要求很低,一台普通规格的ECS就可以充当“乞丐版”的代理机。并且,Debian、Ubuntu、Redhat等Linux系统已经包含端云互联所依赖的底层库,无需额外安装其他软件。
  • 通道服务:负责本地的流量转发。当我们打开端云互联开关并启动应用时,插件会在本地拉起一个通道服务进程。这个进程的职责非常简单,它只负责本地应用和云端代理机之间的流量转发,无其他操作。


通道服务和代理机之间是使用加密通道来通信的,中间人无法窃取通道中的数据。而在微服务应用中,我们结合Java原生的代理参数和自研的流量拦截方案来将应用的流量转发至通道服务。


开发人员在IDE中启动应用时,端云互联插件会自动拉起通道服务,并注入相关参数至应用中。启动后,应用流量自动转发至通道服务,无需人工干预。


从架构上来看,端云互联跟VPN有点类似,都分为服务端和客户端。但实际上,两者有很大的差异,下图进行了对比总结:

截屏2021-04-27 上午11.10.13.png


其中,在“云端访问本地”这一点上,虽然两者都支持,但具体原理并不相同。如果采取VPN方案,那么其他云端服务访问本地服务时,需要手动配置网络路由,否则网络不可达。而端云互联通过改造微服务框架,可使得云端服务调用代理机,再通过代理机转发到本地应用中,无需设置网络路由。在易用性和安全性上,端云互联都优于VPN。


端云互联2.0


在1.0阶段,我们实现了本地和云端的双向互通,这满足了最基本的开发需求。在实际业务中,客户提出了更高的要求。


我们一个客户有庞大的研发团队,他们都使用端云互联进行开发,但在联调时发现一个问题:研发人员A发起的服务调用有时候调到别的节点去了,没有到所期望的研发人员B的本地节点上。这个问题是由于微服务框架的路由机制引起的,当环境中一个服务存在多个节点时,会使用随机(或轮流)算法来进行调用。微服务模块越多,链路越长,这个问题就越严重。


在2.0中,我们提供了多人精准联调能力,此能力可使得服务请求“指哪打哪”,可大幅提高服务联调效率。除此之外,我们还提供基于代理的远程调试能力,方便本地对云端环境中的微服务节点进行调试,提高调试效率。


同时,通过横向产品支持,端云互联2.0可服务于云原生产品EDAS、SAE和MSE等开发者,受到广泛好评。


多人精准联调


下图描述了多人联调的一个典型场景:


截屏2021-04-27 下午2.26.58.png

服务B

服务A

节点

节点

请求

上游

中间

流量

服务

请求

服务

节点

节点

请求

云端

端云互联

端云互联

本地

启动

启动

节点

节点

小王

小张


小王负责服务A,小张负责服务B,在一次需求迭代中他们完成了代码开发,正在进行联调。由于微服务框架使用随机(或轮流)策略进行调用,导致了两个问题:


  • 测试同学小马正在环境中进行功能测试,测试请求调用到小王和小张的本地节点上来了,导致测试不符合预期;
  • 小王发起的测试请求调到其他节点去了,没到他和小张的节点上,联调效率很低;


通过多人精准联调能力,可以使得只有小王发起的请求调到他的本地节点和小张的本地节点,而测试小马的请求只在云端稳定环境中调用。


小王和小张需要做的事情比较简单,他们只需要在控制台开启全链路流控功能,创建一个用于测试的流控环境。流控环境可配置请求识别规则,可通过Cookie、Header、请求参数等维度来判断是否为测试请求,如果判断通过则将请求调用到该环境中的节点中去。


然后小王和小张在IDE中将本地节点添加到这个测试环境中去即可,如下所示:


6E7B7D99-B019-405E-865D-6C2B08AF70E1.png

Preferences

Microservice

AlibabaCloudToolkitMicroservice

Reset

Appearance&BeHavior

配置粒度:

项目:dubbo-spring-boot-provider

AlibabaCloudToolkit

您只需配置项目粒度即可使用;对于多模块工程,可以单独设置模块粒度以覆盖项目粒度配置.

Appearance&Behavior

Accounts

使用本地注册中心

SSHProfile

开源Nacos(Dubbo/SpringCloud)

轻量级注册中心(HSF)

HostTag

本地注册中心会随着应用自动启停,您也可以通过下面操作按钮来对本地注册中心进行手动管理:

Docker

Microservice

停止

启动

Microservice

加入自建Nacos注册中心

请填写注册中心的域名或IP

Proxy

高级配置一键诊断帮助文档

端云互联

ApsaraStack

订阅并注册到云端注册中心,本地服务可以跟云端服务互相调用;

lmport&ExportSetings

比如:本机Consumer可以调用云端微服务;云端Consume可以调用本机微服务;

Code

只订阅云端服务,不注册本地服务

Keymap

Editor

企业级分布式应用服务(EDAS)

产品:

Plugins

华东1(杭州)

云端互联环境:

VersionControl

宿

BUILDExECUTIONDLYMET

本地服务归属应用

Languages&Frameworks

SpringCloud应用必填项,其他服务类型忽略

本地SpringCloud服务端口:

Tools

初始化代理...

代理:

加入全链路流控(铂金版适用)

本地服务归属灰度分组

Selectangraygroup

Selectangraygroup

测试环境

稳定环境

OK

Apply

Cancei


这样配置完成后,那么只有符合特征的请求才会调用到小王和小张的节点,下图中只有Header包含“测试”的请求才会到他们节点中:


截屏2021-04-27 下午3.27.07.png

服务A

服务B

小马

节点

节点

请求

上游

其他流量

中间

其他流量

服务

请求

服务

Header-测试

节点

节点

请求

云端

端云互联

端云互联

本地

启动

启动

节点

节点

小张

小王


远程调试


远程调试(Remote Debug)一直都是排查问题的重要手段,但在云原生环境里远程调试并不是一件简单的事情。这是因为在默认情况下云上的微服务节点通常不能被公网访问,如果需要进行远程调试,我们需要对目标节点开放公网访问,并且设置安全策略以放通调试端口流量。


如果当前有A,B,C三个服务,每个服务有3个节点,那么我们需要分别建立3个安全组,并绑定9个公网网卡到机器节点。如下所示:


截屏2021-04-25 下午10.47.14.png

服务A

服务B

服务C

节点

节点

节点

节点

节点

节点

节点

节点

节点

公网网卡

安全组

安全组

安全组

安全保护

云端

本地

远程调试

远程调试

远程调试

开发人员A

开发人员C

开发人员B


这种方式存在以下问题:


  • 浪费成本:每个微服务节点都需要绑定公网网卡,成本跟测试节点数成正相关。
  • 配置复杂:在云上往往采取弹性伸缩的策略来维护机器节点,达到“用时即建,用完即放”的按需使用目的。而每当创建新的机器节点我们都需要单独配置公网网卡和安全组,使用上较繁琐。
  • 存在安全性隐患:如果微服务节点都对外暴露公网访问,会存在较大的安全风险。


甚至在有些场景下,由于安全要求内网机器节点不允许挂载公网网卡。对于这些问题,端云互联支持基于代理的远程调试,如下所示:


截屏2021-04-27 上午11.49.15.png


调试请求通过通道服务来转发给代理机,再由代理机转发至目标调试节点。通道服务和代理机之间的通道是加密的。对于安全要求非常严格的场景,可以使用安全组(或白名单)策略来进一步提高代理机的安全水位。


在使用上,你只需配置Alibaba Cloud Remote Debug,配置内容跟IDE自带的远程调试配置基本相同,但支持使用代理进行连接,如下所示:


0BB43C8F-BAB3-4117-91B2-93BC67C40610.png

Run/DedbugConfigurations

一G(

Storeasprojectfile

Allowparallelrun

Name:

RemoteDedug

AlibabaCLouDREMoteDeBug

RemoteDebug

如果您的服务部署在云端了,且本地无法直接连接远端debug端口,可使用此功能;

AlibabaMicroserviceContaine

您只需配置SSH或者SOCKS通道作为代理,即可通过该代理连接远端debug端口;

EDASonAIibabaCloud

一键诊断

RemoteDedug

SAEONAIibabaCloud

代理机

Proxy:

SpringBoot

Dubboprovider

172.16.0.1

Host:

Templates

Port:

5005

Beforelaunch:1task

OK

Apply

Cancel


其中有如下配置项:

  • Proxy:指定云端代理机。当运行时,插件会自动拉起通道服务连接代理机,无需人工干预。
  • Host:指定远程调试的目标机器节点IP。图中为172.16.0.1。
  • Port:指定远程调试的目标机器调试端口。图中为5005。


云原生产品支持


端云互联2.0支持了阿里云上微服务领域三大产品,EDAS(企业级分布式应用服务)、SAE(Serverless应用引擎)和MSE(微服务引擎)。这三个产品都支持微服务治理能力,满足不同的企业需求,产品特性如下:


  • 企业级分布式应用服务 EDAS(Enterprise Distributed Application Service):是应用全生命周期管理和监控的一站式 PaaS 平台,支持部署于 Kubernetes/ECS,无侵入支持 Java/Go/Python/PHP/.NetCore 等多语言应用的发布运行和服务治理 ,Java 支持 Spring Cloud、Apache Dubbo 近五年所有版本,多语言应用一键开启 Service Mesh。
  • Serverless 应用引擎(Serverless App Engine,简称 SAE):实现了Serverless 架构 + 微服务架构的完美融合,真正按需使用、按量计费,节省闲置计算资源,同时免去 IaaS 运维,有效提升开发运维效率。SAE 支持 Spring Cloud、Dubbo 等流行的微服务架构,支持控制台、Jenkins、云效、插件等部署方式。除了微服务应用外,您还能通过 Docker 镜像部署任何语言的应用。
  • 微服务引擎(Micro Service Engine,简称MSE):是一个面向业界主流开源微服务生态的一站式微服务平台, 帮助微服务用户更稳定、更便捷、更低成本的使用开源微服务技术构建微服务体系。提供注册中心、配置中心全托管(兼容Nacos/ZooKeeper/Eureka)、网关(兼容Zuul/Kong/Spring Cloud Gateway)和无侵入的开源增强服务治理能力。


因此,无论你是EDAS用户、SAE用户还是MSE用户,都可以使用端云互联能力来提高上云的开发效率。在插件上,这三个产品的配置步骤是基本相同的,除了产品自身的差异性以外。配置页如下所示:


7E0E7EE2-78CB-428A-AD27-00D6667A2101.png

Preferences

AIIBABACIOuDTOOLKitMioerViceMioserVice

Reset

Q

+APpearance&Behavior

配置粒度:

项目:dubbo-spring-boot-provider

AlibabaCloudToolkit

您只需配叠项目粒度即可使用;对于多横块工程,可以单独设遭横块粒度以覆盖项目粒度配置.

+Appearance&Behavior

Accounts

使用本地注册中心

SSHProfile

轻量级注册中心(HSF)

开源Nacos(Dubbo/SpringCloud)

HostTag

本地注册中心会着应用自动启停,您也可以通过下面操作按钮来对本地注册中心进行手动管理:

Docker

Microservice

停止

启动

Microservice

加入自建Nacos注册中心

请填写注册中心的域名或IP

Proxy

高级配置一键诊断帮助文档

端云互联

ApsaraStack

订阅并注册到云端注册中心,本地服务可以跟云端服务互相调用;

IMport&ExportSettings

比如:本机Consumer可以调用云端微服务;云端Consumer可以调用本机微服务;

Code

只订阅云端服务,不注册本地服务

Keymap

Editor

产品:

企业级分布式应用服务(EDAS)

Plugins

企业级分布式应用服务(EDAS)

云端互联环境:

VersionControl

Serverless应用引擎(SAe)

微服务引擎(MSE)

BuilD,Executionly

本地服务归属应用

Languages&Frameworks

SpringCloud应用必填项,其他服务类型忽略

本地SprngCloud服务端口:

TooLs

初始化代理...

代理:

dubbo-spring-boot-provider

加入全链路流控(铂金版适用)

OK

Cancel

Apply


在未来,我们会支持阿里云上更多的云原生产品进行互联,同时也会服务于阿里云以外的云原生开发者,敬请期待。


端云互联3.0


2.0版本解决了Java应用跟云端互联互通的问题,很多细节也打磨的比较完善,但它缺乏对容器领域和诊断能力的支持。这些能力我们在3.0阶段进行了补齐。


如果你是Kubernetes用户,那么可以使用3.0插件的Kubernetes代理能力,无需额外配置云端代理机。


如果你是非Java语言用户,或者对应用运行环境有一定要求,那么可以使用3.0插件的容器级互联能力,来在本地使用Docker运行应用。在Docker容器中,应用可以正常访问云端服务和资源,流量自动通过代理来转发。


如果你对本地运行应用所发生的调用异常感到无从下手,那么可以使用3.0插件的本地链路诊断能力,我们会统一收集本地应用的调用链路,调用异常一目了然。


下面来具体介绍这些特性。

Kubernetes代理


3.0版本的Kubernetes代理能力可基于Kubernetes集群自动打通代理通道。


在面向Kubernetes的开发中,我们可以通过kubectl命令和kubeconfig配置文件来跟API Server进行通信,并访问集群中的容器。API Server会对请求进行身份认证、鉴权和加密处理。如果开放API Server的公网访问,那么我们在本地通过kubectl执行交互式命令时,此时API Server将充当中间代理角色,如下所示:


截屏2021-04-26 下午2.20.34.png

数据流

目标容器

APIServer

云端

数据流

本地

执行

kubectl

基于此特性,端云互联3.0插件在应用启动时,调用kubectl临时创建一个代理容器。通过结合API Server和临时代理容器进行打通,本地应用可访问云端服务和其他资源。整体链路如下所示:


截屏2021-04-26 下午2.28.08.png

注册中心

发现

发现

注册

注册

调用

微服务

流量

调用

访问

Kubernetes

代理容器

云资源

APIServer

集群

解析

流量

DNS

流量

云端

本地

流量

流量

流量

应用

通道服务

Kubectl

流量

流量


代理容器占用64MB ~ 128MB的节点内存,并在本地应用停止时自动删除。


而在插件配置上也非常简单,你只需在插件中设置kubeconfig配置文件和选择Kubernetes命名空间:


B9F48B8A-6CE8-42FE-ACBF-8148F990AED6.png


在启动本地应用时,插件使用该kubeconfig配置文件来调用kubectl创建临时容器,并进行通道打通和流量转发。在终止应用时,插件使用该kubeconfig配置文件来调用kubectl删除该临时容器。


容器级互联


容器级互联是指,本地会启动Docker容器,并在容器内运行你的微服务应用,微服务应用可跟云端环境进行互联。如果你存在如下场景,那么容器级互联是你的最佳选择:


  • 非Java语言应用;
  • 应用运行时对操作系统存在特定要求;


在此模式下,微服务应用和通道服务都使用容器来运行,整体交互如下:


截屏2021-04-26 下午3.59.11.png

注册中心

发现

发现

注册

注册

调用

微服务

调用

访问

代理机

云资源

解析

DNS

流量

云端

本地

流量

Java

操作系统统

流量

C++

通道服务

Go

流量

通道容器

应用容器


在实现层面上,容器级互联基于iptables来拦截和转发流量到代理容器中的通道服务,通道服务再将数据通过云端代理转发至目标地址。在架构上,这种模式跟Service Mesh的Sidecar模式有点类似,应用容器把流量转发给通道服务容器(sidecar容器)。不过端云互联的通道容器只是做数据的透明转发,而Service Mesh的sidecar可进行微服务发现和治理的能力,这一点有所不同。


在使用上,插件运行容器的Alibaba Microservice Container配置,交互如下所示:


65A1AB36-B542-451C-985A-D1BCA6BB894F.png

Run/DebugConfigurations

i题

OStoreasprojectFile

4

Allowparallelrun

Name:

DubboProviderContainer

AlibabaCloudRemoteDebug

此配置可让您在本地启动应用容器,容器内环境通过代理跟云嫌环境打通,实现端云互联:

帮助文档

AlibabaMicroserviceContainer

使用前请前Preferences(setings)AlbabacloudookiM端云互联功能;

?DubboProviderContainer

EDASonAlIibabaCloud

LocalDockerServer

Server:

SAEONAIIbaBACLOUD

Java(通用Jar包)

Applicationtype:

SpringBoot

Templates

Artifact:

UseFILE

MAvenBUilLD

PIEasEADDRunMavenGoal'taskbeforelaunch

Executable

使用默认Entrypoint

Entrypoint:

使用默认Command

Command:

VMoPtions:

Programarguments:

Bindports:

格式为hostPorticontainerPort,以空格分隔

格式为hostPath:containerPath,以空格分隔

Bindmounts:

格式为key-value,以分号分隔

Environmentvariables:

OK

Cancel

Apply


如果你在应用容器中运行的是Java语言应用,插件还支持快捷的应用调试,无需额外设置具体参数。启动应用时,插件会通过环境变量注入JDWP调试参数,以打开调试端口。插件进一步结合Intellij IDEA的智能检测,可通过Attach debugger来一键调试容器中的Java应用,如下所示:


A99E6621-3687-4919-B58A-60504BD7167A.png

dubbo-spring-boot-providerEchoservicelmpl.java

pring-boot-providesrminJcmaa

EchoServicelmpl

DubboProviderContainer

+0oJd

3三

Project

AbstractRegi

NaMiNgProxyClass

NacosRegistry.j

EchOServicelmpliava

NAcosNamingSorvice.class

dubbo-spring-boot-provider-ali/test

packagecom.alibaba.edas.boot

A2x1人

idea

src

WWOC

main

1mport

java

7

cOM.Alibaba.edaS.BooT

@Serviceversion1.8.8,group"DuBBo)

8

DubboProvider

PUBLCLAECHOSERVCEIPLLEMENTsEChoSerVice

9

SISENBEYINDE

EchoService

16

EchoServicelmpl

@override

11

resources

publicstringecho(Stringname)

120

tarGet

Longstartsystem.currentTimeizs

13

dubbo-spring-boot-provider.iml

14

mpom-xml

JOjdXx3

try

15

TExternalLibraries

TIMEUnIT.SECONDS.LEPMOUT:1)

16

<1.8>/LibraryiJava/JavaVirtualMachi

catch(InterruptedExceptione)

17

LdMaven:ch.qos.logbackogback-cas

MMaven:ch.qos.logback-logback-cor8

PgeqIN

10

Run:

DubboProviderContainerx

USCOtanEt89887

UserconTaInesTartEdsuccessTULLY

total33584

ononns

4996Apr2286:29

drwxr-xr-x1rootroot

4996Apr2286:29..

1root

drWxr-xr-x

A

root

34375775Ap2112:36dubopringboot-od.

中口

1root

-rW-r--r--

root

PickgWJAyTO

SA/OAE

LIsteningTortranspotokc

SLF4J:FaitedtooadcLas

SLF4J:DeaULIngONOPERATIONOP)ggErPLEMEnTATION

SLFA:SeEhttP:Uh

qOMO

207-8-28829:27

片GIt

EVENTLOG

gProfler

Run

DebugTODOOProblems

Build

Services

Codaup

Endpaints

ALibabaCloudView

Spring

?Terminal

31LFUTE-84sOaCES

master


由图可见,插件会将容器中应用的日志输出打印在IDE窗口中,日志中的“Listening for transport dt_socket at address: 5005”表示容器中的Java应用已打开调试端口。点击Attach debugger,IDE将会连接到容器中Java应用的调试端口,接下来便可进行代码调试,如下所示:


E94F52F3-2162-474C-A86B-A1239BC15082.png


本地链路诊断


在开发过程中,你是否遇到过这个场景:下游服务接口返回了500,你只知道接口调用失败了,但具体原因并不知晓?找该模块研发人员来排查时,他过了半天回复一句“现在有点忙,待会我看看”?等他有空排查后,发现问题出在另一个模块,让你去找另一个同学来排查?...


诸如此类的场景在开发过程中屡见不鲜,往往一个小问题要花费大量精力和时间来进行排查。这个场景是链路追踪技术的典型场景。现在,我们把链路追踪也集成到端云互联能力上,使得本地调用链路也能上报到云端,当出现异常时问题一目了然。


比如,当前环境中有交易中心、商品中心和库存中心三个服务,你正在和测试同学验证新版本特性。测试同学在页面测试下单流程时,发现下单失败,如下所示:


截屏2021-04-27 下午3.57.16.png

网络异常

调用

下单

库存中心

交易中心

前端页面

DB

添加购物车

扣减库存

测试

调用失败

端云互联

下单失败

添加失败

扣减失败

云端

本地

启动

商品中心


由于涉及模块多,问题排查耗时非常长。端云互联3.0插件集成了ARMS(应用实时监控服务)的Java Agent,它通过代码无侵入的埋点机制来收集调用链路上的信息并上报到ARMS服务端进行统一收集和智能分析。出现异常时,只需在云端根据TraceId来查询调用链路,问题了然于胸:


截屏2021-04-27 下午3.52.15.png

链路追踪

参数

页面

参数

交易API

根据Traceld查询

参数

返回值

商品API

研发

返回值

库存API

上报数据

库存中心DB异常!

上报数据

返回值

报数据

上报数据

(Traceld)

(Traceld)

网络异常

(Traceld)

下单

调用

库存中心

前端页面

交易中心

DB

添加购物车

扣减库存

测试

调用失败

端云互联

下单失败

添加失败

扣减失败

云端

本地

启动

商品中心


TraceId是用于链路追踪底层的概念,从前端页面开始生成并透传至下游各节点。为方便使用,插件还提供了打印本地链路的开关,开启后将会输出本地应用服务调用链路的相关信息,如下所示:


p266003.png


链路输出中包含如下信息:


  • TraceId:用于标记请求的整体处理过程。在分布式微服务调用场景下,TraceId会从最前端的应用节点透传至下游链路各个节点,可根据此TraceId在EDAS控制台ARMS控制台查询整体链路处理过程。
  • Service:当前应用的请求处理入口,如Spring Cloud服务、Dubbo服务、HSF服务等。
  • API:链路处理过程中的方法签名。
  • Line:方法处理的具体行数。
  • Cost:此方法及其下游处理的耗时,单位毫秒。
  • Ext:扩展信息,包含请求处理状态码、数据库访问SQL、资源目标地址等信息。
  • Console link:ARMS控制台上收集的此链路信息,可点击此链接直接查看全链路信息。


点击Console link链接,可查看此请求的上下游处理链路,如下所示:


47605F6F-6536-4ED5-A9AB-0D9C9D1E1D6C.png

更新

arms.console.aliyun.com/apmgiondzai/

0

百阿里云

费用工单备案企业

简体

搜索文档,控制台,API

支持App卤

调用链路

业务轨迹

状态美

应用名称

详情

调用类型

服务名称

日志产生时间

IP地址

时间轴

(ms)

HTTP入口

2021-04-2621:51:33.284

/consumer-echo/na...

2093ms

dubbo-consumer

Q

1035ms

dubbo-provider

提供DUBBO

2021-04-2621:51:33.699

Com.alibaba.edas.b...


我们还可以进一步查看每个服务内的处理详情:


603E5963-D212-4F97-890B-DE07F0D14D6D.png


看到这里,是不是感觉排查问题有更多思路了呢:)


写在最后


云原生浪潮浩浩荡荡不可阻挡,业务上云也是企业的必经之路。但上云从来都不是一片坦途,在此过程中我们总会遇到一些困难和挑战。得益于云原生技术的日益成熟,这些问题一定会有相应的解法。


在开发态这一领域,我们是国内云厂商当中走在前沿的探索者。从2018年开始孵化端云互联1.0版本,到目前2021年的端云互联3.0版本,当中遇到了大大小小的问题和挑战,但最终都一一解决了。此能力为公共云和专有云的开发者带来了极大的便利,使其在本地就可以完成开发、测试和联调闭环。


在未来我们会不断提供更好用、更强大、更易用的云原生工具来服务开发者,敬请期待。


参考资料:



相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
3月前
|
Cloud Native 测试技术 开发者
终于!我找到了开发的得力助手!阿里云天池云原生编程挑战赛参赛攻略
在比赛过程中,通义灵码插件成为了我开发工作的得力助手。这个插件提供了智能代码补全和错误提示功能,大大提高了我的编码效率。尤其是通义灵码能够实时分析代码,给出优化建议,让我避免了很多潜在的错误。
216 64
|
2月前
|
人工智能 Cloud Native Serverless
来云栖大会!探展云上开发,沉浸式体验云原生 + AI 新奇玩法
计算馆将展示中国最先进的云计算产业链全景,从底层硬件到数据创新,从云计算基础设施到数据管理服务、人工智能平台和模型服务,全景式呈现 AI 时代云计算最新技术形态和产品进展。计算馆有哪些推荐?往下看!
|
3月前
|
Kubernetes Cloud Native 搜索推荐
探索云原生技术:Kubernetes在现代应用部署中的角色打造个性化移动体验:从开发到操作系统定制
【7月更文挑战第31天】本文深入探讨了云原生技术的核心组件之一——Kubernetes,并分析了其在现代云计算环境中的关键作用。通过实际代码示例和案例分析,文章揭示了Kubernetes如何优化资源管理、提高部署灵活性以及增强服务的可靠性。读者将获得对Kubernetes操作实践的直观理解,并认识到采用云原生架构对企业数字化转型的推动力。
61 0
|
6月前
|
Kubernetes Cloud Native Docker
使用 kubevpn 在本地快速开发云原生应用
KubeVPN 是一个用于云原生开发的工具,它允许用户通过本地计算机直接访问远程 Kubernetes 集群中的服务,利用 k8s DNS 或 Pod IP/Service IP。它可以拦截并调试服务网格中的工作负载流量,并提供开发模式,让容器在本地以与 k8s pod 相同的环境运行。快速开始包括下载二进制文件、自定义 Krew 安装、构建二进制文件以及安装示例应用。KubeVPN 支持链接到多个集群、DNS 解析、反向代理,以及在 Docker 中的开发模式,确保与 Kubernetes 运行环境一致。此外,它还兼容多种协议和平台。
136 5
|
6月前
|
Cloud Native 安全 Serverless
【阿里云云原生专栏】低代码开发在云原生平台的应用:阿里云低代码服务探索
【5月更文挑战第27天】在云原生时代,低代码开发凭借其图形化界面和预构建模块,简化了应用开发,提升了效率。阿里云积极探索低代码领域,推出函数计算FC和应用配置中心ACM等服务。FC让开发者无需关注基础设施,仅需少量代码即可实现应用部署,而ACM则提供动态配置管理,增强应用灵活性。阿里云的这些服务为企业数字化转型提供了高效、安全的解决方案,预示着低代码开发在云原生平台上的重要地位。
262 1
|
6月前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
186 1
|
6月前
|
Cloud Native Devops 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用构建高效微服务架构:后端开发的新范式
【4月更文挑战第30天】 随着企业加速其数字化进程,云原生架构已成为支撑复杂、可伸缩和灵活应用的骨干。本文探讨了云原生技术的崛起,重点分析了其在促进业务敏捷性、提高运营效率及推动创新方面的核心价值。通过深入剖析云原生生态系统的关键技术组件,如容器化、微服务、持续集成/持续部署(CI/CD)和DevOps实践,揭示了企业如何利用这些技术来构建和维护高度可用且动态的IT环境。文章还提出了一个多维度的采纳框架,帮助企业评估和实施云原生解决方案,以实现真正的业务价值。 【4月更文挑战第30天】在现代软件开发的快速演变中,微服务架构已经成为一种领先的设计模式,用于构建可扩展、灵活且容错的应用程序。与传
|
6月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
86 0
|
6月前
|
Java fastjson 数据安全/隐私保护
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
【Dubbo3技术专题】「云原生微服务开发实战」 一同探索和分析研究RPC服务的底层原理和实现
155 0
|
6月前
|
Cloud Native Linux 虚拟化
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
196 0
下一篇
无影云桌面