Spring Boot以注解方式整合Dubbo

1.本文旨在总结Spring Boot和Dubbo的整合方式,对于Spring Boot和Dubbo的具体介绍不再赘述,如有兴趣可参考文章:Spring Boot 2 入门案例
Dubbo中Provider与Consumer搭建以及Dubbo的Admin管理界面
2.代码示例
第一、新建一个Maven工程DubboServer作为服务端。
a.新建DubboServer.java

package com.shi.remote;
/**
 * 服务端接口
 * @author shixiangcheng
 * 2020-04-30
 */
public interface DubboServer {
	/**
	 * 测试方法
	 * @param name
	 * @return
	 */
	public String test(String name);
}

b.新建DubboServerImpl.java

package com.shi.remote.impl;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Service;
import com.shi.remote.DubboServer;
/**
 * 服务端接口实现类
 * @author shixiangcheng
 * 2020-04-30
 */
@Component
@Service(group = "aj")
public class DubboServerImpl implements DubboServer {
	public String test(String name){
		return "HI "+name;
	}
}

c.两个重要的配置文件DubboProviderConfig.java和DubboServiceFactory.java(这两个文件在服务端和客户端的工程里都要加)

package com.shi.dubbo;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DubboProviderConfig {
    private static String applicationConfig_name_provider;
    private static String registry_adressall;
    private static Integer registry_protocol_port;
    @Value("${applicationConfig_name_provider}")
    public void setApplicationConfig_name_provider(String applicationConfig_name_provider) {
        DubboProviderConfig.applicationConfig_name_provider = applicationConfig_name_provider;
    }
    @Value("${registry_adressall}")
    public void setRegistry_adressall(String registry_adressall) {
        DubboProviderConfig.registry_adressall = registry_adressall;
    }
    @Value("${registry_protocol_port}")
    public void setRegistry_protocol_port(Integer registry_protocol_port) {
        DubboProviderConfig.registry_protocol_port = registry_protocol_port;
    }
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName(applicationConfig_name_provider);
        return applicationConfig;
    }
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress(registry_adressall);
        return registryConfig;
    }
    @Bean
    public ProtocolConfig protocol() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setPort(registry_protocol_port);
        return protocolConfig;
    }
}
package com.shi.dubbo;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service("DubboServiceFactory")
public final class DubboServiceFactory {
    private static String applicationConfig_name;
    @Value("${applicationConfig_name}")
    public void setApplicationConfig_name(String applicationConfig_name) {
        DubboServiceFactory.applicationConfig_name = applicationConfig_name;
    }
    private static String registry_adressall;
    @Value("${registry_adressall}")
    public void setRegistry_adressall(String registry_adressall) {
        DubboServiceFactory.registry_adressall = registry_adressall;
    }
    private static String registry_group;
    @Value("${registry_group}")
    public void setRegistry_group(String registry_group) {
        DubboServiceFactory.registry_group = registry_group;
    }
    private static final Map<String, ReferenceConfig> SERVICES = new HashMap<String, ReferenceConfig>();
    public static final <T> T getService0(Class<? extends T> clazz, String group) {
        return getService0(clazz, "", group);
    }
    public static final <T> T getService0(Class<? extends T> clazz) {
        return getService0(clazz, "", "");
    }
    public static final <T> T getService0(Class<? extends T> clazz,String version, String group) {
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress(registry_adressall);
        ApplicationConfig applicationConfig = new ApplicationConfig(applicationConfig_name);
        final String key = clazz.getName() + "." + version;
        ReferenceConfig reference = SERVICES.get(key);
        if (null == reference || null == (T) reference.get()) {
            synchronized (clazz) {
                reference = SERVICES.get(key);
                if (null == reference || null == (T) reference.get()) {
                    reference = new ReferenceConfig();
                    reference.setInterface(clazz);
                    reference.setRegistry(registry);
                    reference.setApplication(applicationConfig);
                    reference.setTimeout(5000);
                    reference.setRetries(0);
                    if (null != version && !"".equals(version.trim())) {
                        reference.setVersion(version);
                    }
                    if (null != group && !"".equals(group.trim())) {
                        reference.setGroup(group);
                    }
                    SERVICES.put(key, reference);
                }
            }
        }
        return (T) reference.get();
    }
}

d.启动类AjdpApplication.java

package com.shi;
import javax.sql.DataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
/**
 * Dubbo服务端引导类
 * @author shixiangcheng
 * 2020-04-30
 */
@SpringBootApplication
@DubboComponentScan({"com.shi.remote.impl"})
public class AjdpApplication {
    public static void main(String[] args) {
        SpringApplication.run(AjdpApplication.class, args);
    }
    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

e.application.yml配置

applicationConfig_name: dubbo
applicationConfig_name_provider: dubbo-provider
registry_adressall: zookeeper://ip:port | zookeeper://ip:port
registry_group: aj
registry_protocol_port: 30008

运行引导类,查看管理界面
在这里插入图片描述
第二、新建一个maven工程DubboClient作为客户端。
a.加入上面的两个重要配置文件,并加上面的接口文件打包成jar,引入到此工程。
b.新建DubboClient.java用于调用dubbo服务。

package com.shi.remote;
import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
/**
 * 客户端接口
 * @author shixiangcheng
 * 2020-04-30
 */
@Service
public class DubboClient {
	@Reference(group = "aj")
	private DubboServer dubboServer;
}

c.新建AjdpApplication.java引导类

package com.shi;
import javax.sql.DataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
/**
 * Dubbo客户端引导类
 * @author shixiangcheng
 * 2020-04-30
 */
@SpringBootApplication
@DubboComponentScan({"com.shi.remote"})
public class AjdpApplication {
    public static void main(String[] args) {
        SpringApplication.run(AjdpApplication.class, args);
    }
    @Bean
    public PlatformTransactionManager txManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

d.application.yml配置

applicationConfig_name: dubbo
applicationConfig_name_provider: dubbo-consumer
registry_adressall: zookeeper://ip:port | zookeeper://ip:port
registry_group: aj
registry_protocol_port: 30008

运行引导类
在这里插入图片描述
欢迎大家积极留言交流学习心得,点赞的人最美丽,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值