springboot+dubbo+myBatis实现微服务集成

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文件:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;project xmlns=“http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#34;

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.example&lt;/groupId&gt;

&lt;artifactId&gt;springboot-dubbo-parent&lt;/artifactId&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;packaging&gt;pom&lt;/packaging&gt;

&lt;name&gt;springboot-dubbo-parent&lt;/name&gt;

&lt;description&gt;Demo project for Spring Boot&lt;/description&gt;

&lt;parent&gt;

    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;<br/>
    &lt;version&gt;1.5.9.RELEASE&lt;/version&gt;<br/>
    &lt;relativePath/&gt; &lt;!-- lookup parent from repository --&gt;<br/>
&lt;/parent&gt;

&lt;modules&gt;

    &lt;module&gt;springboot-dubbo-server&lt;/module&gt;<br/>
    &lt;module&gt;springboot-dubbo-client&lt;/module&gt;<br/>
&lt;/modules&gt;<br/>
&lt;properties&gt;<br/>
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;<br/>
    &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;<br/>
    &lt;java.version&gt;1.8&lt;/java.version&gt;

&lt;!– 在properties中统一控制依赖包的版本,更清晰–&gt;

    &lt;dubbo.version&gt;2.5.3&lt;/dubbo.version&gt;<br/>
    &lt;zk.version&gt;3.4.5&lt;/zk.version&gt;<br/>
    &lt;zkclient.version&gt;0.1&lt;/zkclient.version&gt;<br/>
&lt;/properties&gt;

&lt;dependencyManagement&gt; &lt;!–dependencyManagement用于管理依赖版本号–&gt;

    &lt;dependencies&gt;<br/>
        &lt;!--删除spring-boot-starter和spring-boot-starter-test,--&gt;<br/>
        &lt;!--因为parent中继承的祖先中已经有了,并且一般dependencyManagement管理的依赖都要写版本号--&gt;<br/>
        &lt;!--&lt;dependency&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;<br/>
        &lt;/dependency&gt;

&lt;dependency&gt;

            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;<br/>
            &lt;scope&gt;test&lt;/scope&gt;<br/>
        &lt;/dependency&gt;--&gt;

&lt;dependency&gt;

            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;<br/>
            &lt;version&gt;1.5.9.RELEASE&lt;/version&gt;<br/>
        &lt;/dependency&gt;

&lt;!–新增后续dubbo项目中所需依赖,dubbo、zk–&gt;

        &lt;dependency&gt;<br/>
            &lt;groupId&gt;com.alibaba&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;dubbo&lt;/artifactId&gt;<br/>
            &lt;version&gt;${dubbo.version}&lt;/version&gt;&lt;!--使用properties中配置的版本号--&gt;<br/>
            &lt;exclusions&gt;<br/>
                &lt;exclusion&gt;<br/>
                    &lt;groupId&gt;org.springframework&lt;/groupId&gt;<br/>
                    &lt;artifactId&gt;spring&lt;/artifactId&gt;<br/>
                &lt;/exclusion&gt;<br/>
            &lt;/exclusions&gt;<br/>
        &lt;/dependency&gt;

&lt;dependency&gt;

            &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;zookeeper&lt;/artifactId&gt;<br/>
            &lt;version&gt;${zk.version}&lt;/version&gt;<br/>
            &lt;exclusions&gt;<br/>
                &lt;exclusion&gt;<br/>
                    &lt;groupId&gt;org.slf4j&lt;/groupId&gt;<br/>
                    &lt;artifactId&gt;slf4j-log4j12&lt;/artifactId&gt;<br/>
                &lt;/exclusion&gt;<br/>
                &lt;exclusion&gt;<br/>
                    &lt;groupId&gt;log4j&lt;/groupId&gt;<br/>
                    &lt;artifactId&gt;log4j&lt;/artifactId&gt;<br/>
                &lt;/exclusion&gt;<br/>
            &lt;/exclusions&gt;<br/>
        &lt;/dependency&gt;<br/>
        &lt;dependency&gt;<br/>
            &lt;groupId&gt;com.github.sgroschupf&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;zkclient&lt;/artifactId&gt;<br/>
            &lt;version&gt;${zkclient.version}&lt;/version&gt;<br/>
        &lt;/dependency&gt;<br/>
    &lt;/dependencies&gt;<br/>
&lt;/dependencyManagement&gt;

&lt;build&gt;

    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;<br/>

&lt;/project&gt;

springboot-dubbo-server的pom.xml文件:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;project xmlns=“http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#34;

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.example&lt;/groupId&gt;

&lt;artifactId&gt;springboot-dubbo-server&lt;/artifactId&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;packaging&gt;pom&lt;/packaging&gt;

&lt;name&gt;springboot-dubbo-server&lt;/name&gt;

&lt;description&gt;Demo project for Spring Boot&lt;/description&gt;

