写了一份spring-boot + zoopkeeper + dubbo分布式调通的demo
生产者 git@github.com:WilliamGai/springboot_dubbo_provider.git
消费者 git@github.com:WilliamGai/springboot_dubbo_consumer.git
1.生产者
dubbo.properties配置文件
dubbo.application.name=application_hello
dubbo.application.logger=slf4j
#usage scena: dubbo + zookeeper
dubbo.annotation.package=com.williamy.dubbo
dubbo.protocol.name=dubbo
dubbo.protocol.port=20883
dubbo.protocol.accessLog=true
dubbo.provider.timeout=3000
dubbo.provider.retries=1
dubbo.provider.delay=-1
dubbo.registr.protocol=zookeeper
dubbo.registry.address=123.56.13.70:2181
dubbo.registry.register=true
dubbo.registry.subscribe=true
dubbo配置
package com.williamy.dubbo.provider;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.AnnotationBean;
import com.alibaba.dubbo.rpc.Exporter;
import com.williamy.LogCore;
@Configuration
@ConditionalOnClass(Exporter.class)
@PropertySource(value = "classpath:/dubbo.properties")
public class DubboConfiguration {
@Value("${dubbo.application.name}")
private String applicationName;
@Value("${dubbo.registr.protocol}")
private String protocol;
@Value("${dubbo.registry.address}")
private String registryAddress;
@Value("${dubbo.protocol.name}")
private String protocolName;
@Value("${dubbo.protocol.port}")
private int protocolPort;
@Value("${dubbo.provider.timeout}")
private int timeout;
@Value("${dubbo.provider.retries}")
private int retries;
@Value("${dubbo.provider.delay}")
private int delay;
/**设置dubbo扫描包*/
@Bean
public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) {
AnnotationBean annotationBean = new AnnotationBean();
annotationBean.setPackage(packageName);
return annotationBean;
}
/**dubbo上下文*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName(this.applicationName);
return applicationConfig;
}
/** 注册zookeeper*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registry = new RegistryConfig();
registry.setProtocol(protocol);
registry.setAddress(registryAddress);
return registry;
}
/**协议 */
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName(protocolName);
protocolConfig.setPort(protocolPort);
protocolConfig.setThreads(200);
LogCore.RPC.info("protocolConfig:{}", protocolConfig.hashCode());
return protocolConfig;
}
/**服务提供者*/
@Bean(name="myProvider")
public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig) {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(timeout);
providerConfig.setRetries(retries);
providerConfig.setDelay(delay);
providerConfig.setApplication(applicationConfig);
providerConfig.setRegistry(registryConfig);
providerConfig.setProtocol(protocolConfig);
return providerConfig;
}
}
发布的服务
package com.williamy.dubbo;
import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Service;
@Component
@Service(version="1.0.0")
public class HelloDubboService implements IHelloDubboService {
@Override
public String sayHello() {
return System.getProperty("user.dir")+System.getProperty("os.name");
}
}
public interface IHelloDubboService {
String sayHello();
}
然后mvn spring-boot:启动即可
2.消费者
dubbo.properties文件跟provider一样
接口
package com.williamy.dubbo;
public interface IHelloDubboService {
String sayHello();
}
消费者是i用dubbo的@Reference来声明务必保证这个接口被dubbo扫描,应在dubbo.poperties配置的扫描包内
/**
* Reference会作为消费者寻找远程服务
*/
@Service
public class DubboServiceHandler {
@Reference(version="1.0.0")
public
IHelloDubboService helloservice;
}
使用
package com.williamy;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.config.annotation.Service;
import com.williamy.dubbo.IHelloDubboService;
import com.williamy.dubbo.DubboServiceHandler;
@Controller
@SpringBootApplication
public class App {
@Autowired
DubboServiceHandler testService;
@Reference(version="1.0.0")
IHelloDubboService helloservice;
@RequestMapping("/hello")
@ResponseBody
String testDubboDemo() {
return this.hashCode()+"Hello dubbo consumer a!"+testService.helloservice.sayHello();
}
public static void main(String[] args) throws Exception {
LogCore.BASE.info("app started={}", Arrays.toString(args));
ConfigurableApplicationContext context = SpringApplication.run(App.class, args);
LogCore.BASE.info("app all services={}",(context.getBeansWithAnnotation(Service.class)));
LogCore.BASE.info("app all referens={}",(context.getBeansWithAnnotation(Reference.class)));
}
}
启动后测试