本文编写日期:2019/09/06
参考git源码:
dubbo-spring-boot-starter: https://github.com/alibaba/dubbo-spring-boot-starter
dubbo-spring-boot-project:https://github.com/apache/dubbo-spring-boot-project
跟着样例写demo
demo 源码地址: https://github.com/hechangyong/dubbolearn.git
我基本上是跟着 dubbo-spring-boot-starter写的。这边我编写了三个model。model结构如下图:
dubbo-commonapi
dubbo-commonapi model 就只编写了两个服务统一用到的API。如图:
这边就不多说了。
dubbo-provider-spring-boot
dubbo架构中服务提供者。
项目结构目录如下:
- 添加依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.hecy</groupId>
<artifactId>dubbo-commonapi</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<!-- 下面三个不添加会报错 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
- 在
application.properties
文件中添加dubbo
相关的配置
server.port=8888
# Spring boot application
spring.application.name=dubbo-provider-spring-boot
spring.dubbo.server=true
#zookeeper 需要提前启动。【可参考环境搭建那边文章】
spring.dubbo.registry=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
注:以上注册中心的配置只针对服务端,消费端不用指定。它自己会根据服务端的地址信息和@Reference(url = "dubbo://127.0.0.1:20880")
注解去解析协议。
- 接下来开始编写代码。代码如下:
@EnableDubboConfiguration
@SpringBootApplication
public class DubboProviderLauncher {
public static void main(String[] args) {
SpringApplication.run(DubboProviderLauncher.class, args);
}
}
@EnableDubboConfiguration
表示会开启dubbo功能。(dubbo provide
服务可以使用或者不使用web容器。 )
@Service(interfaceName ="com.hecy.dubbocommon.SayHello")
@Component
public class SayHelloServiceImpl implements SayHello {
@Override
public String sayHello(String name) {
return name + ": Say Hello To You";
}
}
注: 上面的@Service
【import com.alibaba.dubbo.config.annotation.Service
】注解。 其中interfaceClass是要发布的服务的接口名。
消费dubbo的服务
项目结构目录如下:
- 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.hecy</groupId>
<artifactId>dubbo-commonapi</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 在application中添加相关配置
#我这边是用spring boot 启动的。所以会和sever的端口错开
server.port=8881
spring.application.name=dubbo-consumber-spring-boot
- 添加代码
@EnableDubboConfiguration
@SpringBootApplication
public class DubboConsumberLauncher {
public static void main(String[] args) {
SpringApplication.run(DubboConsumberLauncher.class, args);
}
}
上面关注的点是需要开启@EnableDubboConfiguration
。
@RestController
@RequestMapping("/a")
public class SayHelloConsumberImpl {
//这里配置的地址不是 zookeeper 注册地址,而是服务方开启的dubbo服务地址。
@Reference(url = "dubbo://127.0.0.1:20880")
private SayHello sayHello;
@GetMapping("/b")
public String sayhello(){
return sayHello.sayHello("小可爱");
}
}
注: 这边需要主要注意的是dubbo 的@Reference
和 spring 的@Controller
有冲突,使用后调用dubbo服务会报404
错误。 在对外暴露接口的时候需要使用@RestController
这个注解。
下图是运行结果: