Dubbo扩展点SPI简单实例

时间:2020-07-12
本文章向大家介绍Dubbo扩展点SPI简单实例,主要包括Dubbo扩展点SPI简单实例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  dubbo采用微内核+插件机制方便框架使用者自行扩展,这个插件机制的实现就是JDK的SPI。dubbo扩展了JDK的SPI,按官方说法,叫扩展点SPI。接下来看一个例子,使用扩展点SPI来自定义一个LoadBalance。原代码参见一个spring boot集成dubbo的小例子,只需修改消费者,服务提供者不用动。下面重点把修改点列出来:

  1、消费者项目新增配置文件:resources/META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance

demo=com.example.dubbo.democonsumer.loadbalance.DemoLoadBalance

  2、消费者项目新增自定义LoadBalance实现:

package com.example.dubbo.democonsumer.loadbalance;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.cluster.LoadBalance;

import java.util.List;

public class DemoLoadBalance implements LoadBalance {
    @Override
    public <T> Invoker<T> select(List<Invoker<T>> list, URL url, Invocation invocation) throws RpcException {
        System.out.printf("DemoLoadBalance coming, url %s", url.toFullString());
        return list.get(0);
    }
}

  3、消费者项目的Controller类新增LoadBalance注解:

package com.example.dubbo.democonsumer.controller;

import com.example.dubbo.demo.domain.DemoBean;
import com.example.dubbo.demo.service.DemoService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;

/**
 * 服务消费者
 */
@RestController
public class ConsumerController {

    // 引入API
    @Reference(check = false, loadbalance = "demo")
    DemoService demoService;

    @ResponseBody
    @RequestMapping("/hello")
    public String sayHelo(@RequestParam(value = "msg") String msg) {
        return demoService.sayHelo(msg);
    }

    @ResponseBody
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(DemoBean demoBean) {
        return demoService.login(demoBean);
    }
}

  完事了。启动消费者和两个服务提供者(IDEA启动多实例参见IDEA同一项目启动多个实例),注意两个provider配置的rpc端口不能相同:

  浏览器输入消费者hello接口跑一次:

  

  从消费者日志可以看到进入我们自定义的LoadBalance:

原文地址:https://www.cnblogs.com/wuxun1997/p/13286911.html