• springboot 简单自定义starter


    首先需要引入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使用了

  • 相关阅读:
    数据处理
    Interleaving String
    Distinct Subsequences
    caffe 输入图像图像加高斯噪声
    caffe resize用interpolation
    软件測试基本方法(七)之验收測试
    CSS入门学习
    bzoj1458 士兵占据
    Swift高阶函数介绍(闭包、Map、Filter、Reduce)
    每天一点儿Java--list
  • 原文地址:https://www.cnblogs.com/rchao/p/10921484.html
Copyright © 2020-2023  润新知