SpringBoot 整合Mybatis 和Dubbo分析

访客 阅读:239 2021-03-31 21:11:07 评论:0

最近编写了一部分SpringBoot的代码,想整理一个基于SpringBoot 的RPC 远程服务调用框架。

第一步:整合SpringBoot和Mybatis,具体参考:https://blog.csdn.net/zhouzhiwengang/article/details/81677256

第二步:整合SpringBoot 和Dubbo.

1、pom.xml 加载dubbo 依赖的jar 文件。

 <!-- Spring Boot Dubbo 依赖 --> 
        <dependency> 
            <groupId>org.apache.zookeeper</groupId> 
            <artifactId>zookeeper</artifactId> 
            <version>3.4.8</version> 
        </dependency> 
        <dependency> 
            <groupId>com.101tec</groupId> 
            <artifactId>zkclient</artifactId> 
            <version>0.7</version> 
        </dependency> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>dubbo</artifactId> 
            <version>2.8.4</version> 
            <exclusions> 
                <exclusion> 
                    <groupId>org.springframework</groupId> 
                    <artifactId>spring</artifactId> 
                </exclusion> 
            </exclusions> 
        </dependency>

2、框架的层次结构如下图所示:

各模块功能分区简单说明下:

api:定义service 接口和实体对象定义。

dao:定义mapper 接口和映射文件关系绑定。

service:service 接口实现,基于mapp接口和映射文件。

web:主要业务逻辑实现层。

3、实现远程接口接口声明和实现。

api层:

package com.zzg.api; 
 
import com.zzg.pojo.User; 
 
public interface UserService { 
    int deleteByPrimaryKey(Long id); 
 
    int insert(User record); 
 
    int insertSelective(User record); 
 
    User selectByPrimaryKey(Long id); 
 
    int updateByPrimaryKeySelective(User record); 
 
    int updateByPrimaryKey(User record); 
} 

service层:

/** 
 * Copyright (C), 2015-2018, 周氏集团有限公司 
 * FileName: UserServiceImpl 
 * Author:   Administrator 
 * Date:     2018/8/16 1:58 
 * Description: 用户Service 
 * History: 
 * <author>          <time>          <version>          <desc> 
 * 作者姓名           修改时间           版本号              描述 
 */ 
package com.zzg.service.impl; 
 
import com.zzg.api.UserService; 
import com.zzg.dao.UserMapper; 
import com.zzg.pojo.User; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 
 
import javax.annotation.Resource; 
 
/** 
 * 〈一句话功能简述〉<br>  
 * 〈用户Service〉 
 * 
 * @author Administrator 
 * @create 2018/8/16 
 * @since 1.0.0 
 */ 
@Service 
public class UserServiceImpl implements UserService { 
    @Resource 
    private UserMapper mapper; 
 
    @Override 
    public int deleteByPrimaryKey(Long id) { 
        return mapper.deleteByPrimaryKey(id); 
    } 
 
    @Override 
    public int insert(User record) { 
        return mapper.insert(record); 
    } 
 
    @Override 
    public int insertSelective(User record) { 
        return mapper.insertSelective(record); 
    } 
 
    @Override 
    public User selectByPrimaryKey(Long id) { 
        return mapper.selectByPrimaryKey(id); 
    } 
 
    @Override 
    public int updateByPrimaryKeySelective(User record) { 
        return 0; 
    } 
 
    @Override 
    public int updateByPrimaryKey(User record) { 
        return mapper.updateByPrimaryKey(record); 
    } 
} 

service 服务启动:扫描dao 和加载provider.xml文件

/** 
 * Copyright (C), 2015-2018, 周氏集团有限公司 
 * FileName: EmsServiceApplication 
 * Author:   Administrator 
 * Date:     2018/8/16 1:33 
 * Description: Ems 服务 
 * History: 
 * <author>          <time>          <version>          <desc> 
 * 作者姓名           修改时间           版本号              描述 
 */ 
package com.zzg.service; 
 
import org.mybatis.spring.annotation.MapperScan; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.ImportResource; 
 
/** 
 * 〈一句话功能简述〉<br>  
 * 〈Ems 服务〉 
 * 
 * @author Administrator 
 * @create 2018/8/16 
 * @since 1.0.0 
 */ 
@SpringBootApplication 
@MapperScan("com.zzg.dao") 
@ImportResource("classpath:provider.xml") 
public class EmsServiceApplication { 
    public static void main(String[] args) { 
        SpringApplication.run(EmsServiceApplication.class, args); 
        System.out.println("============= SpringBoot Ems Service Start Success ============="); 
    } 
} 
<?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="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--> 
    <!--<dubbo:annotation package="com.zzg.api"/>--> 
 
    <!-- 暴露dubbo服务的方式二 --> 
    <!-- 使用xml配置方式申明暴露一个接口服务,在程序启动的时候会自动注册到zookeeper。 
         等同于在类上打@service注解,打了注解就必须要用annotation指定启动扫描路径,使用这种方式,就不需要指定annotation了--> 
    <!--<dubbo:service interface="com.example.demo.api.service.UserService" ref="userService"/>--> 
    <!-- 具体的实现bean,id与上面的ref要一致--> 
    <!--<bean id="userService" class="com.example.demo.provider.api.impl.UserServiceImpl"/>--> 
    <!-- 用户服务接口 --> 
    <dubbo:service interface="com.zzg.api.UserService" ref="userService" /> 
 
    <bean id="userService" class="com.zzg.service.impl.UserServiceImpl"/> 
