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/
三 工程结构介绍
不常用:暂时没有用上,不代表不重要
- Surging.Core.Abp(不常用)
- Surging.Core.ApiGateWay(不常用)
- Surging.Core.AutoMapper(不常用)
对象映射 - Surging.Core.Caching(
重要
)
1 ) 缓存地址管理->配置地址,寻址
2 ) 哈希算法->ConsistentHashNode
3 ) 健康检查->DefaultHealthCheckService
4 ) 缓存客户端->ICacheClient
5 ) 缓存管理器->AppConfig负责缓存的配置和注册缓存实例,实例管理器CacheContainer提供缓存提供器(ICacheProvider)的实例。
6 ) MemoryCache实现
7 ) RedisCache实现 - Surging.Core.Codec.MessagePack(
重要
)
Rpc传输消息处理,传输消息、接收消息的编码、解码 - Surging.Core.Codec.ProtoBuffer(不常用)
传输消息编码协议,同上 - Surging.Core.Common(
视情况
)
公共方法,扩展字符串、枚举处理等,不过在扩展的时候没有修改这里面的内容,是单独建一个项目,作用等同 - Surging.Core.Consul(
重要
)
服务集群中HTTP路由管理、Rpc命令、缓存
1 ) Consul配置管理。默认配置ConfigInfo,从服务Consul配置(surgingSettings.json)中读取ConsulOption。
2 ) Consul地址管理,路由添加、路由寻址、Consul健康检查
3 ) Consul中Key/Value管理。由定时服务管理ClientWatchManager进行定时刷新
Key分类两类 ,所有接口继承IServiceKey都会被记录。其中Key会记录相关模块信息。
i. lock_services类
serviceRoutes
ii. services类
- serviceCaches 缓存相关信息
- 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
}- 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”:{
}
}
}
- Consul 健康检查 后续补上完整流程
- Surging.Core.CPlatform(
核心
)
几乎是所有模块的基础,集群地址、缓存、配置、事件、日志、路由、序列化、RPC传输等依赖注入的方法接口、基础类 - Surging.Core.DNS(不常用)
- Surging.Core.DotNetty(重要)
Rpc服务器监听、传输通道的消息适配、消息发送、客户端创建工厂 - Surging.Core.DotNettyWSServer(没使用)
- Surging.Core.EventBusKafka(没使用)
- Surging.Core.EventBusRabbitMQ(
重要
)
消息队列使用的这个组件,可以参考微软项目eShopOnContainers,消息处理、断线重连、重试队列、死信队列等处理
1 ) 配置管理。默认配置、配置提供、配置改写(从服务中读取配置AppConfig改写默认配置)
2 ) 默认连接方式。DefaultRabbitMQPersisterConnection
3 ) 初始化。EventBusRabbitMQModule
4 ) 消息发送和消息接收管理。EventBusRabbitMQ,包含所有实现连接管理(连接、连接异常处理、断线重连等)、发送机制(发送时会注册exchange,模式为direct,该模式要求队列Queue注册时信道Route名称需要完全一致),接收机制(订阅消息,重试机制和死信队列机制。如果接收消息并处理相关业务失败次数大于配置次数加入…)
5 ) 消息队列属性。QueueConsumerAttribute,消费者订阅的队列。 - Surging.Core.Grpc(没使用)
- Surging.Core.Kestrel.Log4net(日志)
- Surging.Core.Kestrel.Nlog(日志)
- Surging.Core.KestrelHttpServer(
核心
)
HTTP服务监听、处理、转发、过滤、异常拦截,这个模块有内存泄漏,很隐蔽,后面可以详细说明一下:如何发现、如何分析、如何定位、如何修改
- Surging.Core.Log4net(日志 使用)
- Surging.Core.NLog(日志 未使用,个人觉得Nlog更好,团队谈论使用Log4net:大多数人熟悉)
- Surging.Core.Protocol.Http
- Surging.Core.Protocol.Mqtt
- Surging.Core.Protocol.Udp
- Surging.Core.Protocol.WS
- Surging.Core.ProxyGenerator
- Surging.Core.Redis(
重要
)
缓存的实现模块,处理连接池、虚拟节点、节点选择算法、缓存添加删除(只适配了字符串,其他类型需要按需扩展,是StackExchange.Redis的二次封装) - Surging.Core.ServiceHosting(修改很少)
- Surging.Core.ServiceHosting.Extensions
- Surging.Core.Stage(
重要
)
http请求的过滤器实现模块 - Surging.Core.Swagger(API展示)
- Surging.Core.System(
重要
)
依赖注入的实现等,很重要但很少修改和扩展 - Surging.Core.Zookeeper(暂时未用)
四 扩展工程
团队可以根据需要扩展Surging,以下是我们扩展的内容
- 事务处理
- 幂等性操作
- 服务接口基类
a ) 初始化当前登录用户信息等 - Quartz.net作业任务
- 仓储
- 集成微软模型验证
- 数据过滤:不安全字段(SQL注入等)、敏感词过滤(dang、zf等)
- 公共方法
1、 枚举字段、属性用int替换,在上层使用时强转
2、 枚举值参数注入
五 总结
整体上Surging是一款非常优秀、功能齐全、性能好。但是内容非常多,同同类功能多个实现,初次接触上手难度大,如果已经接触过微服务结构,发现可能有的模块实现有不太适合有的业务场景,后面会分模块剖析Surging内部实现,以便大家进化架构时可以更快扩展内容和扩展点。