&lt;parent&gt;

    &lt;groupId&gt;com.example&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;springboot-dubbo-parent&lt;/artifactId&gt;<br/>
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;/parent&gt;<br/>
&lt;modules&gt;<br/>
    &lt;module&gt;springboot-dubbo-api&lt;/module&gt;<br/>
    &lt;module&gt;springboot-dubbo-provider&lt;/module&gt;<br/>
&lt;/modules&gt;<br/>

&lt;/project&gt;

springboot-dubbo-provider的pom.xml文件:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;project xmlns=“http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#34;

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.example.demo.provider&lt;/groupId&gt;

&lt;artifactId&gt;apringboot-dubbo-provider&lt;/artifactId&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;packaging&gt;jar&lt;/packaging&gt;

&lt;name&gt;apringboot-dubbo-provider&lt;/name&gt;

&lt;description&gt;Demo project for Spring Boot&lt;/description&gt;

&lt;parent&gt;

    &lt;groupId&gt;com.example&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;springboot-dubbo-server&lt;/artifactId&gt;<br/>
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;/parent&gt;

&lt;properties&gt;

&lt;/properties&gt;

&lt;dependencies&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;<br/>
        &lt;scope&gt;test&lt;/scope&gt;<br/>
    &lt;/dependency&gt;

&lt;!–新增后续dubbo项目中所需依赖,dubbo、zk。

       父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不需要再写版本号,exclusion也不需要--&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;com.alibaba&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;dubbo&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;zookeeper&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;com.github.sgroschupf&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;zkclient&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;org.mybatis.spring.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mybatis-spring-boot-starter&lt;/artifactId&gt;<br/>
        &lt;version&gt;1.3.1&lt;/version&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;mysql&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;<br/>
        &lt;scope&gt;runtime&lt;/scope&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-jdbc&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;com.example.admo.api&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;springboot-dubbo-api&lt;/artifactId&gt;<br/>
        &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
    &lt;/dependency&gt;<br/>
&lt;/dependencies&gt;

&lt;build&gt;

    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;

&lt;/project&gt;

dubbo配置文件provider.xml:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;beans xmlns=“http://www.springframework.org/schema/beans&#34;

   xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;<br/>
   xmlns:dubbo=&#34;http://code.alibabatech.com/schema/dubbo&#34;<br/>
   xsi:schemaLocation=&#34;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&#34;&gt; &lt;!– 提供方应用信息,用于计算依赖关系 –&gt;

&lt;dubbo:application name=&#34;demo-provider&#34; /&gt;

&lt;!– 使用zookeeper注册中心暴露服务地址 –&gt;

&lt;dubbo:registry protocol=&#34;zookeeper&#34; address=&#34;localhost:2181&#34; timeout=&#34;60000&#34;/&gt;

&lt;!– 用dubbo协议在20880端口暴露服务 –&gt;

&lt;dubbo:protocol name=&#34;dubbo&#34; port=&#34;20880&#34; /&gt;

&lt;!– 暴露dubbo服务的方式一–&gt;

&lt;!-- 使用注解方式暴露接口,会自动扫描package下所有包中dubbo相关的注解,这样就不用在xml中再针对每个服务接口配置dubbo:service interface--&gt;<br/>
&lt;!--&lt;dubbo:annotation package=&#34;com.example.demo.api.service&#34;/&gt;--&gt;

&lt;!–另外一种是全局新修改的办法(timeout时间可以自己调整)–&gt;

&lt;dubbo:provider delay=&#34;-1&#34; timeout=&#34;12000&#34; retries=&#34;0&#34;/&gt;

&lt;!– 暴露dubbo服务的方式二 –&gt;

&lt;!-- 使用xml配置方式申明暴露一个接口服务,在程序启动的时候会自动注册到zookeeper。<br/>
     等同于在类上打@service注解,打了注解就必须要用annotation指定启动扫描路径,使用这种方式,就不需要指定annotation了--&gt;<br/>
&lt;dubbo:service interface=&#34;com.example.demo.api.service.UserService&#34; ref=&#34;userService&#34;/&gt;<br/>
&lt;!-- 具体的实现bean,id与上面的ref要一致--&gt;<br/>
&lt;bean id=&#34;userService&#34; class=&#34;com.example.demo.provider.api.impl.UserServiceImpl&#34;/&gt;

&lt;/beans&gt;

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文件:

&lt;?xml version=”1.0“ encoding=”UTF-8“ ?&gt;
&lt;!DOCTYPE mapper PUBLIC ”-//mybatis.org//DTD Mapper 3.0//EN“ ”http://mybatis.org/dtd/mybatis-3-mapper.dtd&#34; &gt; &lt;mapper namespace=“com.example.demo.provider.dao.UserMapper” &gt; &lt;select id=“findOneById” resultType=“com.example.demo.api.model.User”&gt;

    select id,user_name from user<br/>
&lt;/select&gt;

&lt;/mapper&gt;

启动类ApringbootDubboProviderApplication.java文件:

springboot-dubbo-api的pom.xml文件:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;project xmlns=“http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#34;

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.example.admo.api&lt;/groupId&gt;

&lt;artifactId&gt;springboot-dubbo-api&lt;/artifactId&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;packaging&gt;jar&lt;/packaging&gt;

&lt;name&gt;springboot-dubbo-api&lt;/name&gt;

&lt;description&gt;Demo project for Spring Boot&lt;/description&gt;

&lt;parent&gt;

    &lt;groupId&gt;com.example&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;springboot-dubbo-server&lt;/artifactId&gt;<br/>
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;/parent&gt;

&lt;properties&gt;

    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;<br/>
    &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;<br/>
    &lt;java.version&gt;1.8&lt;/java.version&gt;<br/>
&lt;/properties&gt;

&lt;dependencies&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;<br/>
        &lt;scope&gt;test&lt;/scope&gt;<br/>
    &lt;/dependency&gt;

&lt;/dependencies&gt; &lt;build&gt;

    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;

&lt;/project&gt;

api服务接口UserService.java文件:

实体类User.java文件:

springboot-dubbo-client的pom.xml文件:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;project xmlns=“http://maven.apache.org/POM/4.0.0&#34; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#34;

xsi:schemaLocation=&#34;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&#34;&gt;<br/>
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;groupId&gt;com.example&lt;/groupId&gt;

&lt;artifactId&gt;springboot-dubbo-client&lt;/artifactId&gt;<br/>
&lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;packaging&gt;jar&lt;/packaging&gt;

&lt;name&gt;springboot-dubbo-client&lt;/name&gt;

&lt;description&gt;Demo project for Spring Boot&lt;/description&gt;

&lt;parent&gt;

    &lt;groupId&gt;com.example&lt;/groupId&gt;<br/>
    &lt;artifactId&gt;springboot-dubbo-parent&lt;/artifactId&gt;<br/>
    &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
&lt;/parent&gt;

&lt;properties&gt;

&lt;/properties&gt;

&lt;dependencies&gt;

    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;<br/>
        &lt;scope&gt;test&lt;/scope&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;!–新增后续dubbo项目中所需依赖,dubbo、zk。

       父模块pom中使用dependencyManagement来管理依赖版本号,子模块pom中不需要再写版本号,exclusion也不需要--&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;com.alibaba&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;dubbo&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;org.apache.zookeeper&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;zookeeper&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;<br/>
    &lt;dependency&gt;<br/>
        &lt;groupId&gt;com.github.sgroschupf&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;zkclient&lt;/artifactId&gt;<br/>
    &lt;/dependency&gt;

&lt;dependency&gt;

        &lt;groupId&gt;com.example.admo.api&lt;/groupId&gt;<br/>
        &lt;artifactId&gt;springboot-dubbo-api&lt;/artifactId&gt;<br/>
        &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt;<br/>
    &lt;/dependency&gt;

&lt;/dependencies&gt; &lt;build&gt;

    &lt;plugins&gt;<br/>
        &lt;plugin&gt;<br/>
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;<br/>
            &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;<br/>
        &lt;/plugin&gt;<br/>
    &lt;/plugins&gt;<br/>
&lt;/build&gt;

&lt;/project&gt;

dubbo配置文件consumer.xml:

&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;
&lt;beans xmlns=“http://www.springframework.org/schema/beans&#34;

   xmlns:xsi=&#34;http://www.w3.org/2001/XMLSchema-instance&#34;<br/>
   xmlns:dubbo=&#34;http://code.alibabatech.com/schema/dubbo&#34;<br/>
   xsi:schemaLocation=&#34;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&#34;&gt; &lt;!–消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 –&gt;

&lt;dubbo:application name=&#34;demo-consumer&#34;/&gt;

&lt;!–zookeeper注册中心 –&gt;

&lt;dubbo:registry  protocol=&#34;zookeeper&#34; address=&#34;localhost:2181&#34; timeout=&#34;60000&#34;/&gt;

&lt;!–关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。–&gt;

&lt;dubbo:consumer check=&#34;false&#34; /&gt;

&lt;!– 使用注解方式创建远程服务代理–&gt;

&lt;dubbo:annotation package=&#34;com.example.demo.controller&#34;/&gt;

&lt;!– 使用xml配置方式创建远程服务代理,id即为provider.xml中暴露的服务的id–&gt;

&lt;!-- 等同于dubbo:annotation 加上代码里的@Reference注解--&gt;<br/>
&lt;!--&lt;dubbo:reference id=&#34;userService&#34; interface=&#34;com.example.demo.api.service.UserService&#34;/&gt;--&gt;<br/>

&lt;/beans&gt;

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/