.NetCore框架Surging系列(一)介绍

时间:2024-05-22 21:01:51

Surging

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心,集成了哈希一致性,随机,轮询、压力最小优先作为负载均衡的算法,底层协议集成采用的组件是dotnetty、websocket-sharp、Kestrel。支持通过docker hub 部署服务引擎,也可以通过nuget 引用组件的方式自定义服务引擎

一 简介

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心,集成了哈希一致性,随机,轮询、压力最小优先作为负载均衡的算法,底层协议集成采用的组件是dotnetty、websocket-sharp、Kestrel。支持通过docker hub 部署服务引擎,也可以通过nuget 引用组件的方式自定义服务引擎。

二 安装使用

这个写的较好:https://www.cnblogs.com/YorkSun/p/10438717.html
作者博客(很久没有更新了):https://www.cnblogs.com/fanliang11/tag/surging/

三 工程结构介绍

不常用:暂时没有用上,不代表不重要

  1. Surging.Core.Abp(不常用)
  2. Surging.Core.ApiGateWay(不常用)
  3. Surging.Core.AutoMapper(不常用)
    对象映射
  4. Surging.Core.Caching(重要)
    1 ) 缓存地址管理->配置地址,寻址
    2 ) 哈希算法->ConsistentHashNode
    3 ) 健康检查->DefaultHealthCheckService
    4 ) 缓存客户端->ICacheClient
    5 ) 缓存管理器->AppConfig负责缓存的配置和注册缓存实例,实例管理器CacheContainer提供缓存提供器(ICacheProvider)的实例。
    6 ) MemoryCache实现
    7 ) RedisCache实现
  5. Surging.Core.Codec.MessagePack(重要)
    Rpc传输消息处理,传输消息、接收消息的编码、解码
  6. Surging.Core.Codec.ProtoBuffer(不常用)
    传输消息编码协议,同上
  7. Surging.Core.Common(视情况)
    公共方法,扩展字符串、枚举处理等,不过在扩展的时候没有修改这里面的内容,是单独建一个项目,作用等同
  8. Surging.Core.Consul(重要)
    服务集群中HTTP路由管理、Rpc命令、缓存
    .NetCore框架Surging系列(一)介绍

