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
运行引导类
欢迎大家积极留言交流学习心得,点赞的人最美丽,谢谢