如何自己扩展 dubbo 中的组件
下面来说说怎么来自己扩展 dubbo 中的组件。
自己写个工程,要是那种可以打成 jar 包的,里面的 src/main/resources 目录下,搞一个 META-
INF/services ,里面放个文件叫: com.alibaba.dubbo.rpc.Protocol ,文件里搞一个
my=com.bingo.MyProtocol 。
自己把 jar 弄到 nexus 私服里去。
然后自己搞一个 dubbo provider 工程,在这个工程里面依赖你自己搞的那个 jar,然后在 spring 配置
文件里给个配置:
provider 启动的时候,就会加载到我们 jar 包里的
my=com.bingo.MyProtocol 这行配置里,接着会根据你的配置使用你定义好的 MyProtocol 了,这个
就是简单说明一下,你通过上述方式,可以替换掉大量的 dubbo 内部的组件,就是扔个你自己的 jar
包,然后配置一下即可。
dubbo-spi
dubbo 里面提供了大量的类似上面的扩展点,就是说,你如果要扩展一个东西,只要自己写个 jar,让
你的 consumer 或者是 provider 工程,依赖你的那个 jar,在你的 jar 里指定目录下配置好接口名称对
应的文件,里面通过 key=实现类 。
然后对于对应的组件,类似 dubbo:protocol 用你的那个 key 对应的实现类来实现某个接口,你可以自
己去扩展 dubbo 的各种功能,提供你自己的实现。

答案二:

比如说我们想要实现自己的负载均衡策略,我们创建对应的实现类XxxLoadBalance 实现LoadBalance 接口或者AbstractLoadBalance 类。

  1. package com.xxx;
  2. import org.apache.dubbo.rpc.cluster.LoadBalance;
  3. import org.apache.dubbo.rpc.Invoker;
  4. import org.apache.dubbo.rpc.Invocation;
  5. import org.apache.dubbo.rpc.RpcException;
  6. public class XxxLoadBalance implements LoadBalance {
  7. public <T> Invoker<T> select(List<Invoker<T>> invokers, Invocation invocation) throws RpcException {
  8. // ...
  9. }
  10. }

我们将这个是实现类的路径写入到resources 目录下的META-INF/dubbo/org.apache.dubbo.rpc.cluster.LoadBalance文件中即可。

  1. src
  2. |-main
  3. |-java
  4. |-com
  5. |-xxx
  6. |-XxxLoadBalance.java (实现LoadBalance接口)
  7. |-resources
  8. |-META-INF
  9. |-dubbo
  10. |-org.apache.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)

org.apache.dubbo.rpc.cluster.LoadBalance

xxx=com.xxx.XxxLoadBalance