首先需要引入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
就可以使用dubbo的注解 @Service @Reference使用了
springboot 简单自定义starter - dubbo
原文:https://www.cnblogs.com/rchao/p/10921484.html