Dapr 远程调试之 Nocalhost
虽然Visual studio 、Visual studio code 都支持debug甚至远程debug ,Dapr 搭配Bridge to Kubernetes 支持在计算机上调试 Dapr 应用程序,同时仍然让它们与 Kubernetes 集群上运行的服务和应用程序进行交互。 但是在调试过程中,难免修改配置、添加调试信息、修改代码并验证,这样就需要提交代码,重新编译、部署以验证功能是否符合预期,这样就拉长时间线,拉低了开发效率。一个系统可能还好点,如何项目A调用B、B又调用C,想要调试C,本地调试的话就需要配置3套环境,分别运行3个项目,流程线可想而知。
今天要给大家介绍一款神奇nocalhost, Nocalhost 是一款腾讯云Coding团队 开源的基于 IDE 的云原生应用开发工具,下面是摘抄自他的文档介绍,https://nocalhost.dev/zh-CN/docs/introduction/:
- 直接在 Kubernetes 集群中构建、测试和调试应用程序
- 提供易于使用的 IDE 插件(支持 VS Code 和 JetBrains),即使在 Kubernetes 集群中进行开发和调试,Nocalhost 也能保持和本地开发一样的开发体验
- 使用即时文件同步进行开发: 即时将您的代码更改同步到远端容器,而无需重建镜像或重新启动容器。
使用Nocalhost直接在k8s中进行开发,有如下几点优势:
- 生产环境相似 - 开发环境与你的生产环境非常相似,让你更有信心在发布新功能时一切都像在生产环境中一样工作。
- 更改即时生效 - 通过文件同步,对代码的所有更改都可以在容器中立即生效,而无需重建镜像或重新部署容器,从而提升开发效率,特别是可以借助于dotnet的热重载hot reload技术在云原生场景下搞笑开发。
- 灵活的扩展性 - 开发人员无需再担心本地资源不足。
- 降低成本 - 更有效地使用资源并降低 IT 设施成本,特别是很多公司都是虚拟化的场景下,本地的windows 机器不支持docker,用户无需在本地电脑配置开发、调试、测试环境,可以直接使用远端的云原生开发环境进行开发 。
- 方便调试 - Nocalhost支持远程debug,可以方便地在本地计算机上复现线上的问题。
- 减少本地配置 - 由于线上、测试环境已经部署过,Nocalhost使用这些现成的资源,不需再在本地安装数据库、redis等进行配置,也不必担心本地资源的限制,从而可以更愉快地本地开发,远程k8s部署并调试。
Nocalhost 由单个二进制 CLI 和 IDE 插件组成,可以直接与IDE 一起配合调试程序。 Nocalhost 不需要服务器端组件,因为它通过 KubeConfig 直接与 Kubernetes 集群通信,就像 kubectl 一样。
Nocalhost远程调试过程,主要分为Start DevMode启动调试模式、Associate Local DIR关联本地目录、设置断点、Remote Debug远程调试、本地请求接口、查看断点处信息等过程。
Visual Studio code 安装nocalhost 插件,在查看-扩展的搜索框中,搜索nocalhost,点击安装,即可进行快速安装Nocalhost插件。默认安装在C:\Users\xxx\.nh\目录下,生成的kubeConfigs也会在这个目录下。


进行nocalhost remote debug之前,还需要设置nocalhost的config配置信息,目前还不支持dotnet 的调试 。
在Visual studio code 的左侧有个nocalhost,点击Nocalhost,会以目录树的形式展示所有的k8s集群,找到相关k8s的namespace,点对应的项目,然后点Workloads工作负载 → Deployments部署,看到对应的pod。鼠标右键点Start DevMode,等待启动调试模式。
首先要连接k8s集群:connect to cluster

然后编辑这个服务的Dev Config: 点击这个,进行一些简单的设定。(这里配置很方便的,会选择用浏览器打开,进行修改,后复制修改的内容到这个文件即可),如下图:

将修改的内容复制到那个配置的yml中保存,可以直接用上面那个Apply 按钮完成拷贝,这里要特别指出的是对于Dapr sidecar的 配置一定要放在Patches下:

