mini-dubbo服务调用

本文介绍了Mini-Dubbo服务消费的实现过程,包括消费者启动代码、动态代理的生成及远程调用的处理机制。通过具体代码示例展示了如何定义服务消费者、如何利用JDK动态代理创建代理对象以及如何进行远程调用。

Mini-Dubbo之服务消费

 

Consumer目录结构

 

消费者启动代码

/**
 * Created by cheng.xi on 2017-04-14 09:28.
 * 服务消费者端引用服务
 */
public class TestApiConsumer {
    public static void main(String[] args) {

        DubboConsumer<HelloWorldService> reference = new DubboConsumer<HelloWorldService>();
        //注入要调用的接口类对象
        reference.setInterface(HelloWorldService.class);
        
        //根据上面注入的接口获取动态代理生成的对象(基于JDK动态代理生成)
        HelloWorldService helloWorldService = reference.get();
        System.out.println(helloWorldService.sayHello("zhangsan"));

    }
}

 

看DubboConsumer代码:

**
 * Created by cheng.xi on 2017-04-14 17:30.
 * 服务消费者端,获取代理
 */
public class DubboConsumer<T> {
    //接口名字
    private String interfaceName;

    //接口
    private Class<?> interfaceClass;

    //代理类
    private T ref;
    
//根据设置的接口名称获取代理对象
    public T get(){
        //获取代理
        ref = new DubboConsumerProxy(interfaceClass).getProxy();
        return ref;
    }



    //--------------------以下是getset方法----------------//
    public String getInterfaceName() {
        return interfaceName;
    }

    public void setInterface(String interfaceName) {
        this.interfaceName = interfaceName;
    }
    //设置要调用的接口名称
    public void setInterface(Class<?> interfaceClass) {
        this.interfaceClass = interfaceClass;
        setInterface(interfaceClass == null ? (String) null : interfaceClass.getName());
    }

    public Class<?> getInterfaceClass() {
        return interfaceClass;
    }

    public void setInterfaceClass(Class<?> interfaceClass) {
        this.interfaceClass = interfaceClass;
    }
}

 

 

看DubboConsumerProxy代码


/**
 * Created by cheng.xi on 2017-04-14 09:33.
 * 服务消费者端的代理,使用JDK动态代理
 */
public class DubboConsumerProxy implements InvocationHandler{

    private Class<?> interfaces;

    public DubboConsumerProxy(Class<?> interfaces){
        this.interfaces = interfaces;
    }

    public <T> T getProxy(){
           return (T) Proxy.newProxyInstance(interfaces.getClassLoader(),new Class[]{interfaces},this);
    }
    //代理执行方法
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result;

        //组装请求体
        Request request = new Request();
        request.setInterfaceName(interfaces.getName());
        request.setMethodName(method.getName());
        request.setParameterTypes(method.getParameterTypes());
        request.setArgs(args);

        //远程调用服务提供者
        result = Transporters.connectAndExecute(request);

        return result;
    }
}

 

Transporters类源码

public class Transporters {
    public static Object connectAndExecute(Request request) throws ExecutionException, InterruptedException {
        //处理器,用来处理返回的消息
        NettyClientServiceHandler handler = new NettyClientServiceHandler();
        //使用nettyclient来进行连接服务提供者和执行请求
        new NettyClient().connectAndExecute(request,handler);
        //从处理器中获取返回的消息
        return handler.getResponse().getResult();
    }
}

 

里面创建了NettyClient客户端并调用了connectAndExecute方法

public class NettyClient {


    public void connectAndExecute(Request request, final NettyClientServiceHandler handler) throws InterruptedException, ExecutionException {
        EventLoopGroup group = new NioEventLoopGroup();
        try{
            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group);
            bootstrap.channel(NioSocketChannel.class);
            bootstrap.handler(new ChannelInitializer<SocketChannel>() {
                protected void initChannel(SocketChannel socketChannel) throws Exception {
                    ChannelPipeline pipeline = socketChannel.pipeline();
                    pipeline.addLast(new ObjectEncoder());
                    pipeline.addLast(new ObjectDecoder(1024*1024, ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
                    pipeline.addLast(handler);
                }
            });
            bootstrap.option(ChannelOption.TCP_NODELAY, true);
            ChannelFuture future = bootstrap.connect("127.0.0.1", 3347).sync();
            Channel channel = future.channel();
            channel.writeAndFlush(request).sync();
            channel.closeFuture().sync();
        }finally {
            group.shutdownGracefully();
        }
    }
}

 

最后获取返回参数一个请求调用完成


【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了多种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值