精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

利用Springboot+Dubbo,構(gòu)建分布式微服務(wù),全程注解開發(fā)

開發(fā) 架構(gòu) 分布式
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進(jìn)。

隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進(jìn)。

[[326586]]

一、先來一張圖

說起 Dubbo,相信大家都不會陌生!阿里巴巴公司開源的一個高性能優(yōu)秀的服務(wù)框架,可以使得應(yīng)用可通過高性能的 RPC 實現(xiàn)服務(wù)的輸出和輸入功能,同時可以和 Spring 框架無縫集成。

 

Dubbo 架構(gòu)圖

節(jié)點角色說明:

  • Provider:暴露服務(wù)的服務(wù)提供方
  • Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費方
  • Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心
  • Monitor:統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心
  • Container:服務(wù)運行容器

二、實現(xiàn)思路

今天,我們以一個用戶選擇商品下訂單這個流程,將其拆分成3個業(yè)務(wù)服務(wù):用戶中心、商品中心、訂單中心,使用 Springboot + Dubbo 來實現(xiàn)一個小 Demo!

服務(wù)交互流程如下:

本文主要是介紹 Springboot 與 Dubbo 的框架整合以及開發(fā)實踐,而真實的業(yè)務(wù)服務(wù)拆分是一個非常復(fù)雜的過程,比我們介紹的這個要復(fù)雜的多,上文提到的三個服務(wù)只是為了項目演示,不必過于糾結(jié)為什么要這樣拆分!

好了,廢話也不多說了,下面我們開擼!

  • 1.在虛擬機創(chuàng)建 4 臺 centos7,任意選擇一臺安裝 zookeeper
  • 2.構(gòu)建微服務(wù)項目并編寫代碼
  • 3.在 centos7 上部署微服務(wù)
  • 4.遠(yuǎn)程服務(wù)調(diào)用測試

三、zookeeper安裝

在使用 Dubbo 之前,我們需要一個注冊中心,目前 Dubbo 可以選擇的注冊中心有 zookeeper、Nacos 等,一般建議使用 zookeeper!

首先在安裝 Zookeeper 之前,需要安裝并配置好 JDK,本機采用的是Oracle Java8 SE。

  • 安裝JDK(已經(jīng)安裝可以忽略)
  1. yum -y install java-1.8.0-openjdk 
  • 查看java安裝情況
  1. java -version 

  • JDK安裝完成之后,下載安裝Zookeeper
  1. #創(chuàng)建一個zookeeper文件夾 
  2. cd /usr 
  3. mkdir zookeeper 
  4.  
  5. #下載zookeeper-3.4.14版本 
  6. wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz 
  7.  
  8. #解壓 
  9. tar -zxvf zookeeper-3.4.14.tar.gz 
  • 創(chuàng)建數(shù)據(jù)、日志目錄
  1. #創(chuàng)建數(shù)據(jù)和日志存放目錄 
  2. cd /usr/zookeeper/ 
  3. mkdir data 
  4. mkdir log 
  5.  
  6. #把conf下的zoo_sample.cfg備份一份,然后重命名為zoo.cfg 
  7. cd conf/ 
  8. cp zoo_sample.cfg zoo.cfg 
  • 配置zookeeper
  1. #編輯zoo.cfg文件 
  2. vim zoo.cfg 

  • 啟動Zookeeper
  1. #進(jìn)入Zookeeper的bin目錄 
  2. cd zookeeper/zookeeper-3.4.14/bin 
  3.  
  4. #啟動Zookeeper 
  5. ./zkServer.sh start 
  6.  
  7. #查詢Zookeeper狀態(tài) 
  8. ./zkServer.sh status 
  9.  
  10. #關(guān)閉Zookeeper狀態(tài) 
  11. ./zkServer.sh stop 

出現(xiàn)如下信息,表示啟動成功!

四、項目介紹

  • springboot版本:2.1.1.RELEASE
  • zookeeper版本:3.4.14
  • dubbo版本:2.7.3
  • mybtais-plus版本:3.0.6
  • 數(shù)據(jù)庫:mysql-8
  • 構(gòu)建工具:maven
  • 服務(wù)模塊:用戶中心、商品中心、訂單中心

五、代碼實踐

5.1、初始化數(shù)據(jù)庫

首先在 mysql 客戶端,創(chuàng)建3個數(shù)據(jù)庫,分別是:dianshang-user、dianshang-platform、dianshang-business。

  • 在 dianshang-user 數(shù)據(jù)庫中,創(chuàng)建用戶表 tb_user,并初始化數(shù)據(jù)

  • 在 dianshang-platform 數(shù)據(jù)庫中,創(chuàng)建商品表 tb_product,并初始化數(shù)據(jù)

  • 在 dianshang-platform 數(shù)據(jù)庫中,創(chuàng)建訂單表 tb_order、訂單詳情表 tb_order_detail

5.2、創(chuàng)建工程

數(shù)據(jù)庫表設(shè)計完成之后,在 IDEA 下創(chuàng)建一個名稱為dianshang的Springboot工程。

最終的目錄如下圖:

目錄結(jié)構(gòu)說明:

  • dianshang-common:主要存放一些公共工具庫,所有的服務(wù)都可以依賴使用
  • dianshang-business:訂單中心,其中api模塊主要是提供dubbo服務(wù)暴露接口,provider模塊是一個springboot項目,提供服務(wù)處理操作
  • dianshang-user:用戶中心,其中api模塊和provider模塊,設(shè)計與之類似
  • dianshang-platform:商品中心,其中api模塊和provider模塊,設(shè)計與之類似

