前言
dubbo一般的都是使用zookeeper作为注册中心,但是也可以使用nacos作注册中心,本文记录了使用idea在springboot下整合dubbo、nacos、mybatis流程,用于将来查看以及提供给小白傻瓜式整合步骤,含源码。
开发工具:idea
一、搭建工程框架
整体框架
新建maven空工程作为父工程
删除src文件夹,仅作为一个空的父工程:
新建服务提供者provider模块
服务提供者需要操作数据库,所以这里添加了mybatisplus、nacos、dubbo
删除没用的文件:
新建消费者 consumer模块
消费者不需要连接数据库,但是需要对外开放接口,所以模板选择了nacos、dubbo、web
新建公共接口interface模块
删除模块没用的文件后的工程构架:
二、各模块代码
2.1服务提供者 boot-user-service-provider
代码构架
pom文件依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.yunjia.gmall</groupId>
<artifactId>boot-user-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
配置文件application.yaml
server:
port: 8010
spring:
datasource:
url: jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
application:
name: boot-user-service-provider
#需要将order-service这个服务,注册到本地8848的注册中心上去,所以我们需要指定注册中心的地址
cloud:
nacos:
# 注册中心 也就是连接到哪个nacos上
discovery:
server-addr: localhost:8848
# 如果使用域名的注册中心地址时,域名后面需要加80端口,否则服务注册不上去,要注意
# server-addr: nacos.it235.com:80
# 将自己的服务注册到注册中心
register-enabled: true
namespace: b93daaf8-adae-4dc9-bf47-a812c650fd21
# 配置中心
config:
server-addr: localhost:8848
# 配置格式
file-extension: yaml
prefix: custom-prefix
namespace: b93daaf8-adae-4dc9-bf47-a812c650fd21
dubbo:
protocol:
port:
20881
registry:
address: nacos://127.0.0.1:8848
mapper
新建mapper.UserMapper,这个是用于mybatisplus使用的
package com.yunjia.gmall.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yunjia.gmall.bean.User;
public interface UserMapper extends BaseMapper<User> {
}
service
新建service.UserServiceDataSource,这个是用于privider层使用mybatis用的
package com.yunjia.gmall.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunjia.gmall.bean.User;
public interface UserServiceDataSource extends IService<User> { }
新建service.impl.UserServiceDataSourceImpl,UserServiceDataSource的实现
package com.yunjia.gmall.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yunjia.gmall.bean.User;
import com.yunjia.gmall.mapper.UserMapper;
import com.yunjia.gmall.service.UserServiceDataSource;
import org.springframework.stereotype.Service;
@Service
public class UserServiceDataSourceImpl extends ServiceImpl<UserMapper, User> implements UserServiceDataSource {
}
新建service.impl.UserServiceImpl,这个是公共接口模块interface里面的UserService实现,消费者操作数据库的增删改查就是在这里实现的
package com.yunjia.gmall.service.impl;
import com.yunjia.gmall.service.UserServiceDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Service;
import com.yunjia.gmall.bean.User;
import com.yunjia.gmall.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Service //暴露服务
@Slf4j
public class UserServiceImpl implements UserService {
@Autowired
UserServiceDataSource userServiceDataSource;
@Override
public List<User> getAllUser() throws Exception {
List<User> users = userServiceDataSource.list();
return users;
}
@Override
public User getUserById(Long userId) throws Exception {
//数据库
System.out.println("getUserById 收到了请求,userId:" + userId);
User user = userServiceDataSource.getById(userId);
if (user == null){
System.out.println("查询到空对象");
return null;
}
System.out.println("查询到的数据库对象:" + user.toString());
return user;
}
@Override
public User updateUser(User user) throws Exception {
boolean ret = userServiceDataSource.updateById(user);
if (!ret){
log.info("更新用户信息失败");
return null;
}
return user;
}
@Override
public User saveUser(User user) throws Exception {
boolean ret = userServiceDataSource.save(user);
if (!ret){
log.info("新增用户失败");
return null;
}
return user;
}
@Override
public boolean deleteUser(Long userId) throws Exception {
System.out.println("userId:" + userId);
boolean ret = userServiceDataSource.removeById(userId);
if (!ret){
log.info("删除失败");
return false;
}
return true;
}
}
启动类
添加dubbo使能注释以及mapper扫描注解
package com.yunjia.gmall;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
@MapperScan("com.yunjia.gmall.mapper")
public class BootUserServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}
2.2服务消费者 boot-user-service-consumer
代码构架
pom文件依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>com.yunjia.gmall</groupId>
<artifactId>boot-user-interface</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.1.4</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
配置文件
# 应用名称
spring.application.name=boot-user-service-consumer
dubbo.registry.protocol=dubbo
dubbo.registry.address=nacos://127.0.0.1:8848
# dubbo 协议
dubbo.protocol.id=dubbo
dubbo.protocol.name=dubbo
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
dubbo.protocol.port=-1
# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔
# 这里订阅"自己",会被忽略掉,请根据实际情况添加
dubbo.cloud.subscribed-services=boot-user-service-consumer
# dubbo 服务扫描基准包
dubbo.scan.base-packages=com.yunjia.gmall
# 应用服务 WEB 访问端口
server.port=8080
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
#数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
bean
新建bean.Result文件,用于接口返回格式的统一
package com.yunjia.gmall.bean;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
/**
* 响应体,主要用来做接口统一返回格式
*/
@Data
public class Result {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public Result() {
}
public Result(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public Result(Object data) {
this.status = 0;
this.msg = "OK";
this.data = data;
}
public static Result ok() {
return new Result(null);
}
public static Result ok(Object data) {
return new Result(data);
}
public static Result build(Integer status, String msg) {
return new Result(status, msg, null);
}
public static Result build(Integer status, String msg, Object data) {
return new Result(status, msg, data);
}
}
新建bean.User,类对象
package com.yunjia.gmall.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Long id;
private String name;
private Integer age;
private String email;
}
controler
新建Controller.UserController,接受并返回对外接口
package com.yunjia.gmall.Controller;
import com.yunjia.gmall.bean.Result;
import com.yunjia.gmall.bean.User;
import com.yunjia.gmall.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.util.List;
@RestController
@Slf4j
@RequestMapping("/user")
@ResponseBody
public class UserController {
@Reference
private UserService userService;
/**
* 查询所有记录
* @param
* @return
*/
@RequestMapping(value = "/getAllUser",method = RequestMethod.POST)
public Result getAllUser() throws Exception {
List<User> users = userService.getAllUser();
if (users.size() == 0){
return Result.build(-1,"未查询到信息");
}
return Result.ok(users);
}
/**
* 根据id获取数据
* @param
* @return
*/
@RequestMapping(value = "/getUserById",method = RequestMethod.POST)
public Result getUserById(@RequestBody User user) throws Exception {
log.info("收到了请求:" + user.getId());
Object selectRet = userService.getUserById(user.getId());
if (selectRet == null){
System.out.println("空对象");
return Result.build(-1,"未查询到信息");
}
User userSelect = (User) selectRet;
log.info("查到了对象:" + userSelect);
return Result.ok(userSelect);
}
/**
* 根据用户Id更新用户信息
* @param user
* @return
* @throws Exception
*/
@RequestMapping(value = "/updateUser",method = RequestMethod.POST)
public Result updateUser(@RequestBody User user) throws Exception {
User ret = userService.updateUser(user);
if (ret == null){
return Result.build(-1,"更新失败");
}
return Result.ok(ret);
}
/**
* 新增用户信息
* @param user
* @return
* @throws Exception
*/
@RequestMapping(value = "/saveUser",method = RequestMethod.POST)
public Result saveUser(@RequestBody User user) throws Exception {
User ret = userService.saveUser(user);
if (ret == null){
return Result.build(-1,"新增用户失败");
}
return Result.ok(ret);
}
/**
* 根据用户Id删除用户信息
* @param user
* @return
* @throws Exception
*/
@RequestMapping(value = "/deleteUser",method = RequestMethod.POST)
public Result deleteUser(@RequestBody User user) throws Exception {
System.out.println("收到请求,参数:" + user.toString());
boolean ret = userService.deleteUser(user.getId());
if (!ret){
return Result.build(-1,"删除用户失败");
}
return Result.ok();
}
}
其他文件,包括启动类等,无变化,不需要调整。
2.3公共接口boot-user-interface
bean
新建bean.User,类对象
package com.yunjia.gmall.bean;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@TableName("user")
public class User implements Serializable {
@TableId(type= IdType.AUTO) //解决新增数据自增id很大的问题
private Long id;
private String name;
private Integer age;
private String email;
}
service
新建user.UserService,定义接口,具体的实现在服务提供者那里
package com.yunjia.gmall.service;
import com.yunjia.gmall.bean.User;
import java.util.List;
public interface UserService {
/**
* 获取所有用户信息
* @return
* @throws Exception
*/
public List<User> getAllUser() throws Exception;
/**
* 根据用户Id查询用户信息
* @param userId
* @return
*/
public User getUserById(Long userId) throws Exception;
/**
* 根据用户Id更新用户信息
* @param user
* @return
* @throws Exception
*/
public User updateUser(User user) throws Exception;
/**
* 新增用户信息
* @param user
* @return
* @throws Exception
*/
public User saveUser(User user) throws Exception;
/**
* 根据用户Id删除用户信息
* @param userId
* @return
* @throws Exception
*/
public boolean deleteUser(Long userId) throws Exception;
}
三、测试
启动工程
把服务提供者、服务消费者工程启动后,如果我们开启了nacos管理台,就可以看到,服务提供者和消费者都已经和注册中心连上了。关于nacos的详细使用以及管理台的开启,文章后面附上了详细文章的链接,感兴趣可以后面移步查看。
新增
删除
修改
查询
总结
1、源码:
点击下载工程源码
2、springboot整合mybatis:
点击查看springboot整合mybatisplus详细流程
3、springboot使用nacos:
点击查看nacos的搭建