如何利用Springboot+Dubbo构建分布式微服务

技术如何利用Springboot+Dubbo构建分布式微服务本篇内容主要讲解“如何利用Springboot+Dubbo构建分布式微服务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家

本文主要讲解“如何使用Springboot Dubbo构建分布式微服务”,感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖学习“如何使用Springboot Dubbo构建分布式微服务”!

一、先来一张图

说到Dubbo,相信大家都会很熟悉吧!阿里巴巴开源的高性能优秀服务框架,让应用通过高性能RPC实现服务的输出和输入功能,可以与Spring框架无缝集成。

如何利用Springboot+Dubbo构建分布式微服务

Dubbo架构图

节点角色描述:

提供者:公开服务的服务提供者

消费者:调用远程服务的服务消费者。

注册表:服务注册和发现的注册表。

监控中心:统计服务呼叫次数和时间的监控中心。

容器:服务运行容器

二、实现思路

今天用一个用户挑选商品下单的过程,我们把它拆分成用户中心、商品中心、订单中心三个业务服务,用Springboot Dubbo实现一个小Demo!

服务交互过程如下:

如何利用Springboot+Dubbo构建分布式微服务

本文主要介绍了Springboot和Dubbo的框架集成和开发实践,真正的业务服务拆分是一个非常复杂的过程,比我们介绍的要复杂得多。上面提到的三个服务只是为了项目演示,我们不用太担心为什么会这样拆分!

好了,别废话了,接下来我们开门见山吧!

1.在虚拟机中创建四个centos7,并选择任意一个来安装zookeeper。

2.构建微服务项目并编写代码。

3.在centos7上部署微服务

4.远程服务呼叫测试

三、zookeeper安装

在使用Dubbo之前,我们需要一个注册中心。目前,Dubbo可以选择zookeeper、Nacos等。一般推荐动物园管理员!

首先,在安装Zookeeper之前,您需要安装和配置JDK。本机采用甲骨文Java8 SE。

安装JDK(已安装可忽略)

Yum-yinstalljava-1.8.0-openjdk检查java安装

java版本如何利用Springboot+Dubbo构建分布式微服务

JDK安装完成后,下载并安装动物园管理员。

#创建一个zookeeper文件夹cd/usrmkdirzookeeper#下载zookeeper的版本-3 . 4 . 14 WGET http://mirrors . HUST . edu.cn/Apache/zookeeper/zookeeper-3 . 4 . 14/zookeeper-3 . 4 . 14 . tar . gz #并提取它。

#创建数据和日志存储目录CD/usr/zookeeper/mkdirdatamkdirlog #在conf下制作zoo_sample.cfg的备份副本,并将其重命名为zoo.cfgcd

conf/ cp zoo_sample.cfg zoo.cfg

  • 配置zookeeper

#编辑zoo.cfg文件 vim zoo.cfg

如何利用Springboot+Dubbo构建分布式微服务

  • 启动Zookeeper

#进入Zookeeper的bin目录 cd zookeeper/zookeeper-3.4.14/bin  #启动Zookeeper ./zkServer.sh start  #查询Zookeeper状态 ./zkServer.sh status  #关闭Zookeeper状态 ./zkServer.sh stop

出现如下信息,表示启动成功!

如何利用Springboot+Dubbo构建分布式微服务

四、项目介绍

  • 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,并初始化数据

如何利用Springboot+Dubbo构建分布式微服务

如何利用Springboot+Dubbo构建分布式微服务

  • 在 dianshang-platform 数据库中,创建商品表 tb_product,并初始化数据

如何利用Springboot+Dubbo构建分布式微服务

如何利用Springboot+Dubbo构建分布式微服务

  • 在 dianshang-platform 数据库中,创建订单表 tb_order、订单详情表 tb_order_detail

如何利用Springboot+Dubbo构建分布式微服务

如何利用Springboot+Dubbo构建分布式微服务

5.2、创建工程

数据库表设计完成之后,在 IDEA 下创建一个名称为dianshang的Springboot工程。

最终的目录如下图:

如何利用Springboot+Dubbo构建分布式微服务

目录结构说明:

  • 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;     } }

其中的注解@Service指的是org.apache.dubbo.config.annotation.Service下的注解,而不是Spring下的注解哦!

接着,我们继续创建商品中心项目!

5.4、创建商品中心项目

与用户中心项目类似,在 IDEA 中,创建dianshang-platform子模块,并依赖dianshang-common模块