在父類pom文件中加入dubbo和zookeeper客戶端,所有依賴的項目都可以使用。

  1. <!-- lombok --> 
  2. <dependency> 
  3.     <groupId>org.projectlombok</groupId> 
  4.     <artifactId>lombok</artifactId> 
  5.     <version>1.18.4</version> 
  6.     <scope>provided</scope> 
  7. </dependency> 
  8.  
  9. <!-- Dubbo Spring Boot Starter --> 
  10. <dependency> 
  11.     <groupId>org.apache.dubbo</groupId> 
  12.     <artifactId>dubbo-spring-boot-starter</artifactId> 
  13.     <version>2.7.3</version> 
  14. </dependency> 
  15. <!-- 因為使用的是 zookeeper 作為注冊中心,所以要添加 zookeeper 依賴 --> 
  16. <dependency> 
  17.     <groupId>org.apache.zookeeper</groupId> 
  18.     <artifactId>zookeeper</artifactId> 
  19.     <version>3.4.13</version> 
  20.     <exclusions> 
  21.         <exclusion> 
  22.             <groupId>org.slf4j</groupId> 
  23.             <artifactId>slf4j-api</artifactId> 
  24.         </exclusion> 
  25.         <exclusion> 
  26.             <groupId>org.slf4j</groupId> 
  27.             <artifactId>slf4j-log4j12</artifactId> 
  28.         </exclusion> 
  29.         <exclusion> 
  30.             <groupId>log4j</groupId> 
  31.             <artifactId>log4j</artifactId> 
  32.         </exclusion> 
  33.     </exclusions> 
  34. </dependency> 
  35. <!--使用curator 作為zookeeper客戶端--> 
  36. <dependency> 
  37.     <groupId>org.apache.curator</groupId> 
  38.     <artifactId>curator-framework</artifactId> 
  39.     <version>4.2.0</version> 
  40. </dependency> 
  41. <dependency> 
  42.     <groupId>org.apache.curator</groupId> 
  43.     <artifactId>curator-recipes</artifactId> 
  44.     <version>4.2.0</version> 
  45. </dependency> 

溫馨提示:小編在搭建環(huán)境的時候,發(fā)現(xiàn)一個坑,工程中依賴的zookeeper版本與服務(wù)器的版本,需要盡量一致,例如,本例中zookeeper服務(wù)器的版本是3.4.14,那么在依賴zookeeper文件庫的時候,也盡量保持一致,如果依賴3.5.x版本的zookeeper,項目在啟動的時候會各種妖魔鬼怪的報錯!

5.3、創(chuàng)建用戶中心項目

在 IDEA 中,創(chuàng)建dianshang-user子模塊,并依賴dianshang-common模塊

  1. <dependencies> 
  2.     <dependency> 
  3.         <groupId>org.project.demo</groupId> 
  4.         <artifactId>dianshang-common</artifactId> 
  5.         <version>1.0.0</version> 
  6.     </dependency> 
  7. </dependencies> 

同時,創(chuàng)建dianshang-user-provider和dianshang-user-api模塊。

  • dianshang-user-api:主要對其他服務(wù)提供接口暴露
  • dianshang-user-provider:類似一個web工程,主要負(fù)責(zé)基礎(chǔ)業(yè)務(wù)的crud,同時依賴dianshang-user-api模塊

5.3.1、配置dubbo服務(wù)

在dianshang-user-provider的application.yml文件中配置dubbo服務(wù),如下:

  1. #用戶中心服務(wù)端口 
  2. server: 
  3.   port: 8080 
  4. #數(shù)據(jù)源配置 
  5. spring: 
  6.   datasource: 
  7.     druid: 
  8.       driver-class-name: com.mysql.cj.jdbc.Driver 
  9.       url: "jdbc:mysql://localhost:3306/dianshang-user" 
  10.       username: root 
  11.       password: 111111 
  12. #dubbo配置 
  13. dubbo: 
  14.   scan: 
  15.     # 包名根據(jù)自己的實際情況寫 
  16.     base-packages: org.project.dianshang.user 
  17.   protocol: 
  18.     port: 20880 
  19.     name: dubbo 
  20.   registry: 
  21.     #zookeeper注冊中心地址 
  22.     address: zookeeper://192.168.0.107:2181 

5.3.2、編寫服務(wù)暴露接口以及實現(xiàn)類

