RPC 服务暴露与引入
服务方
- 中转对象,用于中转代理对象的网络请求,参数、返回结果(
Protocol.export
创建)。
消费方
- 动态代理,为接口创建动态代理类,做请求发送功能。
- 使用
Protocol.referInvoker
,用于发送网络请求
Spring Rmi
服务提供者
// 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机制
本质是策略模式,一个接口,多个实现。根据不同策略选择,进行不同的策略。
-
java spi
例子
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
获取
com.test.service.impl.testServiceImpl1
com.test.service.impl.testServiceImpl2
com.test.service.impl.testServiceImpl3
-
dubbo spi
-
@SPI
注释标记的接口都可以使用dubbo spi
进行拓展
-
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
<!-- 设置成编译期间使用,否则放入dubbo项目后会jar冲突 -->
<scope>provided</scope>
</dependency>
-
LoadBalance
负载均衡
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
稍微不同,需要指定一个名称
myLoad=com.test.service.impl.MyLoadBalance
- 使用此负载均衡
<dubbo:reference id="TestService" interface="com.test.service.TestService" loadbalance="myLoad"/>
-
spi
原理- 为所有接口生产一个加载器
- 使用加载器生成接口代理对象
- 使用代理对象执行方法时,根据参数判断使用那个实现类
网友评论