springboot+mybatis+mysql+dubbo整合使用案例

作为ssm的升级版框架springboot,在崇尚分布式,微服务的今天,越来越受到开发人员的喜爱和青睐,其优秀而简洁的配置,相比ssm的一大堆的xml配置文件,尤其在快速高效的敏捷开发节奏下,显得脱颖而出,springboot的各种社区活跃程度异常火爆,因此,作为一个后端开发人员,还未掌握springboot是不是显得有些out啦?

另外,个人觉得springboot的一个便捷而强大之处在于,其底层和其他第三方框架进行整合的时候,也越来越方便,只需简单的几行配置文件即可完成,譬如整合mybatis,只导入基本的jar包,并添加两行配置即可搞定,是不是很方便;

dubbo作为一款分布式服务框架,经受了双11等电商的考验,也越来越受到分布式开发选择方案的首选,接下来,将简单做一下springboot和dubbo的整合,以备工作中参考和使用;

由于dubbo是作为分布式开发而生,此处模拟不同的工程项目之间,利用dubbo作为分布式框架,进行工程项目之间进行服务的调用;

项目结构如下:

这里写图片描述

此处,新建三个maven工程,项目创建的过程将不再赘述,接下来,分别对各个工程的具体职能和结构做简单的说明;

1)springboot-api,这个是对外提供服务的接口工程,服务提供者将通过实现该工程中的接口,并将服务列表发布到dubbo的注册中心上,以供消费者调用,实际使用中,如果调用的服务不对,可以和provider所在的工程合并,但个人建议分开,因为可能存在多个服务提供者,这样可以实现接口服务工程的依赖和复用;

该工程比较简单,pom文件没有任何依赖,此处只是作为一个普通的jar工程将被服务提供者依赖使用,新建一个package,并在该package下创建一个接口文件,里面有两个接口,
这里写图片描述

bean包下面存放的是实体对象文件,整合mybatis的时候用,接口代码比较简单,

public interface DemoService {
String sayHello(String name);
List queryAll();
}

2)接口工程的内容就是这么多,下面看服务提供方配置,springboot-provider
这里写图片描述

pom文件依赖:

org.springframework.boot
spring-boot-starter-parent
2.0.1.RELEASE

<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>com.sino</groupId>
        <artifactId>springboot-api</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- mybatis 与 spring boot 2.x的整合包 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>

    <!-- mysql JDBC驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.39</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-logging-juli</artifactId> 
        <version>8.0.33</version> </dependency> -->

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.6</version>
    </dependency>

    <!--dubbo-springBoot依赖 -->
    <dependency>
        <groupId>io.dubbo.springboot</groupId>
        <artifactId>spring-boot-starter-dubbo</artifactId>
        <version>1.0.0</version>
    </dependency>

    <!--zookeeper依赖 -->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.4.8</version>
    </dependency>

</dependencies>

此处使用的springboot2.X版本,2.X以后,对其他框架的支持性更好,建议使用,低版本的1.5.8的也可以,使用的时候可以参考springboot官方的API进行版本选择,依赖比较简单,主要是springboot的web基本依赖,再添加spring-dubbo的依赖以及连接zookeeper的客户端依赖;

接下来是application.properties的配置,这个配置文件里面配置的是连接dubbo,mysql,以及整合mybatis的配置,配置如下:

server.port=8081

dubbo的配置信息

spring.dubbo.application.name=springboot-dubbo-provider
spring.dubbo.registry.address=zookeeper://192.168.111.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.dubboProvide.dubboProvide.service.imp

数据库连接信息

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

mybatis配置

mybatis.type-aliases-package=com.dubboProvide.dubboProvide.service.entity
mybatis.mapper-locations=classpath:mybatis/*.xml

打印sql时的语句 ========================

logging.level.com.dubboProvide.dubboProvide.service.mapper = debug
logging.file=d:/logs/dubbo-provider.log

关于mybatis的配置,在之前的整合篇中有提到过,是个人实际工作中使用总结的一种相对比较好用的方式,也可以通过在启动类上添加mapperscan注解,此处略过,配置打印sql语句为了控制台上方便调试使用,

这里写图片描述

provider项目结构如图所示,imp包为接口实现的包,里面新建一个对外暴露接口服务的业务实现类,DemoServiceImp,实现API工程的接口,代码如下:

@Service(version = “1.0.0”)
public class DemoServiceImp implements DemoService{

@Autowired
private UserMapper userMapper;

@Override
public String sayHello(String name) {
    return "Hello, " + name + " (from Spring Boot)";
}

@Override
public List<TUser> queryAll() {
    return userMapper.queryAll();
}

}

可以看到,添加的@Service(version = “1.0.0”)注解中有一个version版本,建议加上,否则会报奇葩的错误,有些伙伴没有报错,但我试了很多次,报了,这个坑踩的有点儿心塞;

另外,尽管是提供服务的工程,实际项目开发中,可能这个工程也有自己的业务和其他的逻辑要实现,而且提供出去的接口里面包含了很多需要处理的业务数据,并且消费者只关心自己想要的数据,因此在这个工程里面进行了mysql和mybatis的整合,相应的数据处理也需要在这个业务实现类中做处理,

第一个接口仅仅做简单的根据传入的字符串返回,第二个接口整合了mybatis,查询数据库,将查询到的数据结果返回,内容比较简单,不做深入说明;

UserMapper.xml文件中,简单的查询数据表的sql语句,
这里写图片描述

当然,如果provider工程中还需要其他的业务处理,或者controller也需要处理的话,可以继续增加代码,此处,该工程的主要作用依然是提供接口的业务实现,下面看启动类:

@SpringBootApplication
public class MainProvider {

public static void main(String[] args) {
    SpringApplication.run(MainProvider.class, args);
}

}

运行main函数,服务提供者就启动了,服务提供者需要先启动,这样才能将服务发布到注册中心上去,
这里写图片描述

启动的时候注意红色方框里的日志信息,启动之前一定要先把zookeeper启动,如果启动的时候,zookeeper信息没有打印出来,调用的时候可能会失败,此处容易踩坑,启动成功后,如果部署了dubbo的控制台了,可以看到当前的服务已经发布成功了,管控台的使用稍后补上;

接下来看服务消费者,
这里写图片描述

pom的配置文件和provider基本一样,此处保持相同即可,需要注意的是仍然需要把API的工程依赖进去,

application.properties的配置有所不同,如下所示,消费端订阅相同的注册中心

server.port=8082
spring.dubbo.application.name=springboot-dubbo-consumer
spring.dubbo.registry.address=zookeeper://192.168.111.1:2181
spring.dubbo.scan=com.dubboconsumer.dubboConsumer.service.imp

新建imp包,该包被dubbo扫描,意味着这个包下的业务类可以进行远程服务的调用,新建一个类文件,DubboTestService,代码如下:

@Component
public class DubboTestService {

@Reference(version = "1.0.0")
public DemoService demoService;

public String Echo(String s) {
    String ret_msg;
    try {
        ret_msg = demoService.sayHello(s);
    } catch (Exception e) {
        e.printStackTrace();
        ret_msg = "出错啦!";
    }
    return ret_msg;
}

public List<TUser> queryAll(){
    return demoService.queryAll();
}

}

其中,第一个是普通的测试类,第二个是将服务提供者查询数据库得到的数据进行返回;
再看controller,作为测试使用,DemoConsumerController,代码如下,

@RestController
@RequestMapping(“/test”)
public class DemoConsumerController {

@Resource
private DubboTestService dubboTestService;

@RequestMapping("/sayHello")
public String sayHello() {
    String name = "hello dubbo";
    return dubboTestService.Echo(name);
}

@RequestMapping("/queryAll")
public List<TUser> queryAll(){
    return dubboTestService.queryAll();
}

}

到此为止,consumer工程的配置和测试代码也编写完毕,同样,如果consumer工程中也有自身的业务逻辑需要实现,也可以整合mysql和mybatis,这个同provider一样配置即可,

下面是服务消费者的启动类,

@SpringBootApplication
public class MainConsumer {

public static void main(String[] args) {
    SpringApplication.run(MainConsumer.class, args);
}

}

右键运行main函数,如果启动没有报错,同样在控制台下输出的日志信息中存在红色方框所示内容:
这里写图片描述

说明当前的消费者成功订阅到dubbo发布到注册中心上面的服务,

接下来通过在浏览器分别输入:

【1】http://localhost:8082/test/sayHello,打印内容,说明调用成功,

这里写图片描述

【2】http://localhost:8082/test/queryAll,打印内容,说明调用成功,并成功查询到了数据库的数据,
这里写图片描述

到此为止,springboot整合dubbo的基本用法全部结束,作为demo,尽管看起来代码不多,但是里面的细节部分很容易掉坑,尤其是对于没有做过此类整合的童鞋,一开始会整合起来会遇到很多麻烦,便容易中途放弃,由于只是简单整合使用,并未做其他更为精细的配置,大家可以在此基础上继续修改完善,下面将使用过程中踏过的几点儿坑列举出来,以备后用,

(1)jar包的依赖,在dubbo和spring进行整合中,主要的依赖如下:
这里写图片描述

一开始整合中,参考的各种资料,添加的dubbo依赖五花八门,启动的时候一直报错,排查的时候主要是服务无法调用,网上有人用整合spring的方式添加上述依赖成功了,但我怎么弄都报错,因此,实际整合的时候只需要添加下面的两个依赖即可:

这里写图片描述

zookeeper版本只要不是太低均可;

(2)整合mybatis 的时候,实体类一定要序列化,否则查询数据时候无法进行转换得到期望的结果;

(3)配置dubbo的扫描包文件的时候,尽可能将包的范围缩小,一方面可以减少dubbo启动初始化的时候扫描工程时候带来的性能损耗,同时可以更好的控制和管理服务的调用;

(4)注解@Reference(version = “1.0.0”),一定不能忘记括号里面的versionb=version = “1.0.0”

本文到此结束,,不足部分,敬请见谅,并提出宝贵意见!!!重点内容

猜你喜欢

转载自blog.csdn.net/zhangcongyi420/article/details/82530317