<dependencies>     <dependency>         <groupId>org.project.demo</groupId>         <artifactId>dianshang-common</artifactId>         <version>1.0.0</version>     </dependency> </dependencies>

同时,创建dianshang-platform-provider和dianshang-platform-api模块。

  • dianshang-platform-api:主要对其他服务提供接口暴露

  • dianshang-platform-provider:类似一个web工程,主要负责基础业务的crud,同时依赖dianshang-platform-api模块

5.4.1、配置dubbo服务

在dianshang-platform-provider的application.yml文件中配置dubbo服务,如下:

#用户中心服务端口 server:   port: 8081 #数据源配置 spring:   datasource:     druid:       driver-class-name: com.mysql.cj.jdbc.Driver       url: "jdbc:mysql://localhost:3306/dianshang-platform"       username: root       password: 111111 #dubbo配置 dubbo:   scan:     # 包名根据自己的实际情况写     base-packages: org.project.dianshang.platform   protocol:     port: 20881     name: dubbo   registry:     #zookeeper注册中心地址     address: zookeeper://192.168.0.107:2181

5.4.2、编写服务暴露接口以及实现类

在dianshang-platform-api模块中,创建一个ProductApi接口,以及返回参数对象ProductVo!

public interface ProductApi {      /**      * 通过商品ID,查询商品信息      * @param productId      * @return      */     ProductVo queryProductInfoById(String productId); }

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

@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class ProductVo implements Serializable {      private static final long serialVersionUID = 1L;      /**商品ID*/     private String productId;      /**商品名称*/     private String productName;      /**商品价格*/     private BigDecimal productPrice; }

在dianshang-platform-provider模块中,编写ProductApi接口实现类,如下:

@Service(interfaceClass = ProductApi.class) @Component public class ProductProvider implements ProductApi {      @Autowired     private ProductService productService;      @Override     public ProductVo queryProductInfoById(String productId) {         //通过商品ID查询信息         Product source = productService.getById(productId);         if(source != null){             ProductVo vo = new ProductVo();             BeanUtils.copyProperties(source,vo);             return vo;         }         return null;     } }

接着,我们继续创建订单中心项目!

5.5、创建订单中心项目

与商品中心项目类似,在 IDEA 中,创建dianshang-business子模块,并依赖dianshang-common模块

<dependencies>     <dependency>         <groupId>org.project.demo</groupId>         <artifactId>dianshang-common</artifactId>         <version>1.0.0</version>     </dependency> </dependencies>

同时,创建dianshang-business-provider和dianshang-business-api模块。

  • dianshang-business-api:主要对其他服务提供接口暴露

