SpringBoot+Dubbo构建微服务
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。一、先来一张图说起 Dubbo,相信大家都不会陌生!阿里巴巴公司开源的一个高性能优秀的服务框架,可以使得应用可通过高性能的 RPC 实现服务的输出和输入功能,同时可以和 Spring 框架无缝集成。Dubbo 架构图节点角色说明:Provider:
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
一、先来一张图
说起 Dubbo,相信大家都不会陌生!阿里巴巴公司开源的一个高性能优秀的服务框架,可以使得应用可通过高性能的 RPC 实现服务的输出和输入功能,同时可以和 Spring 框架无缝集成。
Dubbo 架构图
节点角色说明:
- Provider:暴露服务的服务提供方
- Consumer:调用远程服务的服务消费方
- Registry:服务注册与发现的注册中心
- Monitor:统计服务的调用次数和调用时间的监控中心
- Container:服务运行容器
二、实现思路
今天,我们以一个用户选择商品下订单这个流程,将其拆分成3个业务服务:用户中心、商品中心、订单中心,使用 Springboot + Dubbo 来实现一个小 Demo!
服务交互流程如下:
本文主要是介绍 Springboot 与 Dubbo 的框架整合以及开发实践,而真实的业务服务拆分是一个非常复杂的过程,比我们介绍的这个要复杂的多,上文提到的三个服务只是为了项目演示,不必过于纠结为什么要这样拆分!
好了,废话也不多说了,下面我们开撸!
- 1.在虚拟机创建 4 台 centos7,任意选择一台安装 zookeeper
- 2.构建微服务项目并编写代码
- 3.在 centos7 上部署微服务
- 4.远程服务调用测试
三、zookeeper安装
在使用 Dubbo 之前,我们需要一个注册中心,目前 Dubbo 可以选择的注册中心有 zookeeper、Nacos 等,一般建议使用 zookeeper!
首先在安装 Zookeeper 之前,需要安装并配置好 JDK,本机采用的是Oracle Java8 SE。
- 安装JDK(已经安装可以忽略)
yum -y install java-1.8.0-openjdk
- 查看java安装情况
java -version
- JDK安装完成之后,下载安装Zookeeper
#创建一个zookeeper文件夹
cd /usr
mkdir zookeeper
#下载zookeeper-3.4.14版本
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
#解压
tar -zxvf zookeeper-3.4.14.tar.gz
创建数据、日志目录
#创建数据和日志存放目录
cd /usr/zookeeper/
mkdir data
mkdir log
#把conf下的zoo_sample.cfg备份一份,然后重命名为zoo.cfg
cd conf/
cp zoo_sample.cfg zoo.cfg
配置zookeeper
#编辑zoo.cfg文件
vim zoo.cfg
- 启动Zookeeper
#进入Zookeeper的bin目录
cd zookeeper/zookeeper-3.4.14/bin
#启动Zookeeper
./zkServer.sh start
#查询Zookeeper状态
./zkServer.sh status
#关闭Zookeeper状态
./zkServer.sh stop
出现如下信息,表示启动成功!
四、项目介绍
- springboot版本:2.1.1.RELEASE
- zookeeper版本:3.4.14
- dubbo版本:2.7.3
- mybtais-plus版本:3.0.6
- 数据库:mysql-8
- 构建工具:maven
- 服务模块:用户中心、商品中心、订单中心
五、代码实践
5.1、初始化数据库
首先在 mysql 客户端,创建3个数据库,分别是:dianshang-user
、dianshang-platform
、dianshang-business
。
- 在 dianshang-user 数据库中,创建用户表 tb_user,并初始化数据
- 在 dianshang-platform 数据库中,创建商品表 tb_product,并初始化数据
- 在 dianshang-platform 数据库中,创建订单表 tb_order、订单详情表 tb_order_detail
5.2、创建工程
数据库表设计完成之后,在 IDEA 下创建一个名称为dianshang
的Springboot
工程。
最终的目录如下图:
目录结构说明:
- dianshang-common:主要存放一些公共工具库,所有的服务都可以依赖使用
- dianshang-business:订单中心,其中
api
模块主要是提供dubbo服务暴露接口,provider
模块是一个springboot
项目,提供服务处理操作 - dianshang-user:用户中心,其中
api
模块和provider
模块,设计与之类似 - dianshang-platform:商品中心,其中
api
模块和provider
模块,设计与之类似
在父类pom
文件中加入dubbo
和zookeeper
客户端,所有依赖的项目都可以使用。
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 因为使用的是 zookeeper 作为注册中心,所以要添加 zookeeper 依赖 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--使用curator 作为zookeeper客户端-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
温馨提示:小编在搭建环境的时候,发现一个坑,工程中依赖的zookeeper
版本与服务器的版本,需要尽量一致,例如,本例中zookeeper
服务器的版本是3.4.14
,那么在依赖zookeeper
文件库的时候,也尽量保持一致,如果依赖3.5.x
版本的zookeeper
,项目在启动的时候会各种妖魔鬼怪的报错!
5.3、创建用户中心项目
在 IDEA 中,创建dianshang-user
子模块,并依赖dianshang-common
模块
<dependencies>
<dependency>
<groupId>org.project.demo</groupId>
<artifactId>dianshang-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
同时,创建dianshang-user-provider
和dianshang-user-api
模块。
- dianshang-user-api:主要对其他服务提供接口暴露
- dianshang-user-provider:类似一个web工程,主要负责基础业务的
crud
,同时依赖dianshang-user-api
模块
5.3.1、配置dubbo服务
在dianshang-user-provider
的application.yml
文件中配置dubbo
服务,如下:
#用户中心服务端口
server:
port: 8080
#数据源配置
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: "jdbc:mysql://localhost:3306/dianshang-user"
username: root
password: 111111
#dubbo配置
dubbo:
scan:
# 包名根据自己的实际情况写
base-packages: org.project.dianshang.user
protocol:
port: 20880
name: dubbo
registry:
#zookeeper注册中心地址
address: zookeeper://192.168.0.107:2181
5.3.2、编写服务暴露接口以及实现类
在dianshang-user-api
模块中,创建一个UserApi
接口,以及返回参数对象UserVo
!
public interface UserApi {
/**
* 查询用户信息
* @param userId
* @return
*/
UserVo findUserById(String userId);
}
其中UserVo
,需要实现序列化,如下:
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class UserVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private String userId;
/**
* 用户中文名
*/
private String userName;
}
在dianshang-user-provider
模块中,编写UserApi
接口实现类,如下:
@Service(interfaceClass =UserApi.class)
@Component
public class UserProvider implements UserApi {
@Autowired
private UserService userService;
@Override
public UserVo findUserById(String userId) {
QueryWrapper<User> queryWrapper = new QueryWrapper<User>();
queryWrapper.eq("user_id",userId);
User source = userService.getOne(queryWrapper);
if(source != null){
UserVo vo = new UserVo();
BeanUtils.copyProperties(source,vo);
return vo;
}
return null;
}
}
未完待续。。。。
更多推荐
所有评论(0)