1 ) Consul配置管理。默认配置ConfigInfo,从服务Consul配置(surgingSettings.json)中读取ConsulOption。
2 ) Consul地址管理,路由添加、路由寻址、Consul健康检查
3 ) Consul中Key/Value管理。由定时服务管理ClientWatchManager进行定时刷新
Key分类两类 ,所有接口继承IServiceKey都会被记录。其中Key会记录相关模块信息。
i. lock_services类
serviceRoutes
ii. services类

  1. serviceCaches 缓存相关信息
  2. serviceCommands被作用于RPC配置,负载分流策略、故障转移次数、开启熔断保护等请求策略。客户端代理调用等配置在服务端surgingSettings.json中配置,例如超时时间,服务在启动的时候,会从配置中读取然后写到各个command的Value中。接口可以更改Command属性,并在Value中记录相关策略信息。例如
    {
    “ServiceId”: “Surging.IModuleServices.Common.IUserService.GetUser_user”,//路由ID
    “FailoverCluster”: 3, //错误重试次数
    “CircuitBreakerForceOpen”: false, //是否开启熔断
    “Strategy”: “Injection”, //熔断后响应策略 故障转移、返回指定内容、回退
    “ExecutionTimeoutInMilliseconds”: 20000, //超时时间
    “RequestCacheEnabled”: true,
    …省略
    “MaxConcurrentRequests”: 20
    }
  3. serviceRoutes 所有接口路由信息,用Http、Proxy(代理不常用)、Rpc(http请求路由不再本地,用路由寻址后发起RPC)调用
    {
    “AddressDescriptors”:[
    {
    //接口地址信息 -> IP 主机地址
    //HttpPort -> Http端口
    //Port -> Rpc端口
    “Value”:"{“Ip”:“127.0.0.1”,“Port”:98,“WanIp”:“127.0.0.1”,“WsPort”:96,“MqttPort”:97,“HttpPort”:280}"
    }
    ],
    “ServiceDescriptor”:{
    “Id”:“Surging.IModuleServices.Common.IUserService.GetUser_user”, //路由转为ID 命名空间+类名+方法名
    “Token”:“428c32e9df8744c6b7a8d6b90327737b”,
    “RoutePath”:“api/v1/user/”, //路由地址
    “Metadatas”:{
    }
    }
    }
  1. Consul 健康检查 后续补上完整流程
  1. Surging.Core.CPlatform(核心)
    几乎是所有模块的基础,集群地址、缓存、配置、事件、日志、路由、序列化、RPC传输等依赖注入的方法接口基础类
  2. Surging.Core.DNS(不常用)
  3. Surging.Core.DotNetty(重要)
    Rpc服务器监听、传输通道的消息适配、消息发送、客户端创建工厂
  4. Surging.Core.DotNettyWSServer(没使用)
  5. Surging.Core.EventBusKafka(没使用)
  6. Surging.Core.EventBusRabbitMQ(重要
    消息队列使用的这个组件,可以参考微软项目eShopOnContainers,消息处理、断线重连、重试队列、死信队列等处理
    1 ) 配置管理。默认配置、配置提供、配置改写(从服务中读取配置AppConfig改写默认配置)
    2 ) 默认连接方式。DefaultRabbitMQPersisterConnection
    3 ) 初始化。EventBusRabbitMQModule
    4 ) 消息发送和消息接收管理。EventBusRabbitMQ,包含所有实现连接管理(连接、连接异常处理、断线重连等)、发送机制(发送时会注册exchange,模式为direct,该模式要求队列Queue注册时信道Route名称需要完全一致),接收机制(订阅消息,重试机制和死信队列机制。如果接收消息并处理相关业务失败次数大于配置次数加入…)
    5 ) 消息队列属性。QueueConsumerAttribute,消费者订阅的队列。
  7. Surging.Core.Grpc(没使用)
  8. Surging.Core.Kestrel.Log4net(日志)
  9. Surging.Core.Kestrel.Nlog(日志)
  10. Surging.Core.KestrelHttpServer(核心)
    HTTP服务监听、处理、转发、过滤、异常拦截,这个模块有内存泄漏,很隐蔽,后面可以详细说明一下:如何发现、如何分析、如何定位、如何修改
  11. Surging.Core.Log4net(日志 使用)
  12. Surging.Core.NLog(日志 未使用,个人觉得Nlog更好,团队谈论使用Log4net:大多数人熟悉)
  13. Surging.Core.Protocol.Http
  14. Surging.Core.Protocol.Mqtt
  15. Surging.Core.Protocol.Udp
  16. Surging.Core.Protocol.WS
  17. Surging.Core.ProxyGenerator
  18. Surging.Core.Redis(重要
    缓存的实现模块,处理连接池、虚拟节点、节点选择算法、缓存添加删除(只适配了字符串,其他类型需要按需扩展,是StackExchange.Redis的二次封装)
  19. Surging.Core.ServiceHosting(修改很少)
  20. Surging.Core.ServiceHosting.Extensions
  21. Surging.Core.Stage(重要
    http请求的过滤器实现模块
  22. Surging.Core.Swagger(API展示)
  23. Surging.Core.System(重要
    依赖注入的实现等,很重要但很少修改和扩展
  24. Surging.Core.Zookeeper(暂时未用)

四 扩展工程

团队可以根据需要扩展Surging,以下是我们扩展的内容

  1. 事务处理
  2. 幂等性操作
  3. 服务接口基类
    a ) 初始化当前登录用户信息等
  4. Quartz.net作业任务
  5. 仓储
  6. 集成微软模型验证
  7. 数据过滤:不安全字段(SQL注入等)、敏感词过滤(dang、zf等)
  8. 公共方法
    1、 枚举字段、属性用int替换,在上层使用时强转
    2、 枚举值参数注入

五 总结

整体上Surging是一款非常优秀、功能齐全、性能好。但是内容非常多,同同类功能多个实现,初次接触上手难度大,如果已经接触过微服务结构,发现可能有的模块实现有不太适合有的业务场景,后面会分模块剖析Surging内部实现,以便大家进化架构时可以更快扩展内容和扩展点。