  • dianshang-business-provider:类似一个web工程,主要负责基础业务的crud,同时依赖dianshang-business-api模块

5.5.1、配置dubbo服务

在dianshang-business-provider的application.yml文件中配置dubbo服务,如下:

#用户中心服务端口 server:   port: 8082 #数据源配置 spring:   datasource:     druid:       driver-class-name: com.mysql.cj.jdbc.Driver       url: "jdbc:mysql://localhost:3306/dianshang-business"       username: root       password: 111111 #dubbo配置 dubbo:   scan:     # 包名根据自己的实际情况写     base-packages: org.project.dianshang.business   protocol:     port: 20882     name: dubbo   registry:     #zookeeper注册中心地址     address: zookeeper://192.168.0.107:2181

5.5.2、编写服务暴露接口以及实现类

在dianshang-business-api模块中,创建一个OrderApi接口,以及返回参数对象OrderVo!

public interface OrderApi {      /**      * 通过用户ID,查询用户订单信息      * @param userId      * @return      */     List<OrderVo> queryOrderByUserId(String userId); }

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

@Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) public class OrderVo implements Serializable {      private static final long serialVersionUID = 1L;      /**订单ID*/     private String orderId;      /**订单编号*/     private String orderNo;      /**订单金额*/     private BigDecimal orderPrice;      /**下单时间*/     private Date orderTime; }

在dianshang-business-provider模块中,编写OrderApi接口实现类,如下:

@Service(interfaceClass = OrderApi.class) @Component public class OrderProvider implements OrderApi {      @Autowired     private OrderService orderService;      @Override     public List<OrderVo> queryOrderByUserId(String userId) {         QueryWrapper<Order> queryWrapper = new QueryWrapper<Order>();         queryWrapper.eq("user_id",userId);         List<Order> sourceList = orderService.list(queryWrapper);         if(!CollectionUtils.isEmpty(sourceList)){             List<OrderVo> voList = new ArrayList<>();             for (Order order : sourceList) {                 OrderVo vo = new OrderVo();                 BeanUtils.copyProperties(order, vo);                 voList.add(vo);             }             return voList;         }         return null;     } }

至此,3个项目的服务暴露接口已经开发完成!接下来我们来编写怎么进行远程调用!

5.6、远程调用

5.6.1、编写创建订单服务

在dianshang-business-provider模块中,编写创建订单接口之前,先依赖dianshang-business-api和dianshang-user-api,如下:

<!--商品服务接口暴露 api--> <dependency>     <groupId>org.project.demo</groupId>     <artifactId>dianshang-platform-api</artifactId>     <version>1.0.0</version> </dependency> <!--用户服务接口暴露 api--> <dependency>     <groupId>org.project.demo</groupId>     <artifactId>dianshang-user-api</artifactId>     <version>1.0.0</version> </dependency>

在dianshang-business-provider模块中,编写创建订单服务,如下:

@RestController @RequestMapping("/order") public class OrderController {      @Autowired     private OrderService orderService;      @Autowired     private OrderDetailService orderDetailService;      @Reference(check =false)     private ProductApi productApi;      @Reference(check =false)     private UserApi userApi;      /**      * 新增      */     @JwtIgnore     @RequestMapping(value = "/add")     public boolean add(String productId,String userId){         LocalAssert.isStringEmpty(productId,"产品Id不能为空");         LocalAssert.isStringEmpty(userId,"用户Id不能为空");         ProductVo productVo = productApi.queryProductInfoById(productId);         LocalAssert.isObjectEmpty(productVo,"未查询到产品信息");         UserVo userVo = userApi.findUserById(userId);         LocalAssert.isObjectEmpty(userVo,"未查询到用户信息");         Order order = new Order();         order.setOrderId(IdGenerator.uuid());         order.setOrderNo(System.currentTimeMillis() + "");         order.setOrderPrice(productVo.getProductPrice());         order.setUserId(userId);         order.setOrderTime(new Date());         orderService.save(order);          OrderDetail orderDetail = new OrderDetail();         orderDetail.setOrderDetailId(IdGenerator.uuid());         orderDetail.setOrderId(order.getOrderId());         orderDetail.setProductId(productId);         orderDetail.setSort(1);         orderDetailService.save(orderDetail);         return true;     } }

其中的@Reference注解,是属于org.apache.dubbo.config.annotation.Reference下的注解,表示远程依赖服务。

参数check  =false表示启动服务时,不做远程服务状态检查,这样设置的目的就是为了防止当前服务启动不了,例如用户中心项目没有启动成功,但是订单中心又依赖了用户中心,如果check=true,此时订单中心启动会报错!

5.6.2、编写用户查询自己的订单信息

同样的,在dianshang-user-provider模块中,编写用户查询自己的订单信息接口之前,先依赖dianshang-business-api和dianshang-user-api,如下:

<dependency>     <groupId>org.project.demo</groupId>     <artifactId>dianshang-business-api</artifactId>     <version>1.0.0</version> </dependency> <dependency>     <groupId>org.project.demo</groupId>     <artifactId>dianshang-user-api</artifactId>     <version>1.0.0</version> </dependency>

在dianshang-user-provider模块中,编写用户查询自己的订单信息接口,如下:

@RestController @RequestMapping("/user") public class UserController {      @Reference(check =false)     private OrderApi orderApi;       /**      * 通过用户ID,查询订单信息      * @param userId      * @return      */     @RequestMapping("/list")     public List<OrderVo> queryOrderByUserId(String userId){         return orderApi.queryOrderByUserId(userId);     } }

至此,远程服务调用,编写完成!

六、服务测试

在将项目部署在服务器之前,咱们先本地测试一下,看服务是否都可以跑通?

  • 启动用户中心dianshang-user-provider

如何利用Springboot+Dubbo构建分布式微服务

  • 继续启动商品中心dianshang-platform-provider

