You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lizizhou 3c308bcadf 更新 'readme.md' 2 years ago
BPA_Kitchen.bak 添加空白数据库备份文件 2 years ago
Project.Standard.png 添加文件 2 years ago
Service.Define.pdf 添加文件 2 years ago
bpa服务分析.xlsx 上传文件至 '' 2 years ago
k8s集群地址信息.xls 上传文件至 '' 2 years ago
readme.md 更新 'readme.md' 2 years ago
服务定义.png 添加文件 2 years ago
问题.docx 更新文件 2 years ago

readme.md

服务定义

目前攻击分配服务节点如下所示:

完整PDF文件在BPA.Documents项目中

其中包括(地址可直接克隆):

  1. 基础服务:Basic.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Basic.Api (脚手架完成)
  2. 订单服务:Order.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Order.Api (脚手架完成)
  3. 库存服务:Stock.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Stock.Api (脚手架完成)
  4. 物料服务:Material.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Material.Api (脚手架完成)
  5. 商品服务:Product.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Product.Api (脚手架完成)
  6. 支付服务:Payment.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Payment.Api
  7. 营销服务:Marketing.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Marketing.Api
  8. 设备服务:Device.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Device.Api
  9. 报表服务:Report.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Report.Api
  10. 售后服务:AfterSale.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.AfterSale.Api
  11. 分账服务:Dividends.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Dividends.Api
  12. 可视化运维服务:VisualOperation.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.VisualOperation.Api
  13. 店铺服务:Store.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Store.Api
  14. 监测服务:Detection.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Detection.Api
  15. 消息服务:Message.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Message.Api
  16. 业务日志服务:BizLog.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.BizLog.Api (初步业务完成)
  17. 附件服务:Annex.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Annex.Api (初步业务完成)
  18. 调度服务:TaskSchedule.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.TaskSchedule.Api (初步业务完成)
  19. 工作流服务:WorkFlow.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.WorkFlow.Api (暂缓)
  20. 应用网关服务:Gateway.Api http://10.2.1.24:10244/Bpa.Software.Development/BPA.SaaS.Gateway.Api (暂缓)
  21. 字典和枚举: BPA.Common.Eums http://10.2.1.24:10244/Bpa.Software.Development/BPA.Common.Eums (持续集成)

注意

创建与开发文档相关的仓库:http://10.2.1.24:10244/Bpa.Software.Development/BPA.Documents

服务拆分需要由原有业务设计的编码人员进行拆分,在保证业务分离、不过分拆分的前提下,将代码和业务剥离到其他新的服务中

新框架使用介绍

原有框架使用Furion做应用程序框架,简单、易用,对于小型快速建站,它绝对是非常优秀的AppFramework,但同样也由于过度封装,导致耦合过高,拆分困难,灵活性低,不适用于企业级服务中,可查看BPA.Documents中的“问题.docx”描述。

层次架构

1.WebApi

只定义接口的对外(集群外)暴露。

2.Service

定义和实现该服务节点下的【业务接口和业务实现】,包括IService和Service两个项目。

3.Repository

定义和实现该服务节点下的【仓储接口和持久化实现】,包括IRepository和Repository两个项目。

4.Model

实体定义和映射,包括DTO,Entity,Model。

5.Bootstrap

定义和配置该服务节点的所有组件,无业务实现。

6.SDK

定义和配置该服务节点对内(集群内)需要暴露的接口,无业务实现。

7.Tester

该服务节点的所有接口的单元测试。

使用重点

1、所有Service中需引用的对象,全部采用构造函数注入方式(需要什么,注入什么),禁止在业务代码中实例化一个新对象,让系统自动管理对象生成和释放。
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IAuthRepository _authRepository;
private readonly CSRedisClient _redisClient;
private readonly BasicApiConfig _basicApiConfig;
/// <summary>
/// 构造函数
/// </summary>
public AuthService(IHttpContextAccessor httpContextAccessor, IAuthRepository authRepository, CSRedisClient redisClient, BasicApiConfig basicApiConfig)
{    
    _httpContextAccessor = httpContextAccessor;    
    _authRepository = authRepository;    
    _redisClient = redisClient;    
    _basicApiConfig = basicApiConfig;
}
2、业务面向接口编程。所有业务代码均采用interface+implement的方式进行编码,禁止直接编写implement业务实现代码。
public interface IAuthService
{
        /// <summary>
        /// 获取用户
        /// </summary>
        /// <param name="logintype"></param>
        /// <returns></returns>
        Task<BaseResult<LoginOutput>> GetLoginUserAsync(EnumLoginType logintype);

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="logintype"></param>
        /// <param name="input"></param>
        /// <returns></returns>
        Task<BaseResult<LoginOutInfo>> LoginAsync(EnumLoginType logintype, LoginInput input);

        /// <summary>
        /// 登出
        /// </summary>
        /// <returns></returns>
        Task<BaseResult<string>> LogoutAsync();
}
3、仓储面向接口编程。所有仓储代码均采用interface+implement的方式进行编码,禁止直接编写implement仓储实现代码。
public interface IAuthRepository
{
    /// <summary>
    /// 获取登录用户信息
    /// </summary>
    /// <param name="userId"></param>
    /// <returns></returns>
    Task<BPA_Users> GetLoginUserAsync(string userId);

    /// <summary>
    /// 查询登录登录
    /// </summary>
    /// <param name="LoginType"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    Task<(BPA_Users user, BPA_Company company)> LoginAsync(EnumLoginType LoginType, LoginInput input);
}
4、Entity只能应用在Service和Repository层中,不能直接从API接口返回,需通过DTO进行转换。已内置DTO转换方法,MapTo和MapToList可直接无差别调用,减少冗余代码。
var result = rows.MapToList<ProductCodeDto, BPA_ProductCode>().ToList();
5、Apollo配置使用优化,在每个服务节点下均会存在一个[serviceName]ApiConfig.cs的类文件,该文件可自动映射本地成员与Apollo中的成员,使用时只需要将该对象注入,并通过对象.属性的方式获取各配置项访问,而无需使用GetSection(“完全限定名”)的方式访问(同样也禁止使用‘完全限定名’的方式访问)。
	/// <summary>
  	/// StockMySqlDb
    /// </summary>
    [AutoWrite]
    public new DbConfig StockMySqlDb { get; set; }

    /// <summary>
    /// RedisConfig
    /// </summary>
    [AutoWrite]
    public new List<string> RedisConfig { set; get; }

    /// <summary>
    /// 是否打印SQL
    /// </summary>
    [AutoWrite]
    public bool IsLogSql { get; set; } = true;

    /// <summary>
    /// RabbitMQ配置
    /// </summary>
    [AutoWrite]
    public new RabbitMqConnectionConfig RabbitMqConfig { get; set; }
6、已增加RabbitMQ消息队列,并在各服务节点中注入到容器,可根据实际业务进行解耦或业务编码。
//获取rabbitMqProvider
var rabbitMqProvider = serviceProvider.UseRabbitMQProvider<RabbitMQProvider>();

//创建交换机配置对象
var createBizLogExchangeConfig = rabbitMqProvider.BuildExchangeConfig(MqNameConfig.CreateBizLogExchange);
//启用交换机
createBizLogExchangeConfig.UseExchange();
//启用生产者
createBizLogExchangeConfig.UseProducer<CreateBizLogMsgBody, CreateBizLogProducer>();

//创建交换机配置对象
var addMessageExchangeConfig = rabbitMqProvider.BuildExchangeConfig(MqNameConfig.BatchAddMessageExchange, ExchangeType.Fanout);
//启用交换机
addMessageExchangeConfig.UseExchange();
//启用生产者
addMessageExchangeConfig.UseProducer<BatchAddMessageMsgBody, BatchAddMessageProduct>();
7、已增加CSRedis作为Redis访问中间件,并已实现集群访问(集群配置咨询运维),原redis访问不在做任何支持。
/// <summary>
/// 注入redis
/// </summary>
/// <param name="services"></param>
public static void AddRedis(this IServiceCollection services)
{
	services.UseRedisSingleton(sp => GetRedisSingletonConnectionString(sp.GetService<StockApiConfig>()!));
}

// 缓存Token令牌
var key = BasicRedisKey.UserAccessToken(user.Id);
await _redisClient.DelAsync(key);
await _redisClient.SetAsync(key, accessToken, _basicApiConfig.TokenExpireInterval);
8、已增加远程(节点)服务调用,采用微软官方Refit组件进行http远程调用,禁止本地跨库(或直连)调用。
public interface IAuthServiceApi
{
    /// <summary>
    /// 获取用户
    /// </summary>
    /// <param name="logintype"></param>
    /// <param name="authToken"></param>
    /// <returns></returns>
    [Get("/api/Auth/GetLoginUser")]
    Task<BaseResult<LoginOutput>> GetLoginUserAsync(EnumLoginType logintype, [Header("Authorization")] string authToken);

    /// <summary>
    /// 登录
    /// </summary>
    /// <param name="logintype"></param>
    /// <param name="input"></param>
    /// <returns></returns>
    [Post("/api/Auth/Login")]
    Task<BaseResult<LoginOutInfo>> LoginAsync(EnumLoginType logintype, LoginInput input);

    /// <summary>
    /// 登出
    /// </summary>
    /// <returns></returns>
    [Post("/api/Auth/Logout")]
    Task<BaseResult<string>> LogoutAsync([Header("Authorization")] string authToken);
}

调用时注入当前需要调用服务SDK即可,例如BasicWebApiSDK。

/// <summary>
/// 认证服务API
/// </summary>
public IAuthServiceApi AuthServiceApi;
9、已增加审计功能(业务日志)功能(目前界面未实现)。对查询,修改,新增,删除进行了统一的审计功能处理。查询使用时,只需要考虑在某个Controller接口上增加特性标签,而增删改已集成内部框架和整体架构中,业务开发无需关心,使用如下:
/// <summary>
/// 分页
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost, Anonymous, BizLogQuery] //BizLogQuery查询审计
public Task<BaseResultPage<UserDtoOutput>> UserPage(UserDtoPageInput input) => _userService.UserPage(input);
10、新增懒加载多线程模型,用于解决当前服务中对象注入的资源问题。即需要使用则由系统动态通过子线程生成(基于构造函数注入),提高系统整体性能,使用时只需要将对象使用Lazy进行子线程装箱即可,如下:
public BasicDbSugarClient(ILogger<BasicDbSugarClient> logger, 
                          Lazy<BizLogProducer> bizLogProducer, //懒加载注入
                          BasicApiConfig config)
        : base(BuildConnectionConfig(config.BasicMySqlDb), bizLogProducer, true, logger)

未完待续...