参考资料

实现dubbo随机端口,解决重启Address already in use异常

Dubbo动态改变端口配置

问题重现

这里写图片描述

这里写图片描述

所以,话说,指定的 dubbo的provider端口完全无效。。。

问题解决方案

请用 system.setProperty预先设置dubbo参数。

这里写图片描述

这里写图片描述

优化

如果直接写死是很不优雅的,所以,可以这样优化一下:

    public static void initDubboConfig()  {
        Properties config=new Properties();
        try {
            InputStream in = ClassLoader.getSystemResourceAsStream("conf/env/dubbo.properties");
            InputStreamReader is = new InputStreamReader(in, "utf-8");
            config.load(is);
            is.close();
            in.close();
            System.setProperty("dubbo.protocol.port", config.get("dubbo.port").toString());
            System.setProperty("dubbo.registry.address", config.get("dubbo.address").toString());
            System.setProperty("dubbo.protocol.name", config.get("dubbo.protocol").toString());
        }
        catch (Exception ed){
            ed.printStackTrace();
        }
    }

这里写图片描述

持续优化

索性将必要的dubbo参数都提取出来,彻底优化:
dubbo.properties:

###---同一个微服务参数---###
#注意,不同的微服务它本身的application的名字应该要不一样的。
dubbo.application.name = micro-account-consumer
dubbo.application.owner = programmer
dubbo.application.organization = dubbox

###---同一个微服务下面不同的环境之间的参数差异,注意,端口可以不一样,地址也可以不一样---###
#特别注意,不同的微服务要有不同的服务提供者端口。dubbo.protocol.port,否则会被视为冲突的。
dubbo.port = 20882
#注意,不同环境下,address 地址应该是不一样的。
dubbo.address = zookeeper://localhost:2181

dubbo.protocol = dubbo
    public static void initDubboConfig()  {
        Properties config=new Properties();
        try {
            InputStream in = ClassLoader.getSystemResourceAsStream("conf/env/dubbo.properties");
            InputStreamReader is = new InputStreamReader(in, "utf-8");
            config.load(is);
            is.close();
            in.close();
            System.setProperty("dubbo.application.name", config.get("dubbo.application.name").toString());
            System.setProperty("dubbo.application.owner", config.get("dubbo.application.owner").toString());
            System.setProperty("dubbo.application.organization", config.get("dubbo.application.organization").toString());
            System.setProperty("dubbo.protocol.port", config.get("dubbo.port").toString());
            System.setProperty("dubbo.registry.address", config.get("dubbo.address").toString());
            System.setProperty("dubbo.protocol.name", config.get("dubbo.protocol").toString());
        }
        catch (Exception ed){
            ed.printStackTrace();
        }
    }

provider.xml内容:

这里写图片描述

provider.java:

    public static void initDubboConfig()  {
        Properties config=new Properties();
        try {
            InputStream in = ClassLoader.getSystemResourceAsStream("conf/env/dubbo.properties");
            InputStreamReader is = new InputStreamReader(in, "utf-8");
            config.load(is);
            is.close();
            in.close();
            System.setProperty("dubbo.application.name", config.get("dubbo.application.name").toString());
            System.setProperty("dubbo.application.owner", config.get("dubbo.application.owner").toString());
            System.setProperty("dubbo.application.organization", config.get("dubbo.application.organization").toString());
            System.setProperty("dubbo.protocol.port", config.get("dubbo.port").toString());
            System.setProperty("dubbo.registry.address", config.get("dubbo.address").toString());
            System.setProperty("dubbo.protocol.name", config.get("dubbo.protocol").toString());
        }
        catch (Exception ed){
            ed.printStackTrace();
        }
    }

这里写图片描述

小结

1、在配置环境时候各种小问题小bug实在是层出不穷。
2、某种架构某种结构的落地落实是需要大量时间及逐步调试来实现的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