springboot 简单自定义starter - dubbo
首先需要引入pom 这里使用nacos注册中心 所以引入了nacos-client 使用zookeeper注册中心的话需要引入其相应的client
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>0.0.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.6</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.36.Final</version> </dependency>
然后新建DubboProperties
@ConfigurationProperties(prefix = "dubbo") public class DubboProperties { @NestedConfigurationProperty private ApplicationBean application; @NestedConfigurationProperty private ProtocolBean protocol; @NestedConfigurationProperty private RegistryBean registry; public ApplicationBean getApplication() { return application; } public void setApplication(ApplicationBean application) { this.application = application; } public ProtocolBean getProtocol() { return protocol; } public void setProtocol(ProtocolBean protocol) { this.protocol = protocol; } public RegistryBean getRegistry() { return registry; } public void setRegistry(RegistryBean registry) { this.registry = registry; } } //下面定义的几个相关类 其实不定义也可以直接使用dubbo内置的类ApplicationConfig RegistryConfig ProtocolConfig //因为这些字段是对象所以需要添加 @NestedConfigurationProperty否则无法提供正确的提示,并且参数注入可能也会出现问题 //这里自定义主要提供一些常用的配置 并且添加注解提示的时候也容易看 //生成的 spring-configuration-metadata.json 中文是正常的但是使用的时候中文提示是乱码,暂时不清楚怎么回事 public class ApplicationBean implements Serializable { /** * 名称 */ private String name; /** * 版本 */ private String version; /** * 是否使用qos */ private Boolean qosEnable; /** * qos端口 */ private Integer qosPort; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public Boolean getQosEnable() { return qosEnable; } public void setQosEnable(Boolean qosEnable) { this.qosEnable = qosEnable; } public Integer getQosPort() { return qosPort; } public void setQosPort(Integer qosPort) { this.qosPort = qosPort; } } public class RegistryBean implements Serializable { /** * 注册中心地址 服务提供端和消费端都需要注册 * zookeeper,nacos,redis等注册中心的地址 */ private String address; /** * 注册中心的用户名 */ private String username; /** * 注册中心的密码 */ private String password; /** * 服务注册的分组 一般小项目默认分组就可以了 */ private String group; /** * 启动时是否检测注册中心 默认检测 */ private Boolean check = true; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getGroup() { return group; } public void setGroup(String group) { this.group = group; } public Boolean getCheck() { return check; } public void setCheck(Boolean check) { this.check = check; } } public class ProtocolBean implements Serializable { /** * 使用 dubbo 协议就可以 */ private String name = "dubbo"; /** * */ private String host; /** * 端口号20880 */ private Integer port = 20880; /** * 线程数 200个 */ private Integer threads = 200; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public Integer getThreads() { return threads; } public void setThreads(Integer threads) { this.threads = threads; } }
然后写几个自动配置类
DubboAutoConfiguration
@Configuration @EnableConfigurationProperties(DubboProperties.class) public class DubboAutoConfiguration { @Autowired private DubboProperties dubboProperties; @Bean @ConditionalOnMissingBean public ApplicationConfig applicationConfig(){ ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(dubboProperties.getApplication().getName()); applicationConfig.setVersion(dubboProperties.getApplication().getVersion()); applicationConfig.setQosEnable(dubboProperties.getApplication().getQosEnable()); applicationConfig.setQosPort(dubboProperties.getApplication().getQosPort()); return applicationConfig; } @Bean @ConditionalOnMissingBean public RegistryConfig registryConfig(){ RegistryConfig registryConfig = new RegistryConfig(); registryConfig.setAddress(dubboProperties.getRegistry().getAddress()); registryConfig.setCheck(dubboProperties.getRegistry().getCheck()); registryConfig.setUsername(dubboProperties.getRegistry().getUsername()); registryConfig.setPassword(dubboProperties.getRegistry().getPassword()); registryConfig.setGroup(dubboProperties.getRegistry().getGroup()); return registryConfig; } @Bean @ConditionalOnMissingBean public ProtocolConfig protocolConfig(){ ProtocolConfig protocolConfig = new ProtocolConfig(); if(dubboProperties.getProtocol() != null){ protocolConfig.setName(dubboProperties.getProtocol().getName()); protocolConfig.setHost(dubboProperties.getProtocol().getHost()); protocolConfig.setPort(dubboProperties.getProtocol().getPort()); protocolConfig.setThreads(dubboProperties.getProtocol().getThreads()); } return protocolConfig; } }
DubboProviderAutoConfiguration
@Configuration @AutoConfigureAfter(DubboAutoConfiguration.class) @EnableConfigurationProperties(DubboProperties.class) public class DubboProviderAutoConfiguration { @Autowired private DubboProperties dubboProperties; @Bean @ConditionalOnMissingBean public ProviderConfig providerConfig(){ ProviderConfig providerConfig = new ProviderConfig(); //重试次数 providerConfig.setRetries(0); //过滤器 providerConfig.setFilter(null); providerConfig.setTimeout(3000); providerConfig.setGroup(dubboProperties.getRegistry().getGroup()); return providerConfig; } }
DubboConsumerAutoConfiguration
@Configuration @AutoConfigureAfter(DubboAutoConfiguration.class) @EnableConfigurationProperties(DubboProperties.class) public class DubboConsumerAutoConfiguration { @Autowired private DubboProperties dubboProperties; @Bean @ConditionalOnMissingBean public ConsumerConfig consumerConfig(){ ConsumerConfig consumerConfig = new ConsumerConfig(); consumerConfig.setRetries(0); consumerConfig.setTimeout(3000); consumerConfig.setCheck(true); consumerConfig.setGroup(dubboProperties.getRegistry().getGroup()); return consumerConfig; } }
在resources/META-INF下新建spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.chao.dubbo.DubboAutoConfiguration,\ com.chao.dubbo.DubboProviderAutoConfiguration,\ com.chao.dubbo.DubboConsumerAutoConfiguration
在resources/META-INF 下新建spring.provides
provides: dubbo-spring-boot-autoconfigure
使用的时候(提供端和消费端)的启动类上要加入 com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan 注解 @DubboComponentScan
不能使用com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo 注解 @EnableDubbo
DubboProperties 添加前缀比如spring.dubbo(前缀随便填写,不一定是spring,可是是别的) 可以使用@EnableDubbo注解
如果仅引入pom依赖使用的时候可以使用@EnableDubbo注解使用dubbio 配置直接从dubbo官网或者nacos官网查找即可
其实感觉也没必要自己定义配置ApplicationConfig,RegistryConfig 等类的配置主要自己也不太熟悉能使用但是也不知道有什么bug
## 服务端配置 dubbo.application.name = dubbo-provider-demo dubbo.registry.address = nacos://127.0.0.1:8848 dubbo.protocol.name = dubbo dubbo.protocol.port = -1 ## 消费端配置 dubbo.application.name = dubbo-consumer-demo dubbo.registry.address = nacos://127.0.0.1:8848
就可以使用dubbo的注解 @Service @Reference使用了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端