• JSD-2204-使用Idea启动Nacos-创建csmall项目-Dubbo-Day03


    1.使用Idea启动Nacos

    之前我们启动Nacos都是使用dos命令

    启动过程比较复杂,命令比较长

    Idea实际上支持我们更加方便的启动Nacos

    步骤1:

    步骤2:

    步骤3:

    配置成功之后

    Nacos就会出现在idea的启动选项中了

    这种方法实际上只是为了简便大家启动nacos的操作,还是需要掌握命令行的启动方式的!

    2.创建csmall-cart子项目

    2.1创建项目

    创建csmall-cart子项目

    父子相认

    子项目pom文件为:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>cn.tedugroupId>
    7. <artifactId>csmallartifactId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. <relativePath/>
    10. parent>
    11. <groupId>cn.tedugroupId>
    12. <artifactId>csmall-cartartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>csmall-cartname>
    15. <description>Demo project for Spring Bootdescription>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-webartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>org.mybatis.spring.bootgroupId>
    23. <artifactId>mybatis-spring-boot-starterartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>com.alibabagroupId>
    27. <artifactId>druidartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>mysqlgroupId>
    31. <artifactId>mysql-connector-javaartifactId>
    32. dependency>
    33. <dependency>
    34. <groupId>cn.tedugroupId>
    35. <artifactId>csmall-commonsartifactId>
    36. <version>0.0.1-SNAPSHOTversion>
    37. dependency>
    38. <dependency>
    39. <groupId>com.github.xiaoymingroupId>
    40. <artifactId>knife4j-spring-boot-starterartifactId>
    41. dependency>
    42. <dependency>
    43. <groupId>com.alibaba.cloudgroupId>
    44. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    45. dependency>
    46. dependencies>
    47. project>

    删除test文件夹

    删除application.properties配置文件

    创建application.yml文件,内容如下

    1. server:
    2. port: 20001
    3. #公共配置
    4. mybatis:
    5. configuration:
    6. # 禁用缓存
    7. cache-enabled: false
    8. # 配置映射驼峰命名法,数据库中user_name的字段,会映射在java的userName属性上
    9. map-underscore-to-camel-case: true
    10. # 将运行的sql语句输出到控制台
    11. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    12. knife4j:
    13. # 开启增强配置
    14. enable: true
    15. # 生产环境屏蔽,开启将禁止访问在线API文档
    16. production: false
    17. # Basic认证功能,即是否需要通过用户名、密码验证后才可以访问在线API文档
    18. basic:
    19. # 是否开启Basic认证
    20. enable: false
    21. # 用户名,如果开启Basic认证却未配置用户名与密码,默认是:admin/123321
    22. username: root
    23. # 密码
    24. password: root
    25. spring:
    26. profiles:
    27. active: dev

    2.2准备数据

    推荐大家学习使用数据库的专用可视化工具来操作数据库

    heidiSQL(安装MariaDB自带的)免费的

    SqlYog Navicat是收费的

    我们cart模块要操作数据库,首先保证要有数据

    所以我们要创建需要的表和添加表中的数据

    sql代码已经发送在csmall-finish项目的node文件夹中:csmall_db.sql

    运行其中的sql代码即可

    1. CREATE DATABASE IF NOT EXISTS `csmall_db` DEFAULT CHARACTER SET utf8mb4;
    2. USE `csmall_db`;
    3. DROP TABLE IF EXISTS `cart_tbl`;
    4. CREATE TABLE `cart_tbl` (
    5. `id` int NOT NULL AUTO_INCREMENT COMMENT '购物车id',
    6. `commodity_code` varchar(255) DEFAULT NULL COMMENT '商品编码',
    7. `price` int DEFAULT '0' COMMENT '商品单价',
    8. `count` int DEFAULT '0' COMMENT '购买数量',
    9. `user_id` varchar(255) DEFAULT NULL COMMENT '用户id',
    10. PRIMARY KEY (`id`),
    11. UNIQUE KEY `commodity_code` (`commodity_code`)
    12. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;
    13. insert into `cart_tbl`(`id`,`commodity_code`,`price`,`count`,`user_id`) values
    14. (1,'PU201',500,10,'UU100');
    15. DROP TABLE IF EXISTS `order_tbl`;
    16. CREATE TABLE `order_tbl` (
    17. `id` int NOT NULL AUTO_INCREMENT COMMENT '订单id',
    18. `user_id` varchar(255) DEFAULT NULL COMMENT '用户id',
    19. `commodity_code` varchar(255) DEFAULT NULL COMMENT '商品编码,也可以是商品id',
    20. `count` int DEFAULT '0' COMMENT '购买这个商品的数量',
    21. `money` int DEFAULT '0' COMMENT '订单金额',
    22. PRIMARY KEY (`id`)
    23. ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb3;
    24. insert into `order_tbl`(`id`,`user_id`,`commodity_code`,`count`,`money`) values
    25. (22,'UU100','PU201',10,200),
    26. (23,'UU100','PU201',10,200),
    27. (24,'UU100','PU201',10,200),
    28. (25,'UU100','PU201',10,200);
    29. DROP TABLE IF EXISTS `stock_tbl`;
    30. CREATE TABLE `stock_tbl` (
    31. `id` int NOT NULL AUTO_INCREMENT COMMENT '商品id',
    32. `commodity_code` varchar(255) DEFAULT NULL COMMENT '商品编码',
    33. `count` int DEFAULT '0' COMMENT '商品库存',
    34. PRIMARY KEY (`id`),
    35. UNIQUE KEY `commodity_code` (`commodity_code`)
    36. ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;
    37. insert into `stock_tbl`(`id`,`commodity_code`,`count`) values
    38. (1,'PU201',990);
    39. DROP TABLE IF EXISTS `undo_log`;
    40. CREATE TABLE `undo_log` (
    41. `id` bigint NOT NULL AUTO_INCREMENT,
    42. `branch_id` bigint NOT NULL,
    43. `xid` varchar(100) NOT NULL,
    44. `context` varchar(128) NOT NULL,
    45. `rollback_info` longblob NOT NULL,
    46. `log_status` int NOT NULL,
    47. `log_created` datetime NOT NULL,
    48. `log_modified` datetime NOT NULL,
    49. PRIMARY KEY (`id`),
    50. UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
    51. ) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8mb3;

    2.3配置yml文件

    application-dev.yml

    1. spring:
    2. datasource:
    3. url: jdbc:mysql://localhost:3306/csmall_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
    4. username: root
    5. password: root
    6. application:
    7. # 为当前项目起名,这个名字会被Nacos记录并使用
    8. name: nacos-cart
    9. cloud:
    10. nacos:
    11. discovery:
    12. # 配置Nacos所在的位置,用于注册时提交信息
    13. server-addr: localhost:8848
    14. ephemeral: false

    2.4Spring相关配置类

    和business项目一样

    我们需要创建config包,包中创建相关配置类

    1. @Configuration // 所有配置Spring的配置类必须添加这个注解
    2. @ComponentScan(basePackages = "cn.tedu.csmall.commons.exception")
    3. public class CommonsConfiguration {
    4. }

    knife4j配置

    1. @Configuration
    2. @EnableSwagger2WebMvc
    3. public class Knife4jConfiguration {
    4. /**
    5. * 【重要】指定Controller包路径
    6. */
    7. private String basePackage = "cn.tedu.csmall.cart.controller";
    8. /**
    9. * 分组名称
    10. */
    11. private String groupName = "base-cart";
    12. /**
    13. * 主机名
    14. */
    15. private String host = "http://java.tedu.cn";
    16. /**
    17. * 标题
    18. */
    19. private String title = "酷鲨商城项目案例在线API文档--基础cart-web实例";
    20. /**
    21. * 简介
    22. */
    23. private String description = "构建基础cart-web项目,实现购物车管理";
    24. // 略....
    25. }

    当前cart模块除了上述配置之外,还需要添加Mybatis扫描mapper包的配置

    config包中再创建一个MyBatisConfiguration类,代码如下

    1. @Configuration
    2. // Mybatis框架扫描mapper包接口的注解
    3. @MapperScan("cn.tedu.csmall.cart.mapper")
    4. public class MybatisConfiguration {
    5. }

    我们尝试启动Nacos后

    启动cart模块

    观察nacos服务列表中是否包含当前服务名称

    2.5编写cart项目业务

    cart模块能够正常启动,但是还没有任何业务

    结合我们最终生成订单的业务

    当前cart模块需要开发如下两个功能

    1.新增购物车中商品

    2.删除购物车中商品

    2.6开发持久层

    创建mapper包

    创建CartMapper接口,中编写两个方法

    一个新增购物车,一个删除购物车

    1. @Repository
    2. public interface CartMapper {
    3. // 新增购物车中商品的方法
    4. @Insert("insert into cart_tbl(commodity_code,price,count,user_id) " +
    5. "values(#{commodityCode},#{price},#{count},#{userId})")
    6. void insertCart(Cart cart);
    7. // 删除购物车
    8. @Delete("delete from cart_tbl where user_id=#{userId} and " +
    9. " commodity_code=#{commodityCode}")
    10. void deleteCartByUserIdAndCommodityCode(@Param("userId") String userId,
    11. @Param("commodityCode") String commodityCode);
    12. }

    2.7开发业务逻辑层

    创建service包

    包中创建ICartService

    接口中编写新增和删除购物车的两个业务逻辑层方法声明

    1. public interface ICartService {
    2. // 新增购物车商品的业务逻辑层方法
    3. void cartAdd(CartAddDTO cartAddDTO);
    4. // 删除购物车商品的业务逻辑层方法
    5. void deleteUserCart(String userId,String commodityCode);
    6. }

    创建impl包

    编写业务实现类

    1. @Service
    2. @Slf4j
    3. public class CartServiceImpl implements ICartService {
    4. @Autowired
    5. private CartMapper cartMapper;
    6. @Override
    7. public void cartAdd(CartAddDTO cartAddDTO) {
    8. // 当前方法参数是CartAddDTO类型,而mapper执行新增需要的类型是Cart
    9. // 所以需要将现在cartAddDTO中,所有同名属性赋值给Cart类型对象才能实现mapper调用
    10. // 先实例化一个Cart对象
    11. Cart cart=new Cart();
    12. // 利用BeanUtils工具类,将cartAddDTO同名属性赋值到cart
    13. BeanUtils.copyProperties(cartAddDTO,cart);
    14. // 调用mapper新增购物车商品的方法
    15. cartMapper.insertCart(cart);
    16. // 如果新增顺利,将新增的对象输出到日志
    17. log.info("新增购物车商品成功:{}",cart);
    18. }
    19. @Override
    20. public void deleteUserCart(String userId, String commodityCode) {
    21. // 删除功能需要userId和commodityCode,直接使用参数调用即可
    22. cartMapper.deleteCartByUserIdAndCommodityCode(userId,commodityCode);
    23. // 一切正常,日志提示
    24. log.info("购物车删除完成");
    25. }
    26. }

    如果需要设置日志输出级别

    dev的yml文件中添加

    1. logging:
    2. level:
    3. cn.tedu.csmall.cart: debug

    2.8开发控制层

    创建controller包

    包中创建CartController类

    代码如下

    1. @RestController
    2. @RequestMapping("/base/cart")
    3. @Api(tags = "购物车管理")
    4. public class CartController {
    5. @Autowired
    6. private ICartService cartService;
    7. @PostMapping("/add")
    8. @ApiOperation("新增购物车商品")
    9. public JsonResult cartAdd(CartAddDTO cartAddDTO){
    10. cartService.cartAdd(cartAddDTO);
    11. return JsonResult.ok("新增购物车商品完成!");
    12. }
    13. @PostMapping("/delete")
    14. @ApiOperation("删除购物车商品")
    15. @ApiImplicitParams({
    16. @ApiImplicitParam(value = "用户ID",name="userId",example = "UU100"),
    17. @ApiImplicitParam(value = "商品编号",name="commodityCode",example = "PC100")
    18. })
    19. public JsonResult deleteUserCart(String userId,String commodityCode){
    20. cartService.deleteUserCart(userId,commodityCode);
    21. return JsonResult.ok("删除购物车商品完成!");
    22. }
    23. }

    重启Cart模块

    测试localhost:20001/doc.html

    发送新增购物车的请求测试

    然后测试删除购物车的功能

    2.9创建Order模块

    2.9.1创建项目

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>cn.tedugroupId>
    7. <artifactId>csmallartifactId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. <relativePath/>
    10. parent>
    11. <groupId>cn.tedugroupId>
    12. <artifactId>csmall-orderartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>csmall-ordername>
    15. <description>Demo project for Spring Bootdescription>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-webartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>org.mybatis.spring.bootgroupId>
    23. <artifactId>mybatis-spring-boot-starterartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>com.alibabagroupId>
    27. <artifactId>druidartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>mysqlgroupId>
    31. <artifactId>mysql-connector-javaartifactId>
    32. dependency>
    33. <dependency>
    34. <groupId>cn.tedugroupId>
    35. <artifactId>csmall-commonsartifactId>
    36. <version>0.0.1-SNAPSHOTversion>
    37. dependency>
    38. <dependency>
    39. <groupId>com.github.xiaoymingroupId>
    40. <artifactId>knife4j-spring-boot-starterartifactId>
    41. dependency>
    42. <dependency>
    43. <groupId>com.alibaba.cloudgroupId>
    44. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    45. dependency>
    46. dependencies>
    47. project>

    删除test文件夹

    删除application.properties文件

    可以将cart模块的application.yml文件和application-dev.yml复制过来

    但是要修改需要变化的属性

    application.yml端口号修改

    1. server:
    2. port: 20002

    application-dev.yml修改项目名称

    1. application:
    2. name: nacos-order

    2.9.2config配置

    直接复制cart模块的config包到当前order模块即可

    修改内容如下

    knife4j配置主要修改:

    1. /**
    2. * 【重要】指定Controller包路径
    3. */
    4. private String basePackage = "cn.tedu.csmall.order.controller";
    5. /**
    6. * 分组名称
    7. */
    8. private String groupName = "base-order";
    9. /**
    10. * 主机名
    11. */
    12. private String host = "http://java.tedu.cn";
    13. /**
    14. * 标题
    15. */
    16. private String title = "酷鲨商城项目案例在线API文档--基础order-web实例";
    17. /**
    18. * 简介
    19. */
    20. private String description = "构建基础order-web项目,实现订单管理";

    Mybatis配置修改如下

    1. @Configuration
    2. // Mybatis框架扫描mapper包接口的注解
    3. @MapperScan("cn.tedu.csmall.order.mapper")
    4. public class MybatisConfiguration {
    5. }

    2.10编写新增订单功能

    2.10.1开发持久层

    创建mapper包

    创建OrderMapper接口

    添加新增订单方法

    1. @Repository
    2. public interface OrderMapper {
    3. // 新增订单的方法
    4. @Insert("insert into order_tbl(user_id,commodity_code,count,money) " +
    5. "values(#{userId},#{commodityCode},#{count},#{money})")
    6. void insertOrder(Order order);
    7. }

    2.10.2开发业务逻辑层

    创建service包

    包中创建IOrderService

    1. public interface IOrderService {
    2. // 声明新增订单的方法
    3. void orderAdd(OrderAddDTO orderAddDTO);
    4. }

    创建service.impl包

    包中创建OrderServiceImpl

    1. @Service
    2. @Slf4j
    3. public class OrderServiceImpl implements IOrderService {
    4. @Autowired
    5. private OrderMapper orderMapper;
    6. @Override
    7. public void orderAdd(OrderAddDTO orderAddDTO) {
    8. // 1.减少订单中商品的库存数(要调用stock模块的方法)
    9. // 2.删除订单中选中的购物车的商品(要调用cart模块的方法)
    10. // 3.执行将orderAddDTO中的信息新增到订单表中的功能
    11. // 实例化一个Order对象
    12. Order order=new Order();
    13. BeanUtils.copyProperties(orderAddDTO,order);
    14. // 执行新增
    15. orderMapper.insertOrder(order);
    16. log.info("新增的订单信息为{}",order);
    17. }
    18. }

    2.10.3开发控制层

    创建controller包

    创建OrderController类

    1. @RestController
    2. @RequestMapping("/base/order")
    3. @Api(tags = "订单管理")
    4. public class OrderController {
    5. @Autowired
    6. private IOrderService orderService;
    7. @ApiOperation("新增订单")
    8. @PostMapping("/add")
    9. public JsonResult orderAdd(OrderAddDTO orderAddDTO){
    10. // 调用业务逻辑层
    11. orderService.orderAdd(orderAddDTO);
    12. return JsonResult.ok("新增订单完成!");
    13. }
    14. }

    启动order项目

    检查nacos注册状态和knife4j测试新增订单效果

    先启动nacos再启动order

    2.11创建stock模块

    2.11.1项目搭建

    创建csmall-stock

    修改父项目pom文件,父子相认

    子项目pom文件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>cn.tedugroupId>
    7. <artifactId>csmallartifactId>
    8. <version>0.0.1-SNAPSHOTversion>
    9. <relativePath/>
    10. parent>
    11. <groupId>cn.tedugroupId>
    12. <artifactId>csmall-stockartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>csmall-stockname>
    15. <description>Demo project for Spring Bootdescription>
    16. <dependencies>
    17. <dependency>
    18. <groupId>org.springframework.bootgroupId>
    19. <artifactId>spring-boot-starter-webartifactId>
    20. dependency>
    21. <dependency>
    22. <groupId>org.mybatis.spring.bootgroupId>
    23. <artifactId>mybatis-spring-boot-starterartifactId>
    24. dependency>
    25. <dependency>
    26. <groupId>com.alibabagroupId>
    27. <artifactId>druidartifactId>
    28. dependency>
    29. <dependency>
    30. <groupId>mysqlgroupId>
    31. <artifactId>mysql-connector-javaartifactId>
    32. dependency>
    33. <dependency>
    34. <groupId>cn.tedugroupId>
    35. <artifactId>csmall-commonsartifactId>
    36. <version>0.0.1-SNAPSHOTversion>
    37. dependency>
    38. <dependency>
    39. <groupId>com.github.xiaoymingroupId>
    40. <artifactId>knife4j-spring-boot-starterartifactId>
    41. dependency>
    42. <dependency>
    43. <groupId>com.alibaba.cloudgroupId>
    44. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    45. dependency>
    46. dependencies>
    47. project>

    删除test测试文件夹

    删除application.properties文件

    复制order\cart模块的application.yml和application-dev.yml文件

    修改端口号和项目名称

    2.11.2config配置

    从order\cart模块复制config包

    修改MybatisConfiguration\Knife4jConfiguration对应的包名

    2.12编写减少库存功能

    2.12.1开发持久层

    1. UPDATE stock_tbl SET COUNT=COUNT-10
    2. WHERE commodity_code='PC100' AND COUNT>=10

    mapper包下StockMapper

    1. @Repository
    2. public interface StockMapper {
    3. // 修改(减少)指定商品库存数的方法
    4. @Update("UPDATE stock_tbl SET COUNT=COUNT-#{reduceCount} " +
    5. " WHERE commodity_code=#{commodityCode} AND COUNT>=#{reduceCount}")
    6. void updateStockByCommodityCode(@Param("commodityCode") String commodityCode,
    7. @Param("reduceCount") Integer reduceCount);
    8. }

    2.12.2开发业务层

    在service包下创建IStockService

    1. public interface IStockService {
    2. // 减少库存数的业务逻辑层方法
    3. void reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO);
    4. }

    service.impl包下创建StockServiceImpl

    1. @Service
    2. @Slf4j
    3. public class StockServiceImpl implements IStockService {
    4. @Autowired
    5. private StockMapper stockMapper;
    6. @Override
    7. public void reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO) {
    8. // 调用stockMapper减少库存数的方法
    9. // 参数1:商品编号
    10. // 参数2:减少的库存数
    11. stockMapper.updateStockByCommodityCode(
    12. stockReduceCountDTO.getCommodityCode(),
    13. stockReduceCountDTO.getReduceCount());
    14. log.info("库存减少已执行");
    15. }
    16. }

    2.12.3开发控制层

    controller包

    StockController类

    1. @RestController
    2. @RequestMapping("/base/stock")
    3. @Api(tags = "库存管理")
    4. public class StockController {
    5. @Autowired
    6. private IStockService stockService;
    7. @PostMapping("/reduce/count")
    8. @ApiOperation("减少商品库存数")
    9. public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
    10. // 调用业务逻辑层
    11. stockService.reduceCommodityCount(stockReduceCountDTO);
    12. return JsonResult.ok("库存减少已执行!");
    13. }
    14. }

    启动服务测试成功即可

    3.Dubbo概述

    3.1什么是RPC

    RPC是Remote Procedure Call的缩写 翻译为:远程过程调用

    目标是为了实现两台(多台)计算机\服务器,相互调用方法\通信的解决方案

    RPC只是实现远程调用的一套标准

    该标准主要规定了两部分内容

    1.通信协议

    2.序列化协议

    为了方便大家理解RPC,下面的图片帮助理解

    上面图是老婆和老公在家的时,老婆让老公洗碗的调用流程

    这个流程可以理解为项目内的功能的调用,类似面向对象编程实例化对象,调用方法的过程

    但是这个调用关系如果是远程的,意思是老婆和老公现在是两个不同的项目

    我们看到上图中,远程调用必须借助一个通信设备,图片中是手机

    3.1.1通信协议

    通信协议指的就是远程调用的通信方式

    实际上这个通知的方式可以有多种

    例如:写信,飞鸽传书,闪送等等

    在程序中,通信方式也有多种

    3.1.2序列化协议

    序列化协议指通信内容的格式,双方都要理解这个格式

    上面的图片中,老婆给老公发信息,一定是双方都能理解的信息

    发送信息是序列化过程,接收信息需要反序列化

    程序中,序列化的方式也是多种的

    3.2什么是Dubbo

    上面对RPC有基本认识之后,再学习Dubbo就简单了

    Dubbo是一套RPC框架。既然是框架,我们可以在框架结构高度,定义Dubbo中使用的通信协议,使用的序列化框架技术,而数据格式由Dubbo定义,我们负责配置之后直接通过客户端调用服务端代码。

    可以说Dubbo就是RPC概念的实现

    Dubbo是SpringCloudAlibaba提供的框架

    能够实现微服务相互调用的功能!

    3.3Dubbo的发展历程

    我们学习的Dubbo指的都是2.7之后的版本

    是能够和SpringCloudAlibaba配合使用的

    Dubbo历程

    2012年底dubbo停止更新后到2017年dubbo继续更新之前

    2015SpringCloud开始兴起,当时没有阿里的框架

    国内公司要从SpringCloud和Dubbo中抉择使用哪个微服务方案

    在2012年dubbo停止更新后国内的当当网在dubbo的基础上开发了dubboX框架,并进行维护

    2019年后,SpringCloud和Dubbo才能共同使用

    3.4Dubbo对协议的支持

    RPC框架分通信协议和序列化协议

    Dubbo框架支持多种通信协议和序列化协议,可以通过配置文件进行修改

    Dubbo支持的通信协议

    • dubbo协议(默认)
    • rmi协议
    • hessian协议
    • http协议
    • webservice
    • .....

    支持的序列化协议

    • hessian2(默认)
    • java序列化
    • compactedjava
    • nativejava
    • fastjson
    • dubbo
    • fst
    • kryo

    Dubbo默认情况下,支持的协议有如下特征

    • 采用NIO单一长链接
    • 优秀的并发性能,但是处理大型文件的能力差

    Dubbo方便支持高并发和高性能

    3.5Dubbo服务的注册与发现

    在Dubbo的调用过程中,必须包含注册中心的支持

    注册中心推荐阿里自己的Nacos,兼容性好,能够发挥最大性能

    但是Dubbo也支持其它软件作为注册中心(例如Redis,zookeeper等)

    服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信。

    上面RPC的示例中,老婆就是服务的消费端,她能发现老公具备的服务

    如果老婆调用了老公的服务,就是完成了Dubbo调用

    consumer服务的消费者,指服务的调用者(使用者)也就是老婆的位置

    provider服务的提供者,指服务的拥有者(生产者)也就是老公的位置

    在Dubbo中,远程调用依据是服务的提供者在Nacos中注册的服务名称

    一个服务名称,可能有多个运行的实例,任何一个空闲的实例都可以提供服务

    常见面试题:Dubbo的注册发现流程

    1.首先服务的提供者启动服务时,将自己的具备的服务注册到注册中心,其中包括当前提供者的ip地址和端口号等信息,Dubbo会同时注册该项目提供的远程调用的方法

    2.消费者(使用者)启动项目,也注册到注册中心,同时从注册中心中获得当前项目具备的所有服务列表

    3.当注册中心中有新的服务出现时,会通知已经订阅发现的消费者,消费者会更新所有服务列表

    4.RPC调用,消费者需要调用远程方法时,根据注册中心服务列表的信息,只需服务名称,不需要ip地址和端口号等信息,就可以利用Dubbo调用远程方法了

    我们当前csmall项目的远程调用关系如下

     

  • 相关阅读:
    HttpURLConnection详解及使用
    计算机毕业设计选题推荐-大学生班级管理系统-Python项目实战
    蓝链带货怎么玩?B站横屏、竖屏恰饭竟增长1200w播放!
    第二十六章CSS3续~
    Leetcode 998.最大二叉树Ⅱ
    (附源码)springboot大学生就业质量调查分析系统 毕业设计 161457
    域名解析异常如何解决?快解析轻松实现动态域名解析
    复习Day03:数组part03:76 . 最小覆盖子串、438. 找到z字符串z中所有字母异位词
    在Centos7.9_2207安装CDH6.3.2
    操作系统:操作系统概论
  • 原文地址:https://blog.csdn.net/TheNewSystrm/article/details/126472021