一、创建一个接口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
如有疑问请留言,看到会第一时间回复