name: catalog
serviceType: deployment
containers:
- name: catalog-api
dev:
gitUrl: ""
image: mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim
shell: ""
workDir: ""
storageClass: ""
resources:
limits:
memory: 4Gi
cpu: "2"
requests:
memory: 2Gi
cpu: "2"
persistentVolumeDirs: []
command:
run:
- dotnet
- dev-certs
- https
- --trust;
- dotnet
- run
- --urls=http://*:80
- --project
- ./src/Services/Catalog/Catalog.API/Catalog.API.csproj
debug:
- dotnet
- dev-certs
- https
- --trust;
- dotnet
- watch
- run
- --urls=http://*:80
- --project
- ./src/Services/Catalog/Catalog.API/Catalog.API.csproj
debug:
remoteDebugPort: 0
language: ruby
hotReload: false
sync: null
env:
- name: DOTNET_RUNNING_IN_CONTAINER
value: "true"
- name: DOTNET_VERSION
value: 6.0.0
- name: ASPNET_VERSION
value: 6.0.0
- name: ASPNETCORE_URLS
value: http://+:80
- name: PATH
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
portForward:
- 8080:80
patches:
- patch: '{"spec":{"template":{"metadata":{"annotations":{"dapr.io/app-id":
"catalog-api", "dapr.io/app-port": "80", "dapr.io/enabled": "true",
"dapr.io/config": "dapr-config","dapr.io/log-as-json": "true" }}}}}'
type: strategic
(这里有一个镜像地址,可以填写我们作为nocalhost的开发镜像,因为最终还是你本地的代码部署到远程的容器中,那这个镜像地址其实不是多么重要,填一个存在的即可),最好是nocalhost 官方有支持的,他们的镜像仓库的dockerfile地址在这里 https://github.com/nocalhost/dev-container ,我做了一个dotnet 6的dockerfile。
使用Nocalhost之前,要先启动开发模式。成功进去开发模式后,会自动在DE中打开一个终端,这就是Nocalhost为我们创建好的容器了。顺利的话,你应该能在该容器的/home/nocalhost-dev目录下看到你的源代码。这里中间应该会选择一个目录,就是关联你本地服务的代码的目录就好了;
通过patch 拉起Dapr sidecar,不过由于进入开发模式的实例里面并没有运行 业务服务的代码,只是把Nocalhost的调试代码的容器启动,我们可以通过Remote run来运行在run 所定义的命令来拉起业务服务,这样dapr 就可以正常启动了,具体过程可以看我提的一个issuehttps://github.com/nocalhost/nocalhost/issues/1306:

在本地修改一行代码,就会实时的在远端容器中生效了,从代码修改,到远端容器中生效的过程很快,可能都不到1秒,如果不使用nocalhots,那起码都是几分钟起步的,流程很复杂,Nocalhost 是使用了源码启动进程,实时热加载技术,当进入开发模式(Dev Model)后,会实时把本地的源码同步到远端容器中,免去了提交,构建,推送镜像等循环,提升了开发效率。
Dapr 远程调试之 Nocalhost的更多相关文章
- 微信公众号开发之VS远程调试
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流 ...
- tomcat开发远程调试端口以及利用eclipse进行远程调试
一.tomcat开发远程调试端口 方法1 WIN系统 在catalina.bat里: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compi ...
- Visual Studio 2012远程调试中遇到的问题
有的时候开发环境没问题的代码在生产环境中会某些开发环境无法重现的问题,或者需要对生产环境代码进行远程调试该怎么办? Vs已经提供给开发者远程调试的工具 下面简单讲讲该怎么用,前期准备:1.本地登录账户 ...
- 使用Eclipse进行远程调试
转自:http://blog.csdn.net/sunyujia/article/details/2614614 今天决定做件有意义的事,写篇图文并茂的blog,为什么要图文并茂?因为很多事可能用语言 ...
- 微信公众号开发系列教程一(调试环境部署续:vs远程调试)
http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...
- tomcat 远程调试
1.服务端查看cataline.sh 中的描述 cataline jpda start 开启服务端远程调试 远程调试端口JPDA_ADDRESS="8000" 2.本地代码参考 ...
- 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure
[题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...
- [教学] Delphi Berlin 10.1 开发 Windows 10 平板 App 远程调试
Delphi Berlin 10.1 开发 Windows 10 平板 App 远程调试安装步骤: 准备电脑: 一台开发电脑,安装 Delphi 开发环境 一台平板电脑,安装 PAServer,安装方 ...
- Xdebug文档(七) 远程调试
Xdebug提示调试客户端接口与PHP运行相联系.该章节解释如何设置PHP与xdebug,并推荐一些客户端. 介绍 Xdebug的远程调试器允许你检查数据结构,交互式地穿过和调试你的代码.该协议已经开 ...
随机推荐
- 对redis数据库的初步认识
由于之前接触的都是关系型数据库,对于非关系型数据库总是不了解,趁着外出做项目的机会,正好初步认识了redis数据库 redis分为存储分为几个存储的数据类型 string类型,hash类型,list链 ...
- 对原型链的理解?prototype上都有哪些属性?
在js里,继承机制是原型继承.继承的起点是 对象的原型(Object prototype). 一切皆为对象,只要是对象,就会有 proto 属性,该属性存储了指向其构造的指针. Object prot ...
- 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...
- javax.net.ssl.sslhandshakeException:sun.security.validator.validatorException:PKIX path buildind failed
前段时间开发的一个需求,需要通过图片URL获取图片的base64编码,测试的时候使用的是百度图片的url,测试没有问题,但是发布后测试时报如下错: javax.net.ssl.sslhandshake ...
- 什么是RabbitMQ?RabbitMQ的使用场景是什么?
参考链接:RabbitMQ 简介以及使用场景
- 用 Java 写一个单例类?
饿汉式单例 public class Singleton { private Singleton(){} private static Singleton instance = new Singlet ...
- 什么是持续集成(CI)?
持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程. 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试.
- sleep 方法和 wait 方法有什么区别?
这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点 在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器, wait 方法会放弃这个对象的 ...
- 学习openldap01
Linux 下openldap的详细介绍,搭建,配置管理,备份,案例 Ldap 服务应用指南 兼容(5.X&6.X) 1.1 Ldap 目录服务介绍 1.1.1 什么是目录服务(activ ...
- jdbc的快速入门(需要mysql-connector-java-5.1.39-bin.jar包)
package Lianxi;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;i ...