之前也找了很多关于springboot整合dubbo的案例,但是总是会有一些问题,总的来说这个是相对比较完整的,这个我是根据每层来分的,而不是根据功能模块,适合基础学习,废话不多说先看整体架构
这里使用的idea工具创建普通的maven项目,这一步需要注意的是什么模板都不用选直接next
对于创建好的项目第一步当然就是它的pom文件的配置,这里需要注意的是modules标签里面需要放你创建的模块的名称,其他我都写有注释,可以自行了解
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zk</groupId>
<artifactId>boot_dubbo_restmanage</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo_api</module>
<module>dubbo_provider</module>
<module>dubbo_consumer</module>
</modules>
<!--springboot-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--声明版本号-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkClient.version>0.10</zkClient.version>
<lombok.version>1.16.18</lombok.version>
<springBoot.version>1.5.7</springBoot.version>
</properties>
<dependencies>
<!--springboot的主要依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!--<version>${springBoot.version}</version>-->
</dependency>
<!-- web应用 springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>-->
<!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<!-- Dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkClient.version}</version>
</dependency>
<!-- 热加载 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
这个模块的创建也可以使用普通项目,和上面一样直接创建maven项目,不用选择任何模板,这个模块主要是存放接口和实体类的
创建好之后我们第一步肯定还是要配置pom文件了,这里的pom文件没有什么特别需要注意的,唯一的能说一句的地方就是packaging标签声明的jar,标志着打包上传的时候会打成jar包,因为只有实体类和接口所以也没有什么需要添加的依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>org.zk</groupId>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>dubbo_api</artifactId>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接着就是我们的实体类和接口的创建,先展示一下创建出来的目录结构,为了便于测试和学习只有一个接口和一个实体类。因为之前解决问题的时候看了好多文章上面都没有目录结构的展示,导致我踩了很多坑,所以先长个记性
再看一下实体类接口中的内容
实体类(get,set方法我就不写了)
package org.zk.entity;
import java.io.Serializable;
/**
*
* 人员表
*
*
* @author Alicelonely
* @since 2019-12-01
*/
public class User implements Serializable {
private Integer uid;
private String uname;
private String upwd;
/**
* 0普通1管理员
*/
private Integer flag;
/**被省略的get,set方法**/
}
UserService接口
package org.zk.service;
import org.zk.entity.User;
import java.util.List;
public interface UserService {
List<User> getAllUser();
}
到这里第一个api模块已经建立完毕
在这里创建项目就和上面不一样了需要特别注意,因为是springboot整合dubbo所以这里我们需要创建的是springboot的项目
这一步我建议和之前的目录结构一样
这一步是选择需要的依赖,可以根据自己的需求选也可以不选,自己手动添加,不过自己手动添加的依赖可能会有依赖相互冲突的问题,这里又一个坑
创建完毕之后第一件事仍然是pom文件的配置
这里有个地方需要特别注意就是在依赖中添加了所依赖的公共接口,也就是依赖中的artifactId标签的名字要和我们dubbo_api模块pom文件当中的artifactId内容相同,否则就会出现实现不了公共接口
<?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.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.zk</groupId>
<artifactId>dubbo_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkClient.version>0.10</zkClient.version>
</properties>
<dependencies>
<!-- 依赖公共接口 -->
<dependency>
<groupId>org.zk</groupId>
<artifactId>dubbo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--spring-boot-starter 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkClient.version}</version>
</dependency>
<!--mybaties-spring-boot-starter-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
先看下大致的目录结构
这一层需要用到依赖比较多,因为这一层包含dao层和service层,需要查询数据库还需要实现公共接口
首先需要配置,springboot中已经很少使用xml文件,所以这里我用yml这种潇洒的风格配置
当然在这里也有一个坑,就是password,这里我把密码加上了引号,yml文件的格式虽然潇洒,但是规则很严谨,如果说你的密码很长,建议还是加上引号,否则访问的时候生产者就会报以下异常消费者会报以下异常
server:
port: 8082
servlet:
context-path: /
spring:
datasource:
name: test
url: jdbc:mysql://127.0.0.1:3306/restaurant
username: root
password: "000000"
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
#Mybatis配置
mybatis:
typeAliasesPackage: org.zk.entity
mapperLocations: classpath:mapper/*.xml
#打印Mybatis的sql语句
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
然后我们在resources创建dubbo的xml配置文件,如果此时报红那就说明路径有问题或者pom文件有问题,更具体点的话就是生产者的pom文件有问题,不要问为什么
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--应用名-->
<dubbo:application name="dubbo_provider"/>
<!--注册到zk-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--扫描dubbo的生产者的service-->
<dubbo:annotation package="org.zk.dubbo_provider.service"/>
<!--使用dubbo协议的20880端口-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明实现类-->
<bean id="userService" class="org.zk.dubbo_provider.service.impl.UserServiceImpl"/>
<!--将实现类和接口关联-->
<dubbo:service interface="org.zk.service.UserService" ref="userService"/>
</beans>
接下来就是mapper,为了便于学习,只演示单表查询,查全部,这个xml文件是我用mybatis-plus自动生成的文件,之后我会再发关于mybatis-plus自动生成代码的文章
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zk.dubbo_provider.dao.UserMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="org.zk.entity.User">
<id column="uid" property="uid" />
<result column="uname" property="uname" />
<result column="upwd" property="upwd" />
<result column="flag" property="flag" />
</resultMap>
<!--查询所有-->
<select id="getAllUser" resultMap="BaseResultMap">
select * from user
</select>
</mapper>
紧接着就是dao层的创建
package org.zk.dubbo_provider.dao;
import org.zk.entity.User;
import java.util.List;
public interface UserMapper {
List<User> getAllUser();
}
然后是实现公共接口,这里要注意@Service注解可是dubbo的注解,当然你也可以在dubbo的配置文件中加
package org.zk.dubbo_provider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import org.zk.dubbo_provider.dao.UserMapper;
import org.zk.entity.User;
import org.zk.service.UserService;
import javax.annotation.Resource;
import java.util.List;
@Service(timeout = 10000)
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public List<User> getAllUser() {
return userMapper.getAllUser();
}
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
}
别激动还有一步需要做,没错就是springboot的启动类,注释我就不解释了,光看就能看明白了
package org.zk.dubbo_provider;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@ImportResource("classpath:dubbo_provider.xml")
@MapperScan("org.zk.dubbo_provider.dao")
public class DubboProviderApplication {
public static void main(String[] args) {
System.out.println("生产者已经启动");
SpringApplication.run(DubboProviderApplication.class, args);
}
}
至此生产者创建完成
这一步创建和生产者一样都是创建springboot项目,在这里我就不啰嗦了,直接看pom文件,这里也需要引入公共依赖接口
<?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.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.zk</groupId>
<artifactId>dubbo_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo_consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkClient.version>0.10</zkClient.version>
</properties>
<dependencies>
<!-- 依赖公共接口 -->
<dependency>
<groupId>org.zk</groupId>
<artifactId>dubbo_api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--spring mvc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkClient.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--spring boot的启动插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
再看一下消费者的目录结构
server:
port: 8081
servlet:
context-path: /
然后就是dubbo_consumer.xml文件的配置,这里唯一同上面不同的我也加上了注释
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo_consumer"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<!--声明需要的服务接口 -->
<dubbo:reference id="userService" interface="org.zk.service.UserService" check="false"/>
<!--使用注解的方式暴露接口-->
<dubbo:annotation package="org.zk"/>
</beans>
然后是conroller层
package org.zk.dubbo_consumer.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.zk.entity.User;
import org.zk.service.UserService;
import javax.annotation.Resource;
import java.util.List;
@RestController
public class UserController {
@Resource
private UserService userService;
@RequestMapping("/getAllUser")
public List<User> getAllUsers() {
return userService.getAllUser();
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
最后就是在启动类中加上@ImportResource(“classpath:dubbo_consumer.xml”)注解就可以了,然后先启动zookeeper,当然每个人的目录都不同,然后在idea当中先启动生产者,再启动消费者
启动之后我们再启动tomcat,因为我们需要访问注册中心,看是否注册,当然启动之前你需要把
放在tomcat的workapps下面
dubbo-admin-2.5.10.war
链接: https://pan.baidu.com/s/1v6IYVvDITqgs_nns2PcdPQ
提取码:un81
如果tomcat启动成功没有报错就可以直接访问http://localhost:8080/dubbo-admin-2.5.10/
会有弹窗提示输入账号密码,一般情况账号:root,密码:root。输入之后这里就会显示注册的具体情况
最后我们再访问一下我们控制层的看能不能拿到数据,这里注意我们直接访问8081端口,因为消费者这层设置的端口是8081.http://localhost:8081/getAllUser
这里sql也打印出来了
源码地址:https://gitee.com/lituoqu/springboot_dubbo_mybatis