最近一直在学习Dubbo,发现网上并没有一遍很完美的SpringBoot整合Dubbo的demo。自己也是琢磨了很久,有很多坑。下面给大家分享一个SpringBoot整合dubbo的一个小demo。第一次写博客哈哈哈哈哈。
整合之前大家去网上下载一个zookeeper,并开启注册中心,网上有很多zookeeper的教程配置很简单。
开启服务的时候先启动zkService.cmd开启成功后大概是这样的
创建一个Maven项目
我IDEA刚用没多久有点菜鸡,我是一个父项目里面包含两个子项目,大家也可以分别创建一个生产者一个消费者
在父项目下创建子项目
这样一个生产者一个消费者的项目分别就创建完成了
**Springboot整合Duboo的POM依赖只有这三个,之前少导了一个整合包, 一直空指针异常。**
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
com.alibaba
dubbo
2.6.2
org.apache.curator
curator-framework
2.12.0
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.1.RELEASE
com.zfbgt.dubbo.consumer
demo
1.0.0
demo
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
com.alibaba.boot
dubbo-spring-boot-starter
0.2.0
com.alibaba
dubbo
2.6.2
org.apache.curator
curator-framework
2.12.0
org.springframework.boot
spring-boot-maven-plugin
dubbo.application.name=annotation-provider #服务生产的名字
dubbo.registry.address=zookeeper://127.0.0.1:2181 #开启本地的zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo //可以在指定的包名下扫描 Dubbo 的服务提供者以及 Dubbo 的服务消费者
@SpringBootApplication //SpringBoot启动类
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
package com.zfbgt.dubbo.service;
import org.springframework.stereotype.Service;
//这里接口我加了个service注解,如果去掉的话消费者那边调用会出现空指针也是一个坑
@Service
public interface SayHello {
String sayHello();
}
注意@Service注解是dubbo的注解,而我们为了区分用了Spring的@component
import com.alibaba.dubbo.config.annotation.Service;
import com.zfbgt.dubbo.service.SayHello;
import org.springframework.stereotype.Component;
@Service
@Component
public class SayHelloImpl implements SayHello {
@Override
public String sayHello() {
return "这是一个dubbo的微服务";
}
}
注意!这个接口和服务生产者的接口是一样的!
public interface SayHello {
String sayHello();
}
为了测试我们在写一个接口
public interface Annotation {
String doSayHello();
}
注意@Reference是dubbo的注解。
import com.alibaba.dubbo.config.annotation.Reference;
import com.zfbgt.dubbo.service.SayHello;
import org.springframework.stereotype.Component;
@Component
public class AnnotationAction{
@Reference
private SayHello sayHello;
public String doSayHello(){
return sayHello.sayHello();
}
}
import com.zfbgt.dubbo.serviceImpl.AnnotationAction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Hello {
@Autowired
private AnnotationAction annotationAction;
@ResponseBody
@RequestMapping(value = "hello")
public String hello(){
String s = annotationAction.doSayHello();
return s;
}
}
dubbo.application.name=annotation-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.consumer.timeout=3000
server.port=8081 #防止和生产者接口产生冲突
@EnableDubbo //可以在指定的包名下扫描 Dubbo 的服务提供者以及 Dubbo 的服务消费者
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
打开网页输入http://localhost:8081/hello
这样就完成了。网上有很多用xml来实现dubbo,Springboot推荐无xml形式,既然我们用的Springboot还是用application.properties或者yml的形式比较好。