SpringBoot集成Dubbo
一、基本步骤
1. Dubbo服务接口
创建一个接口项目,12-springboot-dubbo-interface,该项目只定义接口和model类
1、创建普通的Maven项目,dubbo服务接口工程
2、创建 UserService 接口
创建service包,在这个包下写
package service;/** * @author MD * @create 2020-08-22 6:31 */public interface StudentService { /** * 获取学生总人数 * @return */ Integer queryAllStudentCount();}
2. Dubbo服务提供者
创建 SpringBoot 框架的 WEB 项目,13-springboot-dubbo-provider
2、依赖
加入 Dubbo 集成 SpringBoot 的起步依赖
由于使用 zookeeper 作为注册中心,需加入 zookeeper 的客户端
加入 Dubbo 接口依赖
<!--Dubbo 集成 SpringBoot 框架起步依赖--><dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency><!--Zookeeper 客户端依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency><!--dubbo接口依赖--> <dependency> <groupId>com.md.springboot</groupId> <artifactId>12-springboot-dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
3、在Springboot 的核心配置文件
application.properties中配置 dubbo
#设置内嵌Tomcatserver.port=8081#设置上下文根server.servlet.context-path=/#配置 dubbo 的服务提供者信息#服务提供者应用名称(必须写,且不能重复)spring.application.name=springboot-dubbo-provider#设置当前工程为服务提供者spring.dubbo.server=true#设置注册中心spring.dubbo.registry=zookeeper://localhost:2181
注意:Dubbo 的 的注解都是自定义的注解,由我们添加的 Dubbo 依赖中的类 进行 处理 编写dubbo 配置是没有提示的
4、编写 Dubbo 的接口实现类,并暴露接口
在com.md.springboot.service.impl下面
package com.md.springboot.service.impl;import com.alibaba.dubbo.config.annotation.Service;import org.springframework.stereotype.Component;import service.StudentService;/** * @author MD * @create 2020-08-22 6:46 */@Component// 也可以这样写,写接口的权限定类名//@Service(interfaceName ="com.md.springboot.service.StudentService",version = "1.0.0",timeout= 15000)//暴露出接口的类名.class,版本号,@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 15000)public class StudentServiceImpl implements StudentService { @Override public Integer queryAllStudentCount() { //调用数据持久层,经过一系列操之后得到学生总人数 return 200; }}
注意使用service注解的时候:使用alibaba的这个
5、SpringBoot 入口 程序启 类上加开启 Dubbo 配置支持注解
package com.md.springboot;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboConfiguration // 开启Dubbo配置public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
3. Dubbo服务消费者
创建 SpringBoot 框架的 WEB 项目,14-springboot-dubbo-comsumer
2、依赖pom.xml
加入 Dubbo 集成 SpringBoot 的起步依赖
由于使用 zookeeper 作为注册中心,需加入 zookeeper 的客户端
加入 Dubbo 接口依赖
<!--Dubbo 集成 SpringBoot 框架起步依赖--><dependency><groupId>com.alibaba.spring.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.0.0</version></dependency><!--Zookeeper 客户端依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency><!--dubbo接口依赖--> <dependency> <groupId>com.md.springboot</groupId> <artifactId>12-springboot-dubbo-interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
3、在Springboot 的核心配置文件
application.properties中配置 dubbo
#设置内嵌Tomcatserver.port=8080#设置上下文根server.servlet.context-path=/#配置 dubbo 的服务提供者信息#服务提供者应用名称(必须写,且不能重复)spring.application.name=springboot-dubbo-consumer#设置注册中心spring.dubbo.registry=zookeeper://localhost:2181
4、编写 Controller 类,调用远程的 Dubbo 服务
在com.md.springboot.web下面
package com.md.springboot.web;import com.alibaba.dubbo.config.annotation.Reference;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;import service.StudentService;/** * @author MD * @create 2020-08-22 7:15 */@Controllerpublic class StudentController { // 调用暴露的接口 @Reference(interfaceClass = StudentService.class,version = "1.0.0",check = false) private StudentService studentService; @GetMapping(value = "/student/count") @ResponseBody public Object studentCount(){ Integer count = studentService.queryAllStudentCount(); return "学生的总人数:"+count; }}
注意使用Reference注解的时候:使用alibaba的这个
5、SpringBoot 入口 程序启动类上加开启 Dubbo 配置支持注解
package com.md.springboot;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboConfiguration // 开启Dubbo配置public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
4. 测试
5. 总结
接口工程:存放实体bean和业务接口
服务提供者:
- 业务接口的实现类并将服务暴露且注册到注册中心,调用数据持久层
- 添加依赖dubbo、zookeeper、接口工程
- 配置服务提供者的核心配置文件
服务消费者:
- 处理浏览器客户端发送的请求,从注册中心调用服务提供者所提供的服务
- 添加依赖dubbo、zookeeper、接口工程
- 配置服务消费者的核心配置文件
二、SpringBoot 集成 SSM+Dubbo
1. 创建 Maven Java 工程,Dubbo 接口工程
2. 创建 Dubbo 服务提供者项目
16-springboot-ssm-dubbo-provider
3. 配置 MyBatis 逆向工程
在16-springboot-ssm-dubbo-provider项目中
1、添加插件,pom.xml中
<!--mybatis 代码自动生成插件--> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> <configuration> <!--配置文件的位置--> <configurationFile>GeneratorMapper.xml</configurationFile> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </plugin>
2、将配置文件存放到项目根据目录
GeneratorMapper.xml 内容如下
注意:生成model类时,指定位置,生成到接口项目中
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 --> <classPathEntry location="E:\Java\tool\maven_repository\mysql\mysql-connector-java\5.1.9\mysql-connector-java-5.1.9.jar"/> <!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 --> <context id="tables" targetRuntime="MyBatis3"> <!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 --> <commentGenerator> <property name="suppressAllComments" value="true"/> </commentGenerator> <!-- 配置数据库连接信息 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/springboot" userId="root" password="123456"> </jdbcConnection><!--此时model生成在接口中,targetProject指定位置--> <!-- 生成 model 类,targetPackage 指定 model 类的包名, targetProject 指定 生成的 model 放在 IDEA 的哪个工程下面--> <javaModelGenerator targetPackage="com.md.springboot.model" targetProject="E:\Java\code\springboot\15-springboot-ssm-dubbo-interface\src\main\java"> <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="false"/> </javaModelGenerator> <!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的 包名, targetProject 指定生成的 mapper.xml 放在 IDEA 的哪个工程下面 --> <sqlMapGenerator targetPackage="com.md.springboot.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包 名, targetProject 指定生成的 Mapper 接口放在 IDEA 的哪个工程下面 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.md.springboot.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- 数据库表名及对应的 Java 模型类名,有几个表写几个table --> <table tableName="t_student" domainObjectName="Student" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> </context></generatorConfiguration>
数据表名:t_student
4. 双击生成
生成的如下:
5、实体 bean 必须实现序列化
public class Student implements Serializable {
4. 服务提供者添加依赖
在pom.xml中
注意:
先生成完逆向工程,在写接口依赖
<!--Dubbo 集成 SpringBoot 框架起步依赖--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--Zookeeper 客户端依赖--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!--MyBatis 集成 SpringBoot 框架起步依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency> <!--MySQL 数据库驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <!--生成完逆向工程再写这个--> <!--接口工程--> <dependency> <groupId>com.md.springboot</groupId> <artifactId>15-springboot-ssm-dubbo-interface</artifactId> <version>1.0.0</version> </dependency>
5. 手动指定资源配置文件路径
在 pom 文件中的 build 标签中添加
<!--手动指定资源配置文件路径--> <!--目的:将数据持久层映射文件编译到 classpath 中--> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources>
6. 配置提供者核心配置
application.properties
#配置内嵌 Tomcat 端口号server.port=8081#设置上下文根server.servlet.context-path=/provider#配置数据源spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springbootspring.datasource.username=rootspring.datasource.password=123456#配置 dubbo 服务提供者spring.application.name=springboot-ssm-dubbo-provider#表示是服务提供者spring.dubbo.server=true#注册中心地址spring.dubbo.registry=zookeeper://localhost:2181
7. 配置提供者启动类
package com.md.springboot;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication@EnableDubboConfiguration@MapperScan(basePackages = "com.md.springboot.mapper") // 扫描数据持久层映射文件public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
8. 创建 Dubbo 服务消费者项目
17-springboot-ssm-dubbo-consumer
9. 服务消费者添加依赖
完整的pom.xml文件
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.md.springboot</groupId> <artifactId>17-springboot-ssm-dubbo-consumer</artifactId> <version>1.0.0</version> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Dubbbo 集成 SpringBoot 框架起步依赖--> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!--zookeeper 注册中心--> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!--接口工程--> <dependency> <groupId>com.md.springboot</groupId> <artifactId>15-springboot-ssm-dubbo-interface</artifactId> <version>1.0.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
10. 配置消费者核心配置
application.properties
#配置内嵌 Tomcat 端口号server.port=8080#配置项目上下文根server.servlet.context-path=/consumer#配置 zookeeper 注册中心spring.application.name=springboot-ssm-dubbo-consumerspring.dubbo.registry=zookeeper://localhost:2181
11. 配置消费者启动类
@SpringBootApplication@EnableDubboConfiguration // 开启dubbo支持配置public class Application {
12. 创建 StudentService 业务接口类
在15-springboot-ssm-dubbo-interface中
package com.md.springboot.service;import com.md.springboot.model.Student;/** * @author MD * @create 2020-08-22 9:35 */public interface StudentService { /** * 通过id查询学生信息 * @param id * @return */ Student queryStudentById(Integer id);}
13. 创建StudentServiceImpl 业务接口实现类
在16-springboot-ssm-dubbo-provider中
package com.md.springboot.service.impl;import com.alibaba.dubbo.config.annotation.Service;import com.md.springboot.mapper.StudentMapper;import com.md.springboot.model.Student;import com.md.springboot.service.StudentService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;/** * @author MD * @create 2020-08-22 9:37 */@Component// 暴露接口@Service(interfaceClass = StudentService.class,version = "1.0.0",timeout = 15000)public class StudentServiceImpl implements StudentService { // 逆向工程自动生成的StudentMapper @Autowired private StudentMapper studentMapper; @Override public Student queryStudentById(Integer id) { return studentMapper.selectByPrimaryKey(id); }}
14. StudentController 控制层
在17-springboot-ssm-dubbo-consumer中
package com.md.springboot.web;import com.alibaba.dubbo.config.annotation.Reference;import com.md.springboot.model.Student;import com.md.springboot.service.StudentService;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @author MD * @create 2020-08-22 9:43 */@RestControllerpublic class StudentController {// 使用暴露的接口 @Reference(interfaceClass = StudentService.class,version = "1.0.0",check = false) private StudentService studentService; @RequestMapping(value = "/student") public Object queryStudent(Integer id){ Student student = studentService.queryStudentById(id); return student; } @RequestMapping(value = "/student/detail/{id}") public Object queryStudent1(@PathVariable("id") Integer id){ Student student = studentService.queryStudentById(id); return "RESTful:"+student; }}
15. 启动测试
- 开启zookeeper
- 开启提供者Tomcat
- 开启消费者Tomcat