0%

dubbo进阶

文章字数:430,阅读全文大约需要1分钟

RPC 服务暴露与引入

服务方

  1. 中转对象,用于中转代理对象的网络请求,参数、返回结果(Protocol.export创建)。

消费方

  1. 动态代理,为接口创建动态代理类,做请求发送功能。
  2. 使用Protocol.referInvoker,用于发送网络请求

Spring Rmi

服务提供者

1
2
3
4
5
6
7
8
9
10
11
12
13
// Spring rmi 中转对象
@Bean
public RmiServiceExporter serviceExporter() {
RmiServiceExporter res = new RmiServiceExporter();
// 代理接口的路径名称
res.setServiceName(TestService.class.getName());
// 端口
res.setRegistryPort(port);
// 暴露给外部访问的接口
res.setServiceInterface(TestService.class);
// 实际使用对象
res.setService(new TestServiceImpl())
}

SPI机制

本质是策略模式,一个接口,多个实现。根据不同策略选择,进行不同的策略。

  1. java spi例子
1
2
3
4
5
6
7
8
9
public static void main(String[] args) throws Exception {
// 使用spi加载接口的具体实现类
ServiceLoader<TestService> spiLoader = ServiceLoader.load(TestService.class);
Iterator<SpiService> iteratorSpi = spiLoader.iterator();
while(iteratorSpi.hasNext()) {
// 遍历出每个指定的实现类
TestService testService = spiLoader,next();
}
}

META-INF.services文件夹内创建com.test.service.testService文件,即接口名称命名的文件

其中指定了此接口指定的实现类,可用spi获取

1
2
3
com.test.service.impl.testServiceImpl1
com.test.service.impl.testServiceImpl2
com.test.service.impl.testServiceImpl3
  1. dubbo spi
    • @SPI注释标记的接口都可以使用dubbo spi进行拓展
1
2
3
4
5
6
7
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
<!-- 设置成编译期间使用,否则放入dubbo项目后会jar冲突 -->
<scope>provided</scope>
</dependency>
  • LoadBalance负载均衡
1
2
3
4
5
6
7
8
9
public class MyLoadBalance implements LoadBalance {
// 自定义负载均衡策略
// invokers 是所有provider的实现,此方法主要是通过自定义策略选择返回一个provider的实现
@Override
public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
// 返回其中一个
return invokers.get(0);
}
}
  • ``META-INF.dubbo中创建接口全名的文件com.alibaba.dubbo.rpc.cluster.LoadBalance`
  • java自带的spi稍微不同,需要指定一个名称
1
myLoad=com.test.service.impl.MyLoadBalance
  • 使用此负载均衡
1
<dubbo:reference id="TestService" interface="com.test.service.TestService" loadbalance="myLoad"/>
  1. spi原理
    • 为所有接口生产一个加载器
    • 使用加载器生成接口代理对象
    • 使用代理对象执行方法时,根据参数判断使用那个实现类