美文网首页
dubbo本地调试方法实践(解决多人多版本并行开发调试问题)

dubbo本地调试方法实践(解决多人多版本并行开发调试问题)

作者: 星城天空 | 来源:发表于2021-06-28 08:12 被阅读0次

背景

我们有个业务的项目,已做了微服务拆分,使用dubbo的rpc框架。有多位开发同事一起参与开发,但可能每个同事在同一时刻负责的版本不一样,例如有2位同事负责开发版本1,有另外2位同事负责开发版本2。某一天,一位同学向我吐槽,在本地开发调试过,自己开发的版本1的web经常调用到另外一为同事开发版本2的app,不能得到自己想要的结果。又不想逐个修改dubbo的@reference注解中url参数或者在jvm参数中增加类似-Dcom.test.testService=dubbo://localhost:20880等配置。

方案

1.实现自定义cluster,查询本地ip和注册zk的dubbo接口配置
2.若配置中存在与本地ip相同,则选取ip为本地ip的Invoker发起远程调用
3.若不存在,则交付默认cluster执行
4.配合apollo配置中心,本地开发环境开启自定义cluster,生产环境默认不开启

具体实现

1.新建DevCluster类继承Cluster

2.在resource文件夹下新建META-INF/dubbo/org.apache.dubbo.rpc.cluster.Cluster文件,文件内容:
dev=com.test.common.dubbo.DevCluster

3.开发环境,apollo开启配置:dubbo.consumer.cluster = dev(生产环境不增加此配置,使用默认的)

@Slf4j
public class DevCluster implements Cluster {

    public final static String NAME = "dev";

    @Override
    public <T> Invoker<T> join(Directory<T> directory) throws RpcException {
            return new AbstractClusterInvoker<T>(directory) {
                public Result doInvoke(Invocation invocation, List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {
                    // 1.检查是否有可用invoker
                    checkInvokers(invokers, invocation);

                    // 2.查询本地IP和注册zk的Dubbo使用IP
                    String ip = NetUtils.getLocalHost();
                    List<String> registerHosts = invokers.stream().map(i->i.getUrl().getHost()).collect(Collectors.toList());

                    // 3.注册IP为空,或者本地IP不在zk测试IP,则交由原cluster处理
                    if (CollectionUtils.isEmpty(registerHosts) || !registerHosts.contains(ip)){
                        FailoverClusterInvoker failoverClusterInvoker = new FailoverClusterInvoker(directory);
                        return failoverClusterInvoker.doInvoke(invocation,invokers,loadbalance);
                    }
                    Invoker<T> invoked = invokers.stream().filter(invoker -> invoker.getUrl().getHost().equals(ip)).findFirst()
                            .orElseThrow(() -> new RpcException("Failed to invoke the method "));

                    // 4.使用选取的Invoker发起远程调用,失败则抛出异常
                    try {
                        return invoked.invoke(invocation);
                    } catch (Throwable e) {
                        log.error("");
                        throw (RpcException) e;
                    }
                }
            };
    }
}

相关文章

  • dubbo本地调试方法实践(解决多人多版本并行开发调试问题)

    背景 我们有个业务的项目,已做了微服务拆分,使用dubbo的rpc框架。有多位开发同事一起参与开发,但可能每个同事...

  • chrome 调试踩坑

    问题:本地调试代码不发送cookie 问题描述:两周前打开谷歌,进行本地项目调试(公司做的是混合开发APP),发现...

  • 远程调试代码

    远程debug调试java代码 日常环境和预发环境遇到问题时,可以用远程调试的方法本地打断点,在本地调试。生产环境...

  • Flutter开发调试

    代码开发后出问题都会需要调试,调试方法很重要。 1. 断点调试 断点调试跟大家熟悉的 Chrome 的断点调试基本...

  • Safari进行真机调试本地Web应用-实践

    真机调试本地Web应用-实践 之前,移动端的开发测试一直是很头痛的问题。通常的测试方法是使用Chrome模拟器,但...

  • 使用IDEA调试线上的项目

    为什么想要远程调试? 远程调试能够帮我解决线上代码调试难的问题,可以像在本地debug程序一样来调试已部署在服务器...

  • Flink1.10.0与Hive3.1.2集成详细步骤

    背景 Flink Hive 集成介绍 Flink集群设置 本地开发调试本地开发调试提示 Git相关项目 本文记录了...

  • 一、基础知识

    调试版本为 Dubbo 2.7.7,拉取 Dubbo 仓库源码,仓库地址:https://github.com/a...

  • IntelliJ 配置hadoop方法

    1.配置方法 intellij idea本地开发调试hadoop的方法 Hadoop: Intellij结合Mav...

  • update to revesion 和 revert to r

    今天调试代码时,发现同事已经修改了多处,已经不满足调试的条件。于是,打算回退版本以便调试。 问题:只需要回退本地的...

网友评论

      本文标题:dubbo本地调试方法实践(解决多人多版本并行开发调试问题)

      本文链接:https://www.haomeiwen.com/subject/izofultx.html