springboot+dubbo+myBatis实现微服务集成
- 作者: 五速梦信息网
- 时间: 2026年04月04日 13:27
springboot+dubbo+myBatis实现微服务集成
- 微服务架构成了当下的技术热点,实现微服务是要付出很大成本的,但也许是因为微服务的优点太过于吸引人,以至于大部分开发者都将它当成未来的发展趋势。
微服务架构的演进过程
- dubbo的用户手册中介绍了服务化架构的进化过程,如下图:
微服务的技术关注点
- 要实现一个微服务的架构,我们需要关注的技术点包括:服务注册、发现、负载均衡和健康检查,前端路由(网关),容错,服务框架的选择,动态配置管理等模块。这些模块可以组成一个简化的微服务架构图如下:
使用dubbo+zookeeper实现简化的微服务架构
- 使用zookeeper作为dubbo的注册中心,部署起来并不麻烦。为了保持注册中心的高可用性,在生产环境下我们需要配置多个zookeeper协同运行。在集群模式下,zookeeper会基于Paxos算法从集群中选择一台作为leader,其他机器作为follower,注册中心的数据都以leader为准。一台zk机器成为leader的条件是超过这台机器是可用的,且被超过半数的机器选举为leader。基于这种实现方式,我们选择zk集群的数量时最好为奇数个,最少为3个,这样只要有超过半数的zk机器存活那注册中心就是可用的。
注:如果我们选择2台机器作为zk的集群,那只要有一台zk挂掉,另一台机器就无法得到超过半数的选票,那么这个zk集群就直接失效了。因此选2台机器作为zk集群的稳定性在理论上不如一台机器作为注册中心的稳定性。
-
以3台机器作为zk集群为例,每台zk的具体部署方式为:
- 1、下载安装包并解压到安装目录,zookeeper安装包的下载地址为:http://www.apache.org/dist/zookeeper/
- 2、进入解压目录的conf文件夹,配置zookeeper启动的基本参数。
在conf文件夹下有一个 zoo_sample.cfg的文件,是zk启动的配置样例,zookeeper进程在启动的时候会找zoo.cfg文件作为默认的配置文件,所以我们复制一个名称为zoo.cfg的文件,并编辑其中的配置信息如下:
运行zookeeper进程,在zookeeper目录下的bin文件夹中,运行
./zkServer.sh start
ps: 停止方法——运行 ./zkServer.sh stop<br/>
- 第二步:开发前端服务和后端通用服务,maven模块结构,如图:
springboot-dubbo-parent的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br/>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-dubbo-parent</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
<packaging>pom</packaging>
<name>springboot-dubbo-parent</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-parent</artifactId><br/>
<version>1.5.9.RELEASE</version><br/>
<relativePath/> <!-- lookup parent from repository --><br/>
</parent>
<modules>
<module>springboot-dubbo-server</module><br/>
<module>springboot-dubbo-client</module><br/>
</modules><br/>
<properties><br/>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><br/>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><br/>
<java.version>1.8</java.version>
<!– 在properties中统一控制依赖包的版本,更清晰–>
<dubbo.version>2.5.3</dubbo.version><br/>
<zk.version>3.4.5</zk.version><br/>
<zkclient.version>0.1</zkclient.version><br/>
</properties>
<dependencyManagement> <!–dependencyManagement用于管理依赖版本号–>
<dependencies><br/>
<!--删除spring-boot-starter和spring-boot-starter-test,--><br/>
<!--因为parent中继承的祖先中已经有了,并且一般dependencyManagement管理的依赖都要写版本号--><br/>
<!--<dependency><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter</artifactId><br/>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-test</artifactId><br/>
<scope>test</scope><br/>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-web</artifactId><br/>
<version>1.5.9.RELEASE</version><br/>
</dependency>
<!–新增后续dubbo项目中所需依赖,dubbo、zk–>
<dependency><br/>
<groupId>com.alibaba</groupId><br/>
<artifactId>dubbo</artifactId><br/>
<version>${dubbo.version}</version><!--使用properties中配置的版本号--><br/>
<exclusions><br/>
<exclusion><br/>
<groupId>org.springframework</groupId><br/>
<artifactId>spring</artifactId><br/>
</exclusion><br/>
</exclusions><br/>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId><br/>
<artifactId>zookeeper</artifactId><br/>
<version>${zk.version}</version><br/>
<exclusions><br/>
<exclusion><br/>
<groupId>org.slf4j</groupId><br/>
<artifactId>slf4j-log4j12</artifactId><br/>
</exclusion><br/>
<exclusion><br/>
<groupId>log4j</groupId><br/>
<artifactId>log4j</artifactId><br/>
</exclusion><br/>
</exclusions><br/>
</dependency><br/>
<dependency><br/>
<groupId>com.github.sgroschupf</groupId><br/>
<artifactId>zkclient</artifactId><br/>
<version>${zkclient.version}</version><br/>
</dependency><br/>
</dependencies><br/>
</dependencyManagement>
<build>
<plugins><br/>
<plugin><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-maven-plugin</artifactId><br/>
</plugin><br/>
</plugins><br/>
</build><br/>
</project>
springboot-dubbo-server的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br/>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-dubbo-server</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
<packaging>pom</packaging>
<name>springboot-dubbo-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId><br/>
<artifactId>springboot-dubbo-parent</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</parent><br/>
<modules><br/>
<module>springboot-dubbo-api</module><br/>
<module>springboot-dubbo-provider</module><br/>
</modules><br/>
</project>
springboot-dubbo-provider的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br/>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.demo.provider</groupId>
<artifactId>apringboot-dubbo-provider</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
<packaging>jar</packaging>
<name>apringboot-dubbo-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId><br/>
<artifactId>springboot-dubbo-server</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</parent>
<properties>
</properties>
<dependencies>
<dependency><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter</artifactId><br/>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-test</artifactId><br/>
<scope>test</scope><br/>
</dependency>
<!–新增后续dubbo项目中所需依赖,dubbo、zk。
父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不需要再写版本号,exclusion也不需要--><br/>
<dependency><br/>
<groupId>com.alibaba</groupId><br/>
<artifactId>dubbo</artifactId><br/>
</dependency><br/>
<dependency><br/>
<groupId>org.apache.zookeeper</groupId><br/>
<artifactId>zookeeper</artifactId><br/>
</dependency><br/>
<dependency><br/>
<groupId>com.github.sgroschupf</groupId><br/>
<artifactId>zkclient</artifactId><br/>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId><br/>
<artifactId>mybatis-spring-boot-starter</artifactId><br/>
<version>1.3.1</version><br/>
</dependency><br/>
<dependency><br/>
<groupId>mysql</groupId><br/>
<artifactId>mysql-connector-java</artifactId><br/>
<scope>runtime</scope><br/>
</dependency><br/>
<dependency><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-jdbc</artifactId><br/>
</dependency>
<dependency>
<groupId>com.example.admo.api</groupId><br/>
<artifactId>springboot-dubbo-api</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</dependency><br/>
</dependencies>
<build>
<plugins><br/>
<plugin><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-maven-plugin</artifactId><br/>
</plugin><br/>
</plugins><br/>
</build>
</project>
dubbo配置文件provider.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"<br/>
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"<br/>
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo<br/>
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!– 提供方应用信息,用于计算依赖关系 –>
<dubbo:application name="demo-provider" />
<!– 使用zookeeper注册中心暴露服务地址 –>
<dubbo:registry protocol="zookeeper" address="localhost:2181" timeout="60000"/>
<!– 用dubbo协议在20880端口暴露服务 –>
<dubbo:protocol name="dubbo" port="20880" />
<!– 暴露dubbo服务的方式一–>
<!-- 使用注解方式暴露接口,会自动扫描package下所有包中dubbo相关的注解,这样就不用在xml中再针对每个服务接口配置dubbo:service interface--><br/>
<!--<dubbo:annotation package="com.example.demo.api.service"/>-->
<!–另外一种是全局新修改的办法(timeout时间可以自己调整)–>
<dubbo:provider delay="-1" timeout="12000" retries="0"/>
<!– 暴露dubbo服务的方式二 –>
<!-- 使用xml配置方式申明暴露一个接口服务,在程序启动的时候会自动注册到zookeeper。<br/>
等同于在类上打@service注解,打了注解就必须要用annotation指定启动扫描路径,使用这种方式,就不需要指定annotation了--><br/>
<dubbo:service interface="com.example.demo.api.service.UserService" ref="userService"/><br/>
<!-- 具体的实现bean,id与上面的ref要一致--><br/>
<bean id="userService" class="com.example.demo.provider.api.impl.UserServiceImpl"/>
</beans>
mysql数据库配置文件application.properties:
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-active=10
spring.datasource.max-idle=5
spring.datasource.min-idle=0
服务层接口实现类 UserServiceImpl.java文件:
dao层接口Usermapper.java文件:
myBatis的XML文件:
<?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=“com.example.demo.provider.dao.UserMapper” >
<select id=“findOneById” resultType=“com.example.demo.api.model.User”>
select id,user_name from user<br/>
</select>
</mapper>
启动类ApringbootDubboProviderApplication.java文件:
springboot-dubbo-api的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br/>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.admo.api</groupId>
<artifactId>springboot-dubbo-api</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
<packaging>jar</packaging>
<name>springboot-dubbo-api</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId><br/>
<artifactId>springboot-dubbo-server</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><br/>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><br/>
<java.version>1.8</java.version><br/>
</properties>
<dependencies>
<dependency><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter</artifactId><br/>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-test</artifactId><br/>
<scope>test</scope><br/>
</dependency>
</dependencies>
<build>
<plugins><br/>
<plugin><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-maven-plugin</artifactId><br/>
</plugin><br/>
</plugins><br/>
</build>
</project>
api服务接口UserService.java文件:
实体类User.java文件:
springboot-dubbo-client的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><br/>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springboot-dubbo-client</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
<packaging>jar</packaging>
<name>springboot-dubbo-client</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.example</groupId><br/>
<artifactId>springboot-dubbo-parent</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</parent>
<properties>
</properties>
<dependencies>
<dependency><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter</artifactId><br/>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-test</artifactId><br/>
<scope>test</scope><br/>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-starter-web</artifactId><br/>
</dependency>
<!–新增后续dubbo项目中所需依赖,dubbo、zk。
父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不需要再写版本号,exclusion也不需要--><br/>
<dependency><br/>
<groupId>com.alibaba</groupId><br/>
<artifactId>dubbo</artifactId><br/>
</dependency><br/>
<dependency><br/>
<groupId>org.apache.zookeeper</groupId><br/>
<artifactId>zookeeper</artifactId><br/>
</dependency><br/>
<dependency><br/>
<groupId>com.github.sgroschupf</groupId><br/>
<artifactId>zkclient</artifactId><br/>
</dependency>
<dependency>
<groupId>com.example.admo.api</groupId><br/>
<artifactId>springboot-dubbo-api</artifactId><br/>
<version>0.0.1-SNAPSHOT</version><br/>
</dependency>
</dependencies>
<build>
<plugins><br/>
<plugin><br/>
<groupId>org.springframework.boot</groupId><br/>
<artifactId>spring-boot-maven-plugin</artifactId><br/>
</plugin><br/>
</plugins><br/>
</build>
</project>
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"<br/>
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"<br/>
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo<br/>
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!–消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 –>
<dubbo:application name="demo-consumer"/>
<!–zookeeper注册中心 –>
<dubbo:registry protocol="zookeeper" address="localhost:2181" timeout="60000"/>
<!–关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。–>
<dubbo:consumer check="false" />
<!– 使用注解方式创建远程服务代理–>
<dubbo:annotation package="com.example.demo.controller"/>
<!– 使用xml配置方式创建远程服务代理,id即为provider.xml中暴露的服务的id–>
<!-- 等同于dubbo:annotation 加上代码里的@Reference注解--><br/>
<!--<dubbo:reference id="userService" interface="com.example.demo.api.service.UserService"/>--><br/>
</beans>
UserController.java文件:
启动类 SpringbootDubboClientApplication.java文件:
启动成功,如图:
浏览器访问,如图:
注意(远程调用失败问题):
Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method subscribe in the service com.alibab
a.dubbo.registry.RegistryService. Tried 3 times of the providers172.168.1.167:2181 from the registry
172.168.1.167:2181 on the consumer 169.254.249.102 using the dubbo version2.4.9. Last error is: Invoke remote
method timeout.
解决方法一:
这个是由于dubbo接口中的的传输对象没有被序列化而导致的,只需要要检查dubbo接口中参数中的实体类实现序列化(implementsSerializable)就可以解决这一个异常.
解决方法二:
解决这个问题这个只需要重新暴露服务,在Zk上注册服务提供者信息即可。具体就是要排查服务提供者可能出现的问题,解决后部署并重启服务提供者即可。
解决方法三:
1.基本就是dubbo provider没有启动会造成这种情况。
2.api和service是同一个项目,并不是俩项目。
通过启动api,run on server是不能启动service的,必须通过config/startConfig.java,debug as java application启动。
3.启动思路总结:
1.api通过run on server启动
2.service通过startConfig.java启动。debug as java application
dubbo中文文档:http://dubbo.io/
zookeeper文档:http://zookeeper.apache.org/
相关文章
-
SpringBoot+SpringSecurity之多模块用户认证授权同步
SpringBoot+SpringSecurity之多模块用户认证授权同步
- 互联网
- 2026年04月04日
-
springboot+websocket+sockjs进行消息推送【基于STOMP协议】
springboot+websocket+sockjs进行消息推送【基于STOMP协议】
- 互联网
- 2026年04月04日
-
springboot2.2.2企业级项目整合redis与redis 工具类大全
springboot2.2.2企业级项目整合redis与redis 工具类大全
- 互联网
- 2026年04月04日
-
springboot 前后端分离开发 从零到整(四、更改密码操作)
springboot 前后端分离开发 从零到整(四、更改密码操作)
- 互联网
- 2026年04月04日
-
springboot 前端怎么部署
springboot 前端怎么部署
- 互联网
- 2026年04月04日
-
springboot 多数据库 连接池 资源消耗
springboot 多数据库 连接池 资源消耗
- 互联网
- 2026年04月04日






