前言
解决微服务开发中环境debug问题的痛点:
- 每个人起一套环境,用来开发很费劲
- 每个人一套环境,数据不同步,造成开发耗时
- 开发服务依赖公共框架服务,如果想请求调试开发服务的接口,需要经历很多个公共服务接口
- 线上问题,本地复现难度大,可以通过此种方式轻松解决,将线上请求打到本地服务中
一、如何实现?
首先缕清思路,现实环境是什么样子的,然后我们要实现什么?
- 例如我有一个环境,是个微服务的架构项目,已经部署好了,有7-8个微服务
- 现在这个环境有问题了,开始报错,经过排查是其中的一个服务 A 报错,但是报错不明显,排查问题是重点
- 我想要跟踪这个问题,作为程序员最好跟踪问题的方式,当然是debug喽,如何debug?
普通做法
一般来说都是这个环境的数据,所以最简单的就是直接连接这个库,但是 !! 这个服务A 呀,不是直接提供服务,也就意味着你至少要搭建一个环境出来,注册中心,gateway,前端项目,而且一般来说一个请求达到服务A ,需要经历前置的几个服务,几乎就是重建一套环境,从而来查找问题
怎一个烦字了得?
本文做法
通过代理的方式,仅仅需要启动这个一个服务,就可以实现直接debug问题了,如何做呢?
前置条件:一个有小问题的完整环境
- 注册中心
- 各个微服务
- 统一路由 gateway
- 前端项目
- 其中一个有问题的服务A
二、使用步骤
1.改造服务A配置
- nacos 新增服务A的配置
之前的服务A配置叫做 snow-a.yml,现在增加一个snow-a-fl.yml,直接copy之前的,仅仅需要更改名字即可 - 打开项目源码,改造服务A的注册配置
spring:
application:
name: snow-a-fl
cloud:
nacos:
discovery:
server-addr: 192.168.15.63:8848
ip: 192.168.15.136
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
config:
import:
- optional:nacos:application-@profiles.active@.yml
- optional:nacos:${spring.application.name}-@profiles.active@.yml
修改服务A为另一个名字 name: snow-a-fl
修改注册中心地址为这个环境的服务器ip 192.168.15.63
配置该服务在nacos中的ip,也就是自己电脑的ip ip: 192.168.15.136
这里相当于本地启动一个服务A ,注册到这个环境的nacos上,但是服务名字与之前的服务A名字有区别
当然我这里是由于我将各个服务的配置都放在了nacos上,如果你没有放到nacos上,那么只需要改动项目源码中服务A的注册配置
2.将线上请求导向本地
- 在浏览器上安装插件XSwitch,文件在资源中,通过浏览器扩展程序安装即可
- 更改插件配置
{
"proxy": [
[
"/api/snow/",
"/api/snow-fl/"
]
]
}
- 启用插件
- 更改配置:
我原本的服务A 在nacos中的服务名称为snow,在gateway请求匹配前缀也是snow, 前端访问会自动添加/api前缀,通过nginx会截掉,然后访问snow这个服务,所以之前的前缀为 /api/snow/
现在我要将服务器上所有访问服务A的请求,全部打到我本地,所以 /api/snow-fl/ 这个配置,会将所有原本的/api/snow/导向 /api/snow-fl/ , 而 /api/snow-fl/ 会直接访问到我的本地!!!
3. 至此配置完成
继续访问这个环境,但是所有访问服务A的请求,此时都会打到本地,也就能debug了!!!
- 但是只有配置了XSwitch 的浏览器,才会将请求转发,所以不会影响线上环境
- 其他人也访问不到我这个新服务A的服务
给大家看下效果
未启用XSwitch之前
此时访问的是原服务A : /api/snow/dict/page
启用XSwitch之后
此时访问的是新服务A : /api/snow-fl/dict/page
总结
这样就完美实现了,在不影响线上环境的情况下,直接debug某个有问题的微服务,堪称完美~