![]() | 1 ktqFDx9m2Bvfq3y4 2023-12-15 13:04:11 +08:00 目前我们的项目不是微服务,是单体应用。但我自创轮子,在搞混合开发,方案如下: - 所有服务都完全独立 - 服务分两部分:一个用来定义(接口和参数),一个用来实现 - 搞出环境概念,环境中有各种服务的地址无需配置 - 有必要的话,服务也可以在本地启动(直接跟你的项目一起,而不是独立的 Pod 中) - 这样本地调试的时候只需要加入开发环境,引用相应的服务定义项目即可 - 实际部署的时候一组服务可以部署在一起,或按需要分开部署 - 这样所有服务部署在一起,就还是单体;每个服务都独立部署就是微服务;按调用频率分组部署,就是混合; 最大的好处是可以无缝迁移现有单体应用。我现在本地 Debug 还是按单体的风格来(当然也可以不用)。 |
2 zhenjiachen 2023-12-15 13:08:39 +08:00 单元测试加 mock |
![]() | 3 balancircle 2023-12-15 13:40:24 +08:00 alibaba KtConnect |
![]() | 4 StoneHuLu 2023-12-15 13:42:31 +08:00 我们不是微服务,就是开发和测试环境内网打通,开发机本机运行能直接调用测试环境数据库和 api |
5 lazyfighter 2023-12-15 14:06:12 +08:00 开发测试环境打通, 中间件依赖 Nodeport 导出 我现在是这么干的 |
![]() | 6 Moonkin OP @Chad0000 这是部署在 k8s 中吗?环境概念包括开发依赖工具吗,比如编译工具 |
![]() | 7 Moonkin OP 看了下似乎 mesh 就有我说的这个测试标识的功能。但是 KtConnect 似乎要在本地调试,, |
![]() | 8 Moonkin OP |
9 serialt 2023-12-15 15:00:27 +08:00 OP 说的是 okteto ? |
![]() | 10 ktqFDx9m2Bvfq3y4 2023-12-15 15:04:51 +08:00 ![]() @Moonkin #6 我自己的项目是部署在 K3S 中,公司的并没有。公司的是屎山单体,我在用我的方式改造而已。 环境的意思就是服务的运行环境,比如.net 中那可能就是 asp.net core 。服务最终编译成 dll ,由运行环境动态加载(或直接依赖)。然后这个运行环境可向注册中心注册暴露调用地址。你本地起一个任意项目(可以是 Console )作为本地运行环境,你可以引用所有需要的服务对应的接口,可以直接写代码调用接口背后的实现。你的本地运行环境会负责将请求发给对应的接口运行环境。或你本地如果有这个接口的实现,那么就会直接在本地调用。通过这种设计我实现了服务可以在任何地方运行,可以调用任意服务,也可以被任意服务调用。如下面这个图: ![]() |
![]() | 11 ktqFDx9m2Bvfq3y4 2023-12-15 15:08:37 +08:00 本质就是运行环境负责将服务运行起来,然后拦截本地服务对其他服务的调用请求(伪依赖注入),如果目标服务在本地,则直接调用本地的服务,如果不在本地,则在注册中心会找到目标服务的地址,发起远程调用(一般 HTTP ,也可以是基于消息的 RPC )。 |
![]() | 12 StoneHuLu 2023-12-15 15:43:39 +08:00 @Moonkin #8 我理解是如果测试环境和开发环境不打通,那开发效率也太慢了。。而且就数据库之类的咋整,难道每个开发自己搞一个数据库吗,我们是测试环境和开发环境打通,开发人员和测试人员都在这个环境进行开发和测试,有问题直接本机打断点调试,基本都能迅速百分百复现问题,然后测试完毕上预发布环境再测一遍,这里如果产生问题就得靠日志解决了,最后才是生产环境。 |
![]() | 13 ghos 2023-12-15 16:06:30 +08:00 alibaba KtConnect +1 |
![]() | 14 xuanbg 2023-12-15 16:10:24 +08:00 不太明白题主的各种条件,反正我们有个开发环境,IDEA 直接开调试模式就能打断点调试,方便得很。 |
15 Masoud2023 2023-12-15 16:14:53 +08:00 正常项目就应该能在本地跑,只能进环境测试其实是一种非常烂的开发流程。 |
![]() | 16 Moonkin OP @serialt 基本一样。。它这个 dev environment 的概述也是用的容器,如果在容器中用 apt-get 装了什么,重启大概也会丢。。 |
![]() | 17 Moonkin OP @Masoud2023 换个角度,,如果你有几个 vps ,在上面搞了一些网站,还有数据库,redis ,本地开发要想访问只能通过公网 ip 的形式。但是这些 vps 直接可以内网 ip 访问,代码也应该写内网域名。本地很难接入吧。 |
![]() | 18 litchinn 2023-12-15 16:34:03 +08:00 我看你不是自己提到了 go dlv 这种线上 debug 工具吗,不让用吗 |
19 Masoud2023 2023-12-15 16:37:03 +08:00 @Moonkin #17 所以才要做分生产测试 uat+环境隔离+配置管理啊。 本地开发人员就不应该碰到生产环境内容。 代码里更不能写死生产相关的配置,应该用 nacos 或者环境变量或者最次也得用 spring 配合 profile 做配置切分呀。 |
![]() | 20 perfectlife 2023-12-15 16:44:11 +08:00 我们是本地和开发环境通过 vpn 打通,可以远程 debug, 日常都是提交代码自动构建发到 dev/test/uat 环境。痛点是如果单纯的只是本地启动服务想访问 k8s 集群里的服务好弄,麻烦的是你本地启动一个服务 a ,线上同时也启动了一个服务 a ,都注册上去了,别的服务调用这个服务 a 就会比较恶心,另外本地启动的服务默认注册上去的 ip 会是你的本地 ip ,不是 vpn 分配的 ip ,别的服务访问这个 ip 还失败,还需要修改配置文件来指定 ip |
21 zicheqingluo 2023-12-15 16:46:12 +08:00 劫持下 svc 的解析到测试环境即可 |
22 julyclyde 2023-12-15 18:42:03 +08:00 其实是两件事: 1 服务注册和发现是否正常 2 各微服务之间通信是否正常 |
23 victorc 2023-12-15 19:04:48 +08:00 1.你要学会看日志,每年都要纠正校招生单步调试的坏毛病 2.都用上了微服务,设计上应该做到低耦合高聚合,其实不太需要调试,基本上就是一些 typo 错误 |
24 datoujiejie221 2023-12-15 19:45:38 +08:00 你这相当于本地调试加了个灰度,我们是 springcloud+nacos 的方案,网关根据 nacos 注册的标识来分流。 |
25 buffzty 2023-12-15 19:58:42 +08:00 部署个 wireguard 本地可以直接用 pod ip ,serviceid ,集群 dns .cluster.local 在本地和在容器内没有任何区别 还有 node port 这种东西最好别开 |
26 youngPacce 2023-12-15 19:58:56 +08:00 via Android 你想在生产 debug ?阻塞用户的请求怎么办? |
![]() | 27 lozzow 2023-12-15 20:18:41 +08:00 直接再集群中开发,vscode remote 然后修改 service 就行,无痛无依赖 |
![]() | 28 tudou1514 2023-12-15 22:13:53 +08:00 看完,是不是理解为你们想给开发张三固定一个 pod 作为“服务器”?如果这样不建议你们 k8s ,直接虚拟化吧 |
![]() | 29 wzcloud 2023-12-15 22:55:39 +08:00 via iPhone telepresent 或者 nocalhost 可以打通本地和集群网络 |
30 sampeng 2023-12-16 03:21:02 +08:00 via iPhone 有个东西叫 vpn…… 再说了,我 64G 内存。本地起全套轻轻松松。啊哈哈哈哈 |
![]() | 31 ihacku 2023-12-16 03:27:19 +08:00 via Android |
![]() | 32 zhangyq008 2023-12-16 13:22:44 +08:00 |
![]() | 33 CCIEliu 2023-12-17 14:42:40 +08:00 nocalhost |
![]() | 34 uianz 2023-12-18 00:22:28 +08:00 我是连 vpn 之前查到可以加一个配置 然后用完整的 servicename(<servicename>.<namespace>.svc.<clusterdomain>)调用 |