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也不知道你試用的是誰的服務。
以上就是簡單的配置了。
如有疑問請留言,看到會第一時間回覆