1. 程式人生 > >springboot+mybatis+dubbo+redis簡單整合

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也不知道你試用的是誰的服務。

以上就是簡單的配置了。

如有疑問請留言,看到會第一時間回覆