背景
相信阅读过Dubbo源码的同学应该看到在Dubbo中的很多接口上都有一个@SPI
的注解,笔者也不例外,但是一直不知道这个注解具体是干什么的,为了解决什么问题,怎么去使用?网上简单检索了下,中文名:服务供给接口,详见下图(来自百度百科)。
也许因为dubbo
本身的功能强大,所以笔者也只是知道能dubbo
可以自定义实现某些策略,比如负载均衡、序列化、线程池类型等等,但是还未正式在线上环境中使用。趁着节假日花些时间研究下,记录下,希望对大家有用。
代码样例
以下代码均是经过本地验证的,纯属手敲,具体执行详见Glory’s Github
注:测试项目搭建spring-boot
+ spring-boot-dubbo
验证思路
正如上图所属,说@SPI
是实现某个特定的服务,那就来个简单的实现,最熟悉的莫过于负载均衡(LoadBalance
)策略了,本地启动两个provider
,端口不同,通过consumer
的入参来决定访问指定的provider
。
启动provider
代码极其简单,代码框架如下
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.rpc.RpcContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
// 指定版本和分组
@Service(version = "1.0.0",group = "glory")
public class DemoServiceImpl implements DemoService {
private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);
@Override
public String sayHello(Integer port) {
logger.info("Hello " + port + " request from consumer: " + RpcContext.getContext().getRemoteAddress());
return "Hello ,"+port+" response from provider: " + RpcContext.getContext().getLocalAddress();
}
}
以下为application.yml
配置文件
server:
port: 8083
dubbo:
application:
name: dubbo-common-provider
scan:
base-packages: com.redsun.rpc.dubbo
protocol:
name: dubbo
port: 12345
registry:
address: zookeeper://127.0.0.1:2181
还需要注意的是,在启动时需要指定不同端口,否在无法启动。