在dianshang-user-api模塊中,創(chuàng)建一個UserApi接口,以及返回參數(shù)對象UserVo!

  1. public interface UserApi { 
  2.  
  3.     /** 
  4.      * 查詢用戶信息 
  5.      * @param userId 
  6.      * @return 
  7.      */ 
  8.     UserVo findUserById(String userId); 

其中UserVo,需要實現(xiàn)序列化,如下:

  1. @Data 
  2. @EqualsAndHashCode(callSuper = false
  3. @Accessors(chain = true
  4. public class UserVo implements Serializable { 
  5.  
  6.     private static final long serialVersionUID = 1L; 
  7.  
  8.     /** 
  9.      * 用戶ID 
  10.      */ 
  11.     private String userId; 
  12.  
  13.     /** 
  14.      * 用戶中文名 
  15.      */ 
  16.     private String userName; 

在dianshang-user-provider模塊中,編寫UserApi接口實現(xiàn)類,如下:

  1. @Service(interfaceClass =UserApi.class) 
  2. @Component 
  3. public class UserProvider implements UserApi { 
  4.  
  5.     @Autowired 
  6.     private UserService userService; 
  7.  
  8.     @Override 
  9.     public UserVo findUserById(String userId) { 
  10.         QueryWrapper<User> queryWrapper = new QueryWrapper<User>(); 
  11.         queryWrapper.eq("user_id",userId); 
  12.         User source = userService.getOne(queryWrapper); 
  13.         if(source != null){ 
  14.             UserVo vo = new UserVo(); 
  15.             BeanUtils.copyProperties(source,vo); 
  16.             return vo; 
  17.         } 
  18.         return null
  19.     } 

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

接著,我們繼續(xù)創(chuàng)建商品中心項目!

5.4、創(chuàng)建商品中心項目

與用戶中心項目類似,在 IDEA 中,創(chuàng)建dianshang-platform子模塊,并依賴dianshang-common模塊

  1. <dependencies> 
  2.     <dependency> 
  3.         <groupId>org.project.demo</groupId> 
  4.         <artifactId>dianshang-common</artifactId> 
  5.         <version>1.0.0</version> 
  6.     </dependency> 
  7. </dependencies> 

同時,創(chuàng)建dianshang-platform-provider和dianshang-platform-api模塊。

  • dianshang-platform-api:主要對其他服務(wù)提供接口暴露
  • dianshang-platform-provider:類似一個web工程,主要負(fù)責(zé)基礎(chǔ)業(yè)務(wù)的crud,同時依賴dianshang-platform-api模塊

5.4.1、配置dubbo服務(wù)

在dianshang-platform-provider的application.yml文件中配置dubbo服務(wù),如下:

  1. #用戶中心服務(wù)端口 
  2. server: 
  3.   port: 8081 
  4. #數(shù)據(jù)源配置 
  5. spring: 
  6.   datasource: 
  7.     druid: 
  8.       driver-class-name: com.mysql.cj.jdbc.Driver 
  9.       url: "jdbc:mysql://localhost:3306/dianshang-platform" 
  10.       username: root 
  11.       password: 111111 
  12. #dubbo配置 
  13. dubbo: 
  14.   scan: 
  15.     # 包名根據(jù)自己的實際情況寫 
  16.     base-packages: org.project.dianshang.platform 
  17.   protocol: 
  18.     port: 20881 
  19.     name: dubbo 
  20.   registry: 
  21.     #zookeeper注冊中心地址 
  22.     address: zookeeper://192.168.0.107:2181 

5.4.2、編寫服務(wù)暴露接口以及實現(xiàn)類

在dianshang-platform-api模塊中,創(chuàng)建一個ProductApi接口,以及返回參數(shù)對象ProductVo!

  1. public interface ProductApi { 
  2.  
  3.     /** 
  4.      * 通過商品ID,查詢商品信息 
  5.      * @param productId 
  6.      * @return 
  7.      */ 
  8.     ProductVo queryProductInfoById(String productId); 

其中ProductVo,需要實現(xiàn)序列化,如下:

  1. @Data 
  2. @EqualsAndHashCode(callSuper = false
  3. @Accessors(chain = true
  4. public class ProductVo implements Serializable { 
  5.  
  6.     private static final long serialVersionUID = 1L; 
  7.  
  8.     /**商品ID*/ 
  9.     private String productId; 
  10.  
  11.     /**商品名稱*/ 
  12.     private String productName; 
  13.  
  14.     /**商品價格*/ 
  15.     private BigDecimal productPrice; 

在dianshang-platform-provider模塊中,編寫ProductApi接口實現(xiàn)類,如下:

  1. @Service(interfaceClass = ProductApi.class) 
  2. @Component 
  3. public class ProductProvider implements ProductApi { 
  4.  
  5.     @Autowired 
  6.     private ProductService productService; 
  7.  
  8.     @Override 
  9.     public ProductVo queryProductInfoById(String productId) { 
  10.         //通過商品ID查詢信息 
  11.         Product source = productService.getById(productId); 
  12.         if(source != null){ 
  13.             ProductVo vo = new ProductVo(); 
  14.             BeanUtils.copyProperties(source,vo); 
  15.             return vo; 
  16.         } 
  17.         return null
  18.     } 

接著,我們繼續(xù)創(chuàng)建訂單中心項目!

5.5、創(chuàng)建訂單中心項目

與商品中心項目類似,在 IDEA 中,創(chuàng)建dianshang-business子模塊,并依賴dianshang-common模塊

  1. <dependencies> 
  2.     <dependency> 
  3.         <groupId>org.project.demo</groupId> 
  4.         <artifactId>dianshang-common</artifactId> 
  5.         <version>1.0.0</version> 
  6.     </dependency> 
  7. </dependencies> 

同時,創(chuàng)建dianshang-business-provider和dianshang-business-api模塊。

  • dianshang-business-api:主要對其他服務(wù)提供接口暴露
  • dianshang-business-provider:類似一個web工程,主要負(fù)責(zé)基礎(chǔ)業(yè)務(wù)的crud,同時依賴dianshang-business-api模塊

5.5.1、配置dubbo服務(wù)

在dianshang-business-provider的application.yml文件中配置dubbo服務(wù),如下:

  1. #用戶中心服務(wù)端口 
  2. server: 
  3.   port: 8082 
  4. #數(shù)據(jù)源配置 
  5. spring: 
  6.   datasource: 
  7.     druid: 
  8.       driver-class-name: com.mysql.cj.jdbc.Driver 
  9.       url: "jdbc:mysql://localhost:3306/dianshang-business" 
  10.       username: root 
  11.       password: 111111 
  12. #dubbo配置 
  13. dubbo: 
  14.   scan: 
  15.     # 包名根據(jù)自己的實際情況寫 
  16.     base-packages: org.project.dianshang.business 
  17.   protocol: 
  18.     port: 20882 
  19.     name: dubbo 
  20.   registry: 
  21.     #zookeeper注冊中心地址 
  22.     address: zookeeper://192.168.0.107:2181 

5.5.2、編寫服務(wù)暴露接口以及實現(xiàn)類

在dianshang-business-api模塊中,創(chuàng)建一個OrderApi接口,以及返回參數(shù)對象OrderVo!

  1. public interface OrderApi { 
  2.  
  3.     /** 
  4.      * 通過用戶ID,查詢用戶訂單信息 
  5.      * @param userId 
  6.      * @return 
  7.      */ 
  8.     List<OrderVo> queryOrderByUserId(String userId); 

其中OrderVo,需要實現(xiàn)序列化,如下:

  1. @Data 
  2. @EqualsAndHashCode(callSuper = false
  3. @Accessors(chain = true
  4. public class OrderVo implements Serializable { 
  5.  
  6.     private static final long serialVersionUID = 1L; 
  7.  
  8.     /**訂單ID*/ 
  9.     private String orderId; 
  10.  
  11.     /**訂單編號*/ 
  12.     private String orderNo; 
  13.  
  14.     /**訂單金額*/ 
  15.     private BigDecimal orderPrice; 
  16.  
  17.     /**下單時間*/ 
  18.     private Date orderTime; 

在dianshang-business-provider模塊中,編寫OrderApi接口實現(xiàn)類,如下:

  1. @Service(interfaceClass = OrderApi.class) 
  2. @Component 
  3. public class OrderProvider implements OrderApi { 
  4.  
  5.     @Autowired 
  6.     private OrderService orderService; 
  7.  
  8.     @Override 
  9.     public List<OrderVo> queryOrderByUserId(String userId) { 
  10.         QueryWrapper<Order> queryWrapper = new QueryWrapper<Order>(); 
  11.         queryWrapper.eq("user_id",userId); 
  12.         List<Order> sourceList = orderService.list(queryWrapper); 
  13.         if(!CollectionUtils.isEmpty(sourceList)){ 
  14.             List<OrderVo> voList = new ArrayList<>(); 
  15.             for (Order order : sourceList) { 
  16.                 OrderVo vo = new OrderVo(); 
  17.                 BeanUtils.copyProperties(order, vo); 
  18.                 voList.add(vo); 
  19.             } 
  20.             return voList; 
  21.         } 
  22.         return null
  23.     } 

至此,3個項目的服務(wù)暴露接口已經(jīng)開發(fā)完成!接下來我們來編寫怎么進(jìn)行遠(yuǎn)程調(diào)用!

5.6、遠(yuǎn)程調(diào)用

5.6.1、編寫創(chuàng)建訂單服務(wù)

在dianshang-business-provider模塊中,編寫創(chuàng)建訂單接口之前,先依賴dianshang-business-api和dianshang-user-api,如下:

  1. <!--商品服務(wù)接口暴露 api--> 
  2. <dependency> 
  3.     <groupId>org.project.demo</groupId> 
  4.     <artifactId>dianshang-platform-api</artifactId> 
  5.     <version>1.0.0</version> 
  6. </dependency> 
  7. <!--用戶服務(wù)接口暴露 api--> 
  8. <dependency> 
  9.     <groupId>org.project.demo</groupId> 
  10.     <artifactId>dianshang-user-api</artifactId> 
  11.     <version>1.0.0</version> 
  12. </dependency> 

在dianshang-business-provider模塊中,編寫創(chuàng)建訂單服務(wù),如下:

  1. @RestController 
  2. @RequestMapping("/order"
  3. public class OrderController { 
  4.  
  5.     @Autowired 
  6.     private OrderService orderService; 
  7.  
  8.     @Autowired 
  9.     private OrderDetailService orderDetailService; 
  10.  
  11.     @Reference(check =false
  12.     private ProductApi productApi; 
  13.  
  14.     @Reference(check =false
  15.     private UserApi userApi; 
  16.  
  17.     /** 
  18.      * 新增 
  19.      */ 
  20.     @JwtIgnore 
  21.     @RequestMapping(value = "/add"
  22.     public boolean add(String productId,String userId){ 
  23.         LocalAssert.isStringEmpty(productId,"產(chǎn)品Id不能為空"); 
  24.         LocalAssert.isStringEmpty(userId,"用戶Id不能為空"); 
  25.         ProductVo productVo = productApi.queryProductInfoById(productId); 
  26.         LocalAssert.isObjectEmpty(productVo,"未查詢到產(chǎn)品信息"); 
  27.         UserVo userVo = userApi.findUserById(userId); 
  28.         LocalAssert.isObjectEmpty(userVo,"未查詢到用戶信息"); 
  29.         Order order = new Order(); 
  30.         order.setOrderId(IdGenerator.uuid()); 
  31.         order.setOrderNo(System.currentTimeMillis() + ""); 
  32.         order.setOrderPrice(productVo.getProductPrice()); 
  33.         order.setUserId(userId); 
  34.         order.setOrderTime(new Date()); 
  35.         orderService.save(order); 
  36.  
  37.         OrderDetail orderDetail = new OrderDetail(); 
  38.         orderDetail.setOrderDetailId(IdGenerator.uuid()); 
  39.         orderDetail.setOrderId(order.getOrderId()); 
  40.         orderDetail.setProductId(productId); 
  41.         orderDetail.setSort(1); 
  42.         orderDetailService.save(orderDetail); 
  43.         return true
  44.     } 

其中的@Reference注解,是屬于org.apache.dubbo.config.annotation.Reference下的注解,表示遠(yuǎn)程依賴服務(wù)。

參數(shù)check =false表示啟動服務(wù)時,不做遠(yuǎn)程服務(wù)狀態(tài)檢查,這樣設(shè)置的目的就是為了防止當(dāng)前服務(wù)啟動不了,例如用戶中心項目沒有啟動成功,但是訂單中心又依賴了用戶中心,如果check=true,此時訂單中心啟動會報錯!

5.6.2、編寫用戶查詢自己的訂單信息

同樣的,在dianshang-user-provider模塊中,編寫用戶查詢自己的訂單信息接口之前,先依賴dianshang-business-api和dianshang-user-api,如下:

  1. <dependency> 
  2.     <groupId>org.project.demo</groupId> 
  3.     <artifactId>dianshang-business-api</artifactId> 
  4.     <version>1.0.0</version> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>org.project.demo</groupId> 
  8.     <artifactId>dianshang-user-api</artifactId> 
  9.     <version>1.0.0</version> 
  10. </dependency> 

在dianshang-user-provider模塊中,編寫用戶查詢自己的訂單信息接口,如下:

  1. @RestController 
  2. @RequestMapping("/user"
  3. public class UserController { 
  4.  
  5.     @Reference(check =false
  6.     private OrderApi orderApi; 
  7.  
  8.  
  9.     /** 
  10.      * 通過用戶ID,查詢訂單信息 
  11.      * @param userId 
  12.      * @return 
  13.      */ 
  14.     @RequestMapping("/list"
  15.     public List<OrderVo> queryOrderByUserId(String userId){ 
  16.         return orderApi.queryOrderByUserId(userId); 
  17.     } 

至此,遠(yuǎn)程服務(wù)調(diào)用,編寫完成!

六、服務(wù)測試

在將項目部署在服務(wù)器之前,咱們先本地測試一下,看服務(wù)是否都可以跑通?

  • 啟動用戶中心dianshang-user-provider

  • 繼續(xù)啟動商品中心dianshang-platform-provider

接著啟動訂單中心dianshang-business-provider

最后,我們來測試一下服務(wù)接口是否為我們預(yù)期的結(jié)果?

打開瀏覽器,輸入http://127.0.0.1:8082/order/add?productId=1&userId=1測試創(chuàng)建訂單接口,頁面運行結(jié)果顯示正常!

我們再來看看數(shù)據(jù)庫,訂單是否生成?

ok!很清晰的看到,數(shù)據(jù)已經(jīng)進(jìn)去了,沒啥問題!

我們再來測試一下在用戶中心訂單查詢接口,輸入http://127.0.0.1:8080/user/list?userId=1,頁面運行結(jié)果如下!

到此,本地服務(wù)測試基本通過!

七、服務(wù)器部署

在上文中,我們介紹了服務(wù)的構(gòu)建、開發(fā)和測試,那如何在服務(wù)器端部署呢?

首先,修改各個項目的application.yml文件,將其中的數(shù)據(jù)源地址、dubbo注冊中心地址修改為線上能聯(lián)通的地址,然后在dianshang目錄下使用maven工具對整個工程執(zhí)行如下命令進(jìn)行打包!

  1. mvn clean install 

也可以在 IDEA 環(huán)境下,通過maven配置clean install命令執(zhí)行打包。

將各個項目target目錄下的dianshang-user-provider.jar、dianshang-platform-provider.jar、dianshang-business-provider.jar拷貝出來。

分別上傳到對應(yīng)的服務(wù)器目錄,本服務(wù)器采用的是 CentOS7,總共4臺服務(wù)器,其中一臺部署zookeeper,另外三臺部署三個微服務(wù)項目。

登錄服務(wù)器,輸入如下命令,確保JDK已經(jīng)安裝完成!

  1. java -version 

關(guān)閉所有服務(wù)器的防火墻,放行端口訪問!

  1. #關(guān)閉防火墻 
  2. systemctl stop firewalld.service 
  3.  
  4. #禁止開機啟動 
  5. systemctl disable firewalld.service 
  • 啟動用戶中心服務(wù),日志信息輸出到service.log(虛擬機ip:192.168.0.108)
  1. nohup java -jar  dianshang-user-provider.jar > service.log 2>&1 & 
  • 啟動商品中心服務(wù),日志信息輸出到service.log(虛擬機ip:192.168.0.107)
  1. nohup java -jar  dianshang-platform-provider.jar > service.log 2>&1 & 
  • 啟動訂單中心服務(wù),日志信息輸出到service.log(虛擬機ip:192.168.0.109)
  1. nohup java -jar  dianshang-business-provider.jar > service.log 2>&1 & 

打開瀏覽器,輸入http://192.168.0.109:8082/order/add?productId=1&userId=1測試創(chuàng)建訂單接口,頁面運行結(jié)果顯示正常!

我們再來測試一下在用戶中心訂單查詢接口,輸入輸入http://192.168.0.108:8080/user/list?userId=1,頁面運行結(jié)果如下!

很清晰的看到,輸出了2條信息,第二條訂單是在測試環(huán)境服務(wù)器生成的,第一條是本地開發(fā)環(huán)境生成的。

到此,服務(wù)器部署基本已經(jīng)完成!

如果是生產(chǎn)環(huán)境,可能就需要多臺zookeeper來保證高可用,至少2臺服務(wù)器來部署業(yè)務(wù)服務(wù),通過負(fù)載均衡來路由!

八、總結(jié)

整片文章比較長,主要是圍繞 springboot + dubbo 的整合,通過注解開發(fā)實現(xiàn)遠(yuǎn)程服務(wù)調(diào)用像傳統(tǒng)的 springmvc 開發(fā)一樣輕松,當(dāng)然還可以通過xml配置方式實現(xiàn)dubbo服務(wù)的調(diào)用,這個會在后期去介紹。

同時也介紹了服務(wù)器的部署,從中可以看出,開發(fā)雖然簡單,但是由于分布式部署,如何保證服務(wù)高可用成了開發(fā)人員頭等工作任務(wù),所以,分布式微服務(wù)開發(fā)雖然開發(fā)簡單,但是如何確保部署的服務(wù)高可用?運維方面會帶來不少的挑戰(zhàn)!

九、參考

1、apache - dubbo - 官方文檔

 

責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2019-07-18 12:41:52

數(shù)字化服務(wù)網(wǎng)格微服務(wù)

2020-05-18 14:00:01

Dubbo分布式架構(gòu)

2023-09-25 08:00:00

架構(gòu)微服務(wù)

2023-11-01 08:00:00

負(fù)載均衡架構(gòu)開發(fā)

2018-03-02 16:11:29

Spring Clou分布式服務(wù)跟蹤

2025-04-11 02:30:00

2018-04-18 16:07:49

Spring Clou微服務(wù)分布式

2018-04-16 14:56:56

微服務(wù)架構(gòu)分布式服務(wù)

2018-04-09 13:56:13

微服務(wù)架構(gòu)分布式

2018-04-02 15:01:31

微服務(wù)架構(gòu)分布式服務(wù)

2018-03-13 16:42:26

分布式服務(wù)跟蹤

2017-07-28 16:41:53

Spring Clou微服務(wù)架構(gòu)

2020-02-25 23:39:11

架構(gòu)運維技術(shù)

2018-05-23 15:58:27

Spring Clou微服務(wù)架構(gòu)

2023-08-25 16:26:49

微服務(wù)架構(gòu)

2018-07-19 14:58:14

Spring Clou微服務(wù)架構(gòu)

2017-03-02 13:19:43

dubbo分布式框架

2015-07-21 16:23:22

Node.js構(gòu)建分布式

2022-09-19 07:03:12

SPI開源開發(fā)者

2019-08-07 10:44:28

MySQLGoogle
點贊
收藏

51CTO技術(shù)棧公眾號

成年人在线观看| 青青青在线免费观看| 奇米777日韩| 国产精品久久免费看| 亚洲直播在线一区| 久久久国产精品成人免费| 欧美综合一区| 亚洲电影免费观看高清完整版在线观看| 免费无码不卡视频在线观看| 午夜视频在线观看网站| 波多野结衣视频一区| 国产精品成人一区二区| 免费一级全黄少妇性色生活片| 在线成人动漫av| 欧美一区二区三区免费在线看| 欧美三级一级片| gogo在线观看| 国产三级久久久| 国产日韩在线一区二区三区| 在线观看毛片av| 亚洲专区一区二区三区| 欧美久久久精品| 亚洲午夜精品久久久久久高潮 | 国产精品久久久久久久久借妻| 五月天丁香激情| 成人写真视频| 亚洲免费精彩视频| 国产精品一区二区无码对白| 国产精品99| 91福利在线观看| 日本韩国欧美在线观看| 影院在线观看全集免费观看| 欧美国产精品一区二区三区| 黄色99视频| 亚洲欧美高清视频| 国产精品一级在线| 国产在线观看一区二区三区| 激情网站在线观看| 亚洲影音先锋| 777777777亚洲妇女| 精品爆乳一区二区三区无码av| 日韩理论在线| 一本色道久久综合亚洲精品小说| 无码人妻aⅴ一区二区三区| 91成人福利| 日韩区在线观看| 亚洲精品乱码久久久久久动漫| av成人在线观看| 在线观看视频91| 人妻有码中文字幕| 波多野结衣亚洲| 欧美性猛交xxxx乱大交极品| 成年人午夜免费视频| 国产精品一区hongkong| 一区二区三区中文在线观看| 丰满人妻一区二区三区53号| 成人午夜在线影视| 一区二区三区在线观看网站| 大地资源网在线观看免费官网| 伊人手机在线| 亚洲国产精品一区二区www| 日本a在线天堂| 男插女视频久久久| 五月天婷婷综合| 欧美女人性生活视频| 中国色在线日|韩| 欧美视频二区36p| 日韩欧美精品在线观看视频| 亚洲精品国产嫩草在线观看| 欧美三级资源在线| 三级av免费看| 粉嫩的18在线观看极品精品| 日韩成人激情视频| 国产精品国产三级国产专业不| 欧美中文字幕一区二区| 久久影院资源网| 日本一区二区网站| 久久综合网络一区二区| 国产啪精品视频| 国内毛片毛片毛片毛片| 97精品久久久久中文字幕| 欧美日韩一区在线视频| 亚乱亚乱亚洲乱妇| 亚洲午夜一区二区| 成人一级片网站| 精品三级在线| 亚洲国产美女久久久久| 少妇人妻好深好紧精品无码| 亚洲国产精品成人| 91精品国产91久久久久久| 青青视频在线免费观看| 国产一区在线观看视频| 精品日本一区二区三区| 最新97超碰在线| 偷拍与自拍一区| xxww在线观看| 台湾佬综合网| 久青草国产97香蕉在线视频| 精品欧美一区二区三区免费观看| 蜜臀a∨国产成人精品| 国产精品久久国产精品| 国产黄色在线播放| 亚洲午夜免费电影| 在线观看免费的av| 欧美三级午夜理伦三级在线观看 | 精品一区久久久| 欧美人xxx| 日韩欧亚中文在线| 日本成人在线免费观看| 精品国产a一区二区三区v免费| 美日韩精品免费视频| 国产精品视频一区在线观看| 国产在线精品视频| 天堂资源在线亚洲视频| 理论片午夜视频在线观看| 91精品在线一区二区| 国产肥白大熟妇bbbb视频| 国内精品久久久久久久影视蜜臀| 国产精品高潮呻吟久久av黑人| 国产自产一区二区| 日韩理论片在线| 欧美伦理视频在线观看| 亚洲**毛片| 久久九九国产精品怡红院| 免费看一级视频| 成人av免费网站| 中文字幕在线乱| 欧美激情不卡| 一区二区三区动漫| www.久久久久久久| 2020国产精品久久精品美国| 国产精品久久久久9999爆乳| 久久三级中文| 美女啪啪无遮挡免费久久网站| 最近中文字幕在线观看视频| 久久久久久久久久看片| 日韩av综合在线观看| 18国产精品| 久久久久久久久久久人体| av中文字幕免费在线观看| 国产精品久久三| 亚洲综合婷婷久久| 99久久久久久中文字幕一区| 国产精品自拍偷拍| 在线日本视频| 在线成人高清不卡| 国产乱子轮xxx农村| 蜜桃传媒麻豆第一区在线观看| 日韩免费中文专区| 99久久er| 久久色在线播放| 国产v片在线观看| 艳妇臀荡乳欲伦亚洲一区| 久久国产免费视频| 日韩午夜高潮| 秋霞久久久久久一区二区| 日本精品在线一区| 爽爽爽爽爽爽爽成人免费观看| 羞羞色院91蜜桃| 国产精品久久久久一区| 亚洲一级片av| 精品电影一区| 欧美美乳视频网站在线观看| 香蕉视频亚洲一级| www日韩欧美| 国产白浆在线观看| 亚洲成a人v欧美综合天堂下载| 欧美xxxxx精品| 丝袜亚洲精品中文字幕一区| 亚洲高清在线观看一区| 欧美电影在线观看一区| 亚洲91精品在线观看| 国产精品毛片一区二区三区四区| 欧美日韩国产综合视频在线观看| 国产高潮流白浆| 91免费版在线看| 天天操狠狠操夜夜操| 国产主播精品| 欧美日韩综合网| 丝袜老师办公室里做好紧好爽| 免费成人深夜夜行视频| 性欧美videos| 成人免费毛片a| 国产97人人超碰caoprom| 国产高潮国产高潮久久久91| youjizz国产精品| 欧美黄色性生活| 欧美日韩三级电影在线| 久久久久久亚洲精品不卡4k岛国 | 97在线精品| 国产精品一区二区三区在线观| 国模冰冰炮一区二区| 久久精品精品电影网| 四季av日韩精品一区| 欧美日韩一区小说| 日产精品久久久久| 国产精品日韩精品欧美在线 | 国产人久久人人人人爽| 男男受被啪到高潮自述| 日韩精品一区第一页| www国产免费| 日韩视频在线观看| 国产一区免费在线观看| 久久国产精品免费一区二区三区| 欧美一区二三区| 欧美xxxx少妇| 日韩中文字幕国产| 日本在线丨区| 精品日韩一区二区三区免费视频| 国产成人av免费| 欧美日韩国产一区二区| 欧美黑人精品一区二区不卡| 日本一区二区三区免费乱视频| 午夜剧场免费看| 韩国精品一区二区| 欧美三级理论片| 亚洲一区黄色| 精品国产av无码一区二区三区| 日韩一区三区| 日韩久久不卡| 亚洲人成网www| 国内一区二区三区在线视频| 日韩成人在线观看视频| 91久久嫩草影院一区二区| 婷婷激情一区| 欧美一区二区三区精品电影| 爱搞国产精品| 97精品国产91久久久久久| 日本一级理论片在线大全| 久久精品99国产精品酒店日本| p色视频免费在线观看| 亚洲欧美日韩高清| 日本私人网站在线观看| 亚洲国产精彩中文乱码av| www.国产视频| 日韩欧美成人激情| 国产不卡av在线播放| 日韩午夜av一区| www.色播.com| 日韩精品中文字幕一区| av免费观看网址| 日韩亚洲欧美在线| aaa一区二区| 欧美一级高清片| 亚洲第一天堂网| 亚洲成人久久久| 少妇人妻偷人精品一区二区| 精品三级在线观看| 少妇人妻一区二区| 日韩成人在线视频网站| 亚洲人视频在线观看| 日韩精品一二三四区| 亚洲人在线观看视频| 亚洲精品一区二三区不卡| 精品影院一区| 中文字幕精品av| 秋霞影院午夜丰满少妇在线视频| 色婷婷成人综合| 国内外激情在线| 欧美国产日韩xxxxx| 91www在线| 97色在线视频观看| 免费欧美电影| 成人免费黄色网| 1204国产成人精品视频| 久久国产精品一区二区三区四区 | 国产丝袜视频一区| 国产粉嫩一区二区三区在线观看| 在线性视频日韩欧美| 成人在线播放免费观看| 久久久久久综合网天天| 625成人欧美午夜电影| 国产日韩精品在线观看| 日韩精品一区二区三区中文在线| 狠狠爱一区二区三区| 奇米亚洲欧美| 日本在线视频www色| 伊人久久婷婷| 一区二区在线播放视频| 国产主播一区二区| 久久久午夜精品福利内容| 欧美激情一区二区三区| 成人免费视频网站入口::| 精品色蜜蜜精品视频在线观看| 青青国产在线视频| 日韩视频免费观看高清完整版| 午夜在线观看视频18| 深夜福利国产精品| 白浆在线视频| 成人黄色av网| 亚洲影院天堂中文av色| 公共露出暴露狂另类av| 国产亚洲毛片| 天美一区二区三区| 久久人人爽爽爽人久久久| 天天操天天操天天操天天操天天操| 亚洲国产成人高清精品| 一级特黄aaa| 日韩风俗一区 二区| 麻豆tv免费在线观看| 4k岛国日韩精品**专区| 美国十次综合久久| 青娱乐一区二区| 91久久综合| ass极品水嫩小美女ass| 国产喷白浆一区二区三区| 国产午夜激情视频| 欧美精品777| 九色国产在线观看| 97人人模人人爽人人喊中文字 | 9191久久久久久久久久久| 色综合888| 欧美精品激情blacked18| 国产乱子精品一区二区在线观看| 精品在线不卡| 午夜日韩福利| 国产一区二区在线观看免费视频| 久久免费电影网| 亚洲国产精一区二区三区性色| 欧美另类videos死尸| 蜜桃视频在线免费| 26uuu国产精品视频| 51vv免费精品视频一区二区| 亚洲精品免费在线看| 日本人妖一区二区| 粉嫩av蜜桃av蜜臀av| 亚洲不卡av一区二区三区| 亚洲国产www| 久久艳片www.17c.com | 亚洲精品国精品久久99热一| 99视频免费在线观看| 成人a视频在线观看| 视频在线不卡免费观看| 亚州精品一二三区| 国产欧美日韩中文久久| 亚洲色成人www永久网站| 日韩精品久久久久久久玫瑰园| 国产美女福利在线观看| 国产精品午夜av在线| 在线精品一区| 五月天丁香社区| 亚洲午夜精品久久久久久久久| 国产成人精品a视频| 久久在线免费观看视频| 国产麻豆一区二区三区| 国产911在线观看| 国产精品77777竹菊影视小说| 欧美黄色aaa| 亚洲成人精品视频在线观看| 激情影院在线| 精品国产乱码久久久久久郑州公司| 亚洲精华国产欧美| 性色av蜜臀av色欲av| 色婷婷国产精品| 国产裸舞福利在线视频合集| 国产精品尤物福利片在线观看| 欧美日韩在线播放视频| 免费av不卡在线| 一区二区三区在线观看网站| 六月婷婷中文字幕| 日韩**中文字幕毛片| 精品日产免费二区日产免费二区| www.99av.com| 亚洲欧美激情在线| 粉嫩小泬无遮挡久久久久久| 17婷婷久久www| 欧美午夜精品一区二区三区电影| 视色视频在线观看| 亚洲免费电影在线| 人妻夜夜爽天天爽| 热re91久久精品国99热蜜臀| 日韩精品一区二区久久| 91丨porny丨九色| 欧美色道久久88综合亚洲精品| 在线免费观看黄色网址| 不卡视频一区二区| 一本色道88久久加勒比精品| 国产不卡在线观看视频| 日韩欧美在线网站| 在线女人免费视频| 四虎影院一区二区| av一二三不卡影片| 伊人影院中文字幕| 久久久久久中文| 成人综合久久| 国产成人精品无码片区在线| 在线一区二区视频| 欧美aaaxxxx做受视频| 日韩精品一区二区三区色偷偷| 国产另类ts人妖一区二区| 五月天婷婷久久| 麻豆一区二区在线观看| 亚洲免费专区| 无码人妻丰满熟妇区毛片蜜桃精品| 日韩欧美成人网| 伊人春色在线观看| 亚洲欧洲一二三| 91网站最新网址| 国产精品自偷自拍| 国产精品99一区|