</beans>

web:主要设计业务代码和远程方法调用。

/** 
 * Copyright (C), 2015-2018, 周氏集团有限公司 
 * FileName: UserController 
 * Author:   Administrator 
 * Date:     2018/8/16 2:31 
 * Description: 用户控制层 
 * History: 
 * <author>          <time>          <version>          <desc> 
 * 作者姓名           修改时间           版本号              描述 
 */ 
package com.zzg.controller; 
 
import com.alibaba.dubbo.config.annotation.Reference; 
import com.zzg.api.UserService; 
import com.zzg.pojo.User; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.*; 
 
/** 
 * 〈一句话功能简述〉<br>  
 * 〈用户控制层〉 
 * 
 * @author Administrator 
 * @create 2018/8/16 
 * @since 1.0.0 
 */ 
@Controller 
@RequestMapping(value = "/api/user") 
public class UserController { 
    @Autowired 
    private UserService service; 
 
    @RequestMapping(value = "/add", method = RequestMethod.POST) 
    @ResponseBody 
    public int addUser(@RequestBody User user){ 
        return service.insert(user); 
    } 
 
    @RequestMapping(value = "/findById", method = RequestMethod.GET) 
    @ResponseBody 
    public User findById(@RequestParam Long id){ 
        return service.selectByPrimaryKey(id); 
    } 
} 

web服务启动:调用远程方法(Consumer.xml)

/** 
 * Copyright (C), 2015-2018, 周氏集团有限公司 
 * FileName: EmsWebApplication 
 * Author:   Administrator 
 * Date:     2018/8/16 2:35 
 * Description: Ems web控制层 
 * History: 
 * <author>          <time>          <version>          <desc> 
 * 作者姓名           修改时间           版本号              描述 
 */ 
package com.zzg; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 
import org.springframework.context.annotation.ImportResource; 
 
/** 
 * 〈一句话功能简述〉<br>  
 * 〈Ems web控制层〉 
 * 
 * @author Administrator 
 * @create 2018/8/16 
 * @since 1.0.0 
 */ 
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 
@ImportResource("classpath:consumer.xml") 
public class EmsWebApplication { 
    public static void main(String[] args) throws Exception{ 
        SpringApplication.run(EmsWebApplication.class, args); 
    } 
} 

码云地址:https://gitee.com/zhouzhiwengang/ems.git

项目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"> 
    <modelVersion>4.0.0</modelVersion> 
 
    <groupId>com.zzg</groupId> 
    <artifactId>ems</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0-SNAPSHOT</version> 
 
    <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> 
        <mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version> 
        <mysql-connector-java.version>8.0.11</mysql-connector-java.version> 
        <pagehelper-spring-boot-starter.version>1.2.5</pagehelper-spring-boot-starter.version> 
        <com.alibaba.druid.version>1.1.0</com.alibaba.druid.version> 
    </properties> 
 
    <dependencies> 
        <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> 
        <dependency> 
            <groupId>org.mybatis.spring.boot</groupId> 
            <artifactId>mybatis-spring-boot-starter</artifactId> 
            <version>${mybatis-spring-boot-starter.version}</version> 
        </dependency> 
 
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
            <version>${mysql-connector-java.version}</version> 
            <scope>runtime</scope> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
        </dependency> 
        <!-- 分页插件 --> 
        <dependency> 
            <groupId>com.github.pagehelper</groupId> 
            <artifactId>pagehelper-spring-boot-starter</artifactId> 
            <version>${pagehelper-spring-boot-starter.version}</version> 
        </dependency> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>druid</artifactId> 
            <version>${com.alibaba.druid.version}</version> 
        </dependency> 
        <!-- Spring Boot Dubbo 依赖 --> 
        <dependency> 
            <groupId>org.apache.zookeeper</groupId> 
            <artifactId>zookeeper</artifactId> 
            <version>3.4.8</version> 
        </dependency> 
        <dependency> 
            <groupId>com.101tec</groupId> 
            <artifactId>zkclient</artifactId> 
            <version>0.7</version> 
        </dependency> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>dubbo</artifactId> 
            <version>2.8.4</version> 
            <exclusions> 
                <exclusion> 
                    <groupId>org.springframework</groupId> 
                    <artifactId>spring</artifactId> 
                </exclusion> 
            </exclusions> 
        </dependency> 
    </dependencies> 
 
    <modules> 
        <module>ems-api</module> 
        <module>ems-service</module> 
        <module>ems-web</module> 
        <module>ems-dao</module> 
    </modules> 
 
 
</project>

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
KIKK导航

KIKK导航

排行榜
关注我们

一个IT知识分享的公众号