AbpVnext的微服务落地 项目聚合

1.微服务电商项目的创建完成后 我暂时使用Order服务 和product服务作为例子讲解  ORM结构如下

附上数据库 Order entity

 public class OrderItem : Entity<Guid>
    {
        //[Key]
        // public int Id { set; get; } // 主键
        public Guid OrderId { set; get; } // 订单编号
        public string OrderSn { set; get; } // 订单号
        public Guid ProductId { set; get; } // 商品编号
        public string ProductUrl { set; get; } // 商品主图
        public string ProductName { set; get; }// 商品名称
        public decimal ItemPrice { set; get; }  // 订单项单价
        public int ItemCount { set; get; } // 订单项数量
        public decimal ItemTotalPrice { set; get; } // 订单项总价

        public OrderItem()
        {
        }

        public OrderItem(Guid id) : base(id)
        {

        }
}
 public class Orders : AggregateRoot<Guid>
    {
        //[Key]
        //  public int Id { set; get; } // 主键
        public string OrderType { set; get; } // 订单类型
                                              // public string OrderFlag { set; get; } // 订单标志
        public Guid UserId { set; get; } // 用户Id
        public string OrderSn { set; get; }// 订单号
        public string OrderTotalPrice { set; get; } // 订单总价
        public DateTime Createtime { set; get; } // 创建时间
        public DateTime Updatetime { set; get; } // 更新时间
        public DateTime Paytime { set; get; }// 支付时间
        public DateTime Sendtime { set; get; }// 发货时间
        public DateTime Successtime { set; get; }// 订单完成时间
        public int OrderStatus { set; get; } // 订单状态
        public string OrderName { set; get; } // 订单名称
        public string OrderTel { set; get; } // 订单电话
        public string OrderAddress { set; get; } // 订单地址
        public string OrderRemark { set; get; }// 订单备注

        // 订单项
        public ICollection<OrderItem> OrderItems { set; get; }


        public Orders()
        {
            OrderItems = new Collection<OrderItem>();
        }

        public Orders(Guid id) : base(id)
        {
            OrderItems = new Collection<OrderItem>();
        }

        /// <summary>
        /// 添加商品图片
        /// </summary>
        public void AddOrderItem(Guid itemId, string OrderSn, string ProductName, decimal ItemPrice)
        {
            // 1、创建一个商品图片
            OrderItem productImage = new OrderItem(itemId);
            productImage.OrderSn = OrderSn;
            productImage.ProductName = ProductName;
            productImage.ItemPrice = ItemPrice;

            // 2、添加到集合中
            OrderItems.Add(productImage);
        }
    }

  Product Enitity

  public class Products
         : FullAuditedAggregateRoot<Guid> //聚合根:AggregateRoot, BasicAggregateRoot 没有 ConcurrencyStamp 和 ExtraProperties 这两个字段
    {

        ///// <summary>
        ///// 主键
        ///// </summary>
        //[Key]
        //public Guid Id { get; set; }

        /// <summary>
        /// 商品Code
        /// </summary>
        public string ProductCode { get; set; }

        /// <summary>
        /// 商品名称
        /// </summary>
        public string ProductName { get; set; }

        /// <summary>
        /// 商品价格
        /// </summary>
        public decimal ProductPrice { get; set; }

        /// <summary>
        /// 商品库存
        /// </summary>
        public int Stock { get; set; }

        /// <summary>
        /// 商品状态 10-新增 20-修改 30-拒绝审核 40-审核通过
        /// </summary>
        public string Status { get; set; }

        /// <summary>
        /// 商品图片
        /// 商品聚合根(Product)管理实体(ProductImage)
        /// </summary>
        public  List<ProductImage> ProductImages { get; set; }

        private Products()
        {
            ProductImages = new List<ProductImage>();
        }

        public Products(Guid Id) : base(Id)
        {
            ProductImages = new List<ProductImage>();
        }

        /// <summary>
        /// 添加商品图片
        /// </summary>
        /// <param name="imageUrl"></param>
        public void AddProductImage(Guid productId, string imageUrl)
        {
            var productImage = new ProductImage(productId)
            {
                ImageUrl = imageUrl
            };
            //添加到集合
            ProductImages.Add(productImage);
        }

        /// <summary>
        /// 修改商品图片
        /// </summary>
        /// <param name="imageUrl"></param>
        public void UpdateProductImage(Guid Id, string imageUrl)
        {
            var productImage = ProductImages.FirstOrDefault(a => a.Id == Id);
            productImage.ImageUrl = imageUrl;
        }
    }
 public class ProductImage : FullAuditedEntity<Guid>
    {
        ///// <summary>
        ///// 主键
        ///// </summary>
        //[Key]
        //public Guid Id { get; set; }

        /// <summary>
        /// 商品Id
        /// </summary>
        public Guid ProductId { get; set; }

        /// <summary>
        /// 图片Url
        /// </summary>
        public string ImageUrl { get; set; }

        /// <summary>
        /// 图片排序
        /// </summary>
        public int ImageSort { get; set; }

        private ProductImage()
        {
            //base.Id = Guid.NewGuid();
            //base.IsDeleted = false;
        }

        public ProductImage(Guid id) : base(id)
        {

        }
    }

通过修改每个微服务Domain中的 DbProperties 来修改表名前缀,我依旧推荐使用EF提供的 api来设置实体的某些特殊属性

 

 

2.微服务的运行

再以后的聚合服务中 不在推荐使用 单体服务的 webapi业务 尽量使用 abp提供的 远程通信 引入各个微服务的远程通信层 

 

 再聚合服务中配置

 

 

 

3.微服务的聚合

创建一个.net5webapi项目  对此项目进行abp 模块化 安装以下包

 

创建一个聚合服务的控制器 按照webapi控制器创建 通过项目的依赖 我们可以直接通过依赖注入的形式调用各个微服务的应用层

 

 

 

4.微服务的聚合之间的通信

微服务之间通过http进行通信  经过网络七层协议 不仅时间长 并且不能跨技术通信 

所以我强烈通信 GRPC 进行微服务之间的通信 (rpc不能跨语言 )

再.net 和abp中都不会支持 grpc 需要自己封装 。grpc封装我会在以后的文章中写出详细介绍

5.微服务性能

此微服务中聚合服务 未尝可以做负载均衡 如果要求集群部署 聚合服务修改 appsetting中的地址 但是 如何做集群的负载均衡?

 

思路1:

Nginx 将地址都给Nginx 让Nginx进行转发

缺点:如果实例地址增加 就需要手动修改nginx 违背了开闭原则

思路2:

使用Oclote 

详情见下一节

posted @ 2022-06-17 13:48  三五八团楚云飞  阅读(258)  评论(0)    收藏  举报