Springboot 整合dubbo小案例
最近在看dubbo的一些案例,发现dubbo作为一个分布式的SOA服务治理框架,与普通的项目相比,优势多了很多,springboot作为快速构建微服务的王牌框架,我感觉它对于整个spring框架的封装非常好,对于快速构建一个spring程序来说,让我们更加注重于代码的编写,而框架帮你把需要的配置变成了一条龙服务,在Dubbo Spring Boot 工程中, 整合了dubbo和springboot,使dubbo和springboot的使用变得更加简单,只需要几行简单的配置,使用dubbo+springboot变得更加容易,在incubator-dubbo-spring-boot-project 发布0.2.1版本后,去官网看了一个简单的demo,我是踩坑的能手
技术选型 Springboot+Dubbo
版本选择 :
官网的说明是springboot 和dubbo的版本是有兼容性问题的,并指出了明确的版本对应依赖
我们使用springboot 2.0.3 +incubator-dubbo-spring-boot-project 0.2.1 这个是dubbo整合springboot项目的一个模块
话不多说,上代码,我使用的编辑器是IDEA,使用Eclispe也是一样的道理,只是构建maven的界面有些不一样
父工程目录如下:
项目的父目录:pom工程没有什么实际用途,idea中一次只能编辑一个项目,使用一个空的项目,只是为了方便同时管理3个模块
api模块:jar工程,主要是提供POJO类,服务者和消费者通信使用的公共接口,整合mybatis的话可以将mapper文件放到这里,将来有其他模块的话可以提供给其他模块使用
生产者模块:jar工程 主要负责公共接口的具体业务实现,只做业务,依靠dubbo向外提供服务
消费者模块:war工程 主要负责根据客户端的具体需求,调用服务,负责接收数据,渲染数据,
建立工程步骤略....
api模块的工程pom文件:只有pojo类和公共的服务接口,所以不需要任何依赖
生产者模块的pom文件:
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-actuator</artifactId>
<version>0.2.1-SNAPSHOT</version>
</dependency>
<!-- 依赖api模块,消费者和生产者都需要api模块的依赖-->
<dependency>
<groupId>bootdubbodemo2</groupId>
<artifactId>bootdubbodemo2-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
其中springboot的依赖和dubbo-spring-boot-project的依赖如果下载不下来的话,可以直接去github上把相应的版本下载下来,然后安装到本地仓库,下载地址链接:https://pan.baidu.com/s/1uY85EsOjGfsGQD1urxmj7A 密码:z1gk 注意版本是0.2.1
springboot下载不下来的话建议更改maven镜像或者是换一个网速比较好的地方,我用的maven镜像是
<mirrors>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirrors>
将dubbo-spring-boot-project下载下来之后,复制到本地仓库解压,shift+右键打开命令窗口 执行mvn install 安装到本地仓库
注:依赖的问题一定要解决好,,一定要解决好.....别问我怎么知道的,血一般的教训!!!
消费者模块的pom文件:
<dependencies>
<!-- Spring Boot dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-actuator</artifactId>
<version>0.2.1-SNAPSHOT</version>
</dependency>
<!-- 依赖的消费者模块-->
<dependency>
<groupId>bootdubbodemo2</groupId>
<artifactId>bootdubbodemo2-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
pom配置文件搞定之后我们开始写代码,我们先写api模块
看一下整个api模块的目录结构
api模块是提供公共的服务接口的,我们做为演示,这里只有一个接口,接口种只有一个方法
package boot.dubbodemo.service;
public interface TestDubboService {
String sayHello(String username);
}
有了公共的服务接口我们开始编写生产者的代码:整个生产者的目录结构如下所示:
先看一下我们的配置文件的编写 application.properties文件
# Spring boot application
spring.application.name = dubbo-provider-demo
server.port = 9090
management.server.port = 9091
# Service version
demo.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages = boot.dubbodemo.service.impl
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://140.143.15.153:2181
:
主要说明以下几个配置文件:
# Spring boot 的基本配置 生产者工程为非web工程,所以这个可选,如果出错了,就配上....
spring.application.name = dubbo-provider-demo
server.port = 9090
management.server.port = 9091
demo.service.version 这是一个我们自定义的服务版本号,可以随便写,推荐规范的书写
dubbo.scan.basePackages 这个配置只要用来扫描我们向外提供服务的实现类的包
dubbo.application.id 标识dubbo应用的id
dubbo.application.name 标识dubbo应用的name
dubbo.protocol.id = dubbo写协议的id
dubbo.protocol.name = 标识使用dubbo协议
dubbo.protocol.port = dubbo协议的端口号默认为20880
dubbo.registry.id 注册中心的配置id
dubbo.registry.address = zookeeper://140.143.15.153:2181 注册中心的地址
具体的服务实现的代码
package boot.dubbodemo.service.impl;
import boot.dubbodemo.service.TestDubboService;
import com.alibaba.dubbo.config.annotation.Service;
@Service(
version = "${demo.service.version}",
application = "${dubbo.application.id}",
protocol = "${dubbo.protocol.id}",
registry = "${dubbo.registry.id}"
)
public class TestDubboServiceImpl implements TestDubboService {
@Override
public String sayHello(String username) {
return "Hello"+username;
}
}
注意 @Service注解是dubbo提供的,不是Springboot提供的
然后是生产者的启动类,一定要放在一个自己建的包下边,
@SpringBootApplication
public class ProviderApp {
public static void main(String[] args) {
new SpringApplicationBuilder(ProviderApp.class)
.web(false) // 非 Web 应用
.run(args);
}
}
至此生产者模块完成!
消费者模块:整个消费者模块的目录结构如下:
消费者的application.properties文件的编写
# Spring boot application
spring.application.name = dubbo-consumer-demo
server.port = 8080
# Service Version
demo.service.version = 1.0.0
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer-demo
dubbo.application.name = dubbo-consumer-demo
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20881
#dubbo.protocol.register=true
dubbo.registry.address = zookeeper://140.143.15.153:2181
配置文件跟上边的差不太多,这里就不过多的说了
服务接口的调用类controller
package boot.dubbodemo.controller;
import boot.dubbodemo.service.TestDubboService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestDubboConsumerController {
@Reference(version = "${demo.service.version}",
application = "${dubbo.application.id}",
url = "dubbo://localhost:20880"
)
private TestDubboService demoService;
@RequestMapping("/sayHello")
public String sayHello(@RequestParam String name) {
return demoService.sayHello(name);
}
}
Url是两个dubbo协议之间通信的地址,
@Reference注解可以标注diaoyo呢个该服务时的一些参数,用来调用服务者的服务,这个注解也是dubbo提供的
接下来是消费者启动类
package boostrap;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "boot.dubbodemo.controller")
public class TestConsumerApp {
public static void main(String[] args) {
SpringApplication.run(TestConsumerApp.class,args);
}
}
scanBasePackages,标注扫描的包路径,用来发现@Reference注解的
接下来我们准备启动服务:启动之前最好把api模块安装到本地 执行api的构建命令 mvn install一下
使用idea比较方便,直接这样搞就可以
出现这个界面就说明构建成功了!
启动项目:
1 启动生产者:
2 启动消费者项目
接下来我们访问项目的入口在浏览器地址栏输入ip+端口号
demo示例完成!以上的说明,或者是哪些地方有写的不对的,欢迎批评指正!!!!!!!!!!!!!!!!
最后附上官方demo案例的地址
https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md