springboot+mybatis+dubbo+redis简单整合

一、创建一个接口maven项目

   里面存放服务的接口与实体类,在本地仓库安装(install)一下接口服务,

目录结构

User就是简单的pojo实体类,在UserService中提供了两个接口方法

package com.fhh.springboot.service;

import com.fhh.springboot.Entity.User1;

/**
 * 功能描述:()
 * Created by biubiubiu小浩 on 2018-09-17 19:38
 */
public interface UserService {
    public String sayHi(String name);

    public User1 getUserById(int id);
}

一个是打印当前用户的名字,一个是根据当前用户id查询当前用户实体类。

创建完毕之后再打开下图的地方

idea是在这边安装,eclipse是右键项目然后找到run as,点击maven install,安装接口服务。

(2)创建服务提供者springboot项目

先在阿里github(https://github.com/alibaba)上搜索dubbo-spring-boot-starter

<dependency>
     <groupId>com.alibaba.spring.boot</groupId> 
    <artifactId>dubbo-spring-boot-starter</artifactId>
     <version>2.0.0</version>
 </dependency>

在服务提供者pom文件中加入以上依赖,启动zookeeper,添加zookeeper客户端依赖,还需添加mybatis,redis,mysql的起步依赖

<!--springboot集成dubbo起步依赖-->
<dependency>
	<groupId>com.alibaba.spring.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>2.0.0</version>
</dependency>
<!--zookeeper客户端-->
<dependency>
    <groupId>com.101tec</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.10</version>
</dependency>
<!--dubbo接口服务jar包依赖-->
<dependency>
	<groupId>com.fhh.springboot</groupId>
	<artifactId>springboot-dubbo-interface</artifactId>
	<version>1.0.0</version>
</dependency>
<!--mybatis起步依赖包-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.3.1</version>
</dependency>
<!--mysql包-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--redis起步依赖包-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

服务提供者主要负责实现接口服务项目中的接口,处理业务逻辑,对数据库进行相关操作

特别需要注意的是Mapper中的namespace以及返回参数的类型需要指定到具体包下面的具体实体类,不然项目启动会报注入不了Dao

 如果有两个项目恰好路径相同并且类名相同,但是具体pojo不同需要更换一个名字。

Service实现类注解使用的是dubbo的service注解

要将该service交给spring容器管理,所以需要加入一个@Component(此处用Component注解而不用service注解是因为dubbo引入已经用了一个Service注解,用两个Service看起来很别扭,其实用Service也是一样的)


import com.alibaba.dubbo.config.annotation.Service;
import com.fhh.springboot.Dao.UserDao1;
import com.fhh.springboot.Entity.User1;
import com.fhh.springboot.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;

/**
 * 功能描述:()
 * Created by biubiubiu小浩 on 2018-09-18 20:07
 */
/*dubbo注解*/
@Service(version = "1.0.0")
@Component
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao1 userDao;
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    private static final RedisSerializer redisSerializer = new StringRedisSerializer();

    @Override
    public String sayHi(String name) {
        return "Hi,SpringBoot-Dubbo"+name;
    }

    @Override
    public User1 getUserById(int id) {
        redisTemplate.setKeySerializer(redisSerializer);
        User1 user = (User1) redisTemplate.opsForValue().get("userNew" + id);
        //高并发情况下,存在缓存穿透,此处用双重检测锁
        if (null == user) {
            synchronized (this){
                user = (User1) redisTemplate.opsForValue().get("userNew" + id);
                if (null == user) {
                    System.out.println("查询数据库");
                    user = userDao.selectByPrimaryKey(id);
                    if (!ObjectUtils.isEmpty(user)) {
                        redisTemplate.opsForValue().set("userNew" + id, user);
                    }
                }
                if (ObjectUtils.isEmpty(user)) {
                    return new User1("未查找到该用户!", 0, 0);
                }
            }
        }else {
            System.out.println("查询缓存");
        }
        return user;
    }
}

 这是service的内容,值得一提的是在Service(此处为dubbo的注解)中加入了版本号,在消费者中调用服务则也需要加上版本号。

上面一些简单的业务就实现了,但是你在启动的时候需要让springboot知道要引用dubbo的注解,所以在启动类上得加上开启扫描dubbo的注解

 当然yml文件也得加入dubbo在zookeeper上的的注册地址以及mysql的连接池信息,redis的连接信息

# mybatis配置
mybatis:
  mapper-locations: classpath:Mapper/*.xml
  type-aliases-package: com.fhh.Entity
# 数据库连接配置
#dubbo配置
spring:
  dubbo:
    application:
      name: springboot-dubbo-provider
    registry:
      address: zookeeper://127.0.0.1:2181
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver
  # redis配置
  redis:
    host: 127.0.0.1
    port: 6379
    password: redis
server:
  port: 8082

以上步骤操作完成后我们的一个简单的服务提供者就完成了。

(3)、服务消费者

服务消费者相对逻辑简单很多,只是调用服务提供者的服务

pom文件同服务消费者,只是把数据库和redis的依赖给去掉了,因为他不需要操作数据,操作数据这些事只需要交给提供者去做就可以了

package com.fhh.springboot.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.fhh.springboot.Entity.User1;
import com.fhh.springboot.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 功能描述:()
 * Created by biubiubiu小浩 on 2018-09-16 15:41
 */
@RestController
public class UserController {
    //这个version就是服务提供者那边所加入的,如果服务提供者没有加,则这边也不需要加
    @Reference(version = "1.0.0")
    private UserService userService;

    @RequestMapping(value = "/sayHi")
    public String addUser(String userName){
        String hi = userService.sayHi(userName);
        return  hi;
    }

    @RequestMapping(value = "/findUser")
    public User1 findUser(int id){

      System.out.println("a");
        System.out.println("b");
        System.out.println("c");
        System.out.println("d");
        return userService.getUserById(id);
    }
}

同样的需要在启动类中开启dubbo的扫描,yml文件中也需要在zookeeper中注册,注册的名字不能与提供者重复,若以后服务越来越多,服务名都是不能重复的,不然zookeeper也不知道你试用的是谁的服务。

以上就是简单的配置了。

附上源码GitHub地址:https://github.com/fhhly/springboot-dubbo.git

如有疑问请留言,看到会第一时间回复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值