  • 如何利用Springboot+Dubbo构建分布式微服务

接着启动订单中心dianshang-business-provider

如何利用Springboot+Dubbo构建分布式微服务

最后,我们来测试一下服务接口是否为我们预期的结果?

打开浏览器,输入http://127.0.0.1:8082/order/add?productId=1&userId=1测试创建订单接口,页面运行结果显示正常!

如何利用Springboot+Dubbo构建分布式微服务

我们再来看看数据库,订单是否生成?

如何利用Springboot+Dubbo构建分布式微服务

如何利用Springboot+Dubbo构建分布式微服务

ok!很清晰的看到,数据已经进去了,没啥问题!

我们再来测试一下在用户中心订单查询接口,输入http://127.0.0.1:8080/user/list?userId=1,页面运行结果如下!

如何利用Springboot+Dubbo构建分布式微服务

到此,本地服务测试基本通过!

七、服务器部署

在上文中,我们介绍了服务的构建、开发和测试,那如何在服务器端部署呢?

首先,修改各个项目的application.yml文件,将其中的数据源地址、dubbo注册中心地址修改为线上能联通的地址,然后在dianshang目录下使用maven工具对整个工程执行如下命令进行打包!

mvn clean install

也可以在 IDEA 环境下,通过maven配置clean install命令执行打包。

将各个项目target目录下的dianshang-user-provider.jar、dianshang-platform-provider.jar、dianshang-business-provider.jar拷贝出来。

分别上传到对应的服务器目录,本服务器采用的是 CentOS7,总共4台服务器,其中一台部署zookeeper,另外三台部署三个微服务项目。

登录服务器,输入如下命令,确保JDK已经安装完成!

java -version

关闭所有服务器的防火墙,放行端口访问!

#关闭防火墙 systemctl stop firewalld.service  #禁止开机启动 systemctl disable firewalld.service
  • 启动用户中心服务,日志信息输出到service.log(虚拟机ip:192.168.0.108)

nohup java -jar  dianshang-user-provider.jar > service.log 2>&1 &
  • 启动商品中心服务,日志信息输出到service.log(虚拟机ip:192.168.0.107)

nohup java -jar  dianshang-platform-provider.jar > service.log 2>&1 &
  • 启动订单中心服务,日志信息输出到service.log(虚拟机ip:192.168.0.109)

nohup java -jar  dianshang-business-provider.jar > service.log 2>&1 &

打开浏览器,输入http://192.168.0.109:8082/order/add?productId=1&userId=1测试创建订单接口,页面运行结果显示正常!

如何利用Springboot+Dubbo构建分布式微服务

我们再来测试一下在用户中心订单查询接口,输入输入http://192.168.0.108:8080/user/list?userId=1,页面运行结果如下!

如何利用Springboot+Dubbo构建分布式微服务

很清晰的看到,输出了2条信息,第二条订单是在测试环境服务器生成的,第一条是本地开发环境生成的。

到此,服务器部署基本已经完成!

如果是生产环境,可能就需要多台zookeeper来保证高可用,至少2台服务器来部署业务服务,通过负载均衡来路由!

到此,相信大家对“如何利用Springboot+Dubbo构建分布式微服务”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86565.html

(0)

相关推荐

  • 题解 UVA103 Stacking Boxes

    技术题解 UVA103 Stacking Boxes 题解 UVA103 Stacking Boxes【题意简述】
    给你\(k\)个\(n\)维盒子,求最多能把其中的几个盒子一层层装入
    【题目分析】

    礼包 2021年11月4日
  • 手机分屏怎么弄,手机分屏模式怎么切换两面全屏

    技术手机分屏怎么弄,手机分屏模式怎么切换两面全屏方法/步骤分步阅读1/5
    分屏切换为全屏
    点击分屏线中间的按钮手机分屏怎么弄,向上或向下滑动,即可将想放大的界面变成全屏。
    2
    /5
    互换分屏位置
    点击分屏线中间的按钮,点

    生活 2021年10月27日
  • 分析CSS动画Transition与Animation

    技术分析CSS动画Transition与Animation本篇内容主要讲解“分析CSS动画Transition与Animation”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习

    攻略 2021年11月6日
  • ajax技术的用法(ajax技术怎么用)

    技术Ajax技术怎么用这篇文章主要介绍了Ajax技术怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ajax的作用有:1

    攻略 2021年12月17日
  • vue如何获取dom元素

    技术vue如何获取dom元素这篇文章将为大家详细讲解有关vue如何获取dom元素,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 vue获取dom元素的方法:

    攻略 2021年10月27日
  • 公式规律,平码三中三公式规律是什么

    技术公式规律,平码三中三公式规律是什么一公式规律、规律如下:
    1、公式主要分为两大类计算,公式前面都有注明。
    2、大小序D:公式前面有注明字母D的为大小序。算法是从小到大。(大小序第一个拼音字母)或直接写明大小序落球

    生活 2021年10月23日