栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot+Dubbo构建微服务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot+Dubbo构建微服务

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

一、先来一张图

说起 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客户端,所有依赖的项目都可以使用。



    org.projectlombok
    lombok
    1.18.4
    provided




    org.apache.dubbo
    dubbo-spring-boot-starter
    2.7.3



    org.apache.zookeeper
    zookeeper
    3.4.13
    
        
            org.slf4j
            slf4j-api
        
        
            org.slf4j
            slf4j-log4j12
        
        
            log4j
            log4j
        
    



    org.apache.curator
    curator-framework
    4.2.0


    org.apache.curator
    curator-recipes
    4.2.0

温馨提示:小编在搭建环境的时候,发现一个坑,工程中依赖的zookeeper版本与服务器的版本,需要尽量一致,例如,本例中zookeeper服务器的版本是3.4.14,那么在依赖zookeeper文件库的时候,也尽量保持一致,如果依赖3.5.x版本的zookeeper,项目在启动的时候会各种妖魔鬼怪的报错!

5.3、创建用户中心项目

在 IDEA 中,创建dianshang-user子模块,并依赖dianshang-common模块


    
        org.project.demo
        dianshang-common
        1.0.0
    

同时,创建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 {

    
    UserVo findUserById(String userId);
}

其中UserVo,需要实现序列化,如下:

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class UserVo implements Serializable {

    private static final long serialVersionUID = 1L;

    
    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 queryWrapper = new QueryWrapper();
        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;
    }
}

未完待续。。。。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838996.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号