springboot是基于注解配置,比起以往的springMVC臃肿的xml配置(虽然springMVC也可以使用注解进行配置),可以快速、简便地搭建起web服务。
dubbo是阿里的一个分布式开源框架。
搭建步骤:
一、本地安装zookeeper并启动服务
二、使用 idea新建一个springboot工程
三、在pom.xml中添加配置,使用dubbo和zkclient(zookeeper的客户端)的maven仓库。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
四、dubbo相关配置:
基础配置,注册服务和协议
/**
* DubboBaseConfig.java
*/
import com.alibaba.dubbo.config.*;
import org.springframework.context.annotation.Bean;
public class DubboBaseConfig {
@Bean
public RegistryConfig registry() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("127.0.0.1:2181");
registryConfig.setProtocol("zookeeper");
return registryConfig;
}
@Bean
public ApplicationConfig application() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("testApp");
return applicationConfig;
}
@Bean
public MonitorConfig monitorConfig() {
MonitorConfig mc = new MonitorConfig();
mc.setProtocol("registry");
return mc;
}
@Bean
public ReferenceConfig referenceConfig() {
ReferenceConfig rc = new ReferenceConfig();
rc.setMonitor(monitorConfig());
return rc;
}
@Bean
public ProtocolConfig protocol() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setPort(20880);
return protocolConfig;
}
@Bean
public ProviderConfig provider() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setMonitor(monitorConfig());
return providerConfig;
}
}
服务方配置
/**
* Export.java
*/
import com.alibaba.dubbo.config.spring.ServiceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Export extends DubboBaseConfig{
@Bean
public ServiceBean<Person> personProvider(Person person) {
ServiceBean<Person> serviceBean = new ServiceBean<Person>();
serviceBean.setProxy("javassist");
serviceBean.setVersion("myversion");
serviceBean.setInterface(Person.class.getName());
serviceBean.setRef(person);
serviceBean.setTimeout(5000);
serviceBean.setRetries(3);
return serviceBean;
}
消费方配置
/**
* Consumer.java
*/
import com.alibaba.dubbo.config.spring.ReferenceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Consumer extends DubboBaseConfig{
@Bean
public ReferenceBean<Person> personConsumer() {
ReferenceBean<Person> ref = new ReferenceBean<>();
ref.setVersion("myversion");
ref.setInterface(Person.class);
ref.setTimeout(5000);
ref.setRetries(3);
ref.setCheck(false);
return ref;
}
}
五、实例
声明接口 Person
public interface Person {
String talk();
}
服务方编写实现逻辑
import org.springframework.stereotype.Service;
@Service("person")
public class PersonImpl implements Person {
@Override
public String talk() {
return "Provider personImpl method";
}
}
服务方启动服务后,消费方声明跟服务方一样的dubbo基础配置和接口。
消费方不知道具体的实现逻辑,直接启动服务,调用接口。
@Autowired
Consumer consumer;
@RequestMapping("/consumer")
@ResponseBody
public String refer(){
return consumer.personConsumer().get().talk();
}