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

就可以使用dubbo的注解 @Service @Reference使用了

猜你喜欢

转载自www.cnblogs.com/rchao/p/10921484.html