深入Dubbo源码 - SPI的使用与好处

本文深入探讨Dubbo中的SPI机制,通过代码样例和源码分析展示了如何自定义负载均衡策略,并解释了SPI在Dubbo中的作用和使用方法,包括ExtensionLoader的加载和运行过程。最后,总结了SPI的便捷性和潜在的优化空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

相信阅读过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:
  ap
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值