推荐一款分布式微服务框架 Surging
surging
surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper、Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为负载均衡的算法,RPC集成采用的是netty框架,采用异步传输。
名字由来
英文名:surging
中文名:滔滔
中文名来自周星驰的经典台词
我对阁下的景仰犹如滔滔江水,连绵不绝,犹如黄河泛滥,一发而不可收拾,而取名英文的含义也希望此框架能流行起来,也能像《.net core surging》这句英文语句含义一样,.net core技术风起云涌,冲击整个软件生态系统。
微服务定义
微服务应该是可以自由组合拆分,对于每个业务都是独立的,针对于业务模块的 CRUD 可以注册为服务,而每个服务都是高度自治的,从开发,部署都是独立,而每个服务只做单一功能,利用领域驱动设计去更好的拆分成粒度更小的模块
微服务边界
微服务是针对业务的松耦合,也是粒度最小的功能业务模块,针对于行业解决方案,集成相应的service host,而针对于业务需要一些中间件来辅助,比如缓存中间件,eventbus中间件(消息中间件),数据储存中间件,而各个服务又可以互相通过rpc进行可靠性通信。
引擎是微服务的容器,而docker 是服务引擎的容器,而利用k8s或rancher可以针对docker集群化管理,可以服务编排弹性扩容,熟知工具,让工具物尽其用。
能做什么
1.简化的服务调用,通过服务规则的指定,就可以做到服务之间的远程调用,无需其它方式的侵入
2.服务自动注册与发现,不需要配置服务提供方地址,注册中心基于ServiceId 或者RoutePath查询服务提供者的地址和元数据,并且能够平滑添加或删除服务提供者。
3.软负载均衡及容错机制,通过surging内部负载算法和容错规则的设定,从而达到内部调用的负载和容错
4.分布式缓存中间件:通过哈希一致性算法来实现负载,并且有健康检查能够平滑的把不健康的服务从列表中删除
- 事件总线:通过对于事件总线的适配可以实现发布订阅交互模式
6.容器化持续集成与持续交付 :通过构建一体化Devops平台,实现项目的自动化构建、部署、测试和发布,从而提高生产环境的可靠性、稳定性、弹性和安全性。
- 业务模块化驱动引擎,通过加载指定业务模块,能够更加灵活、高效的部署不同版本的业务功能模块
引擎如何安装
docker hub : docker pull serviceengine/surging:版本号
nuget:Install-Package surging -Version 版本号
架构图
调用链
配置:
var host = new ServiceHostBuilder()
.RegisterServices(builder =>
{
builder.AddMicroService(option =>
{
option.AddServiceRuntime();//
option.AddRelateService();//添加支持服务代理远程调用
option.AddConfigurationWatch();//添加同步更新配置文件的监听处理
// option.UseZooKeeperManager(new ConfigInfo("127.0.0.1:2181")); //使用Zookeeper管理
option.UseConsulManager(new ConfigInfo("127.0.0.1:8500"));//使用Consul管理
option.UseDotNettyTransport();//使用Netty传输
option.UseRabbitMQTransport();//使用rabbitmq 传输
option.AddRabbitMQAdapt();//基于rabbitmq的消费的服务适配
// option.UseProtoBufferCodec();//基于protobuf序列化
option.UseMessagePackCodec();//基于MessagePack序列化
builder.Register(p => new CPlatformContainer(ServiceLocator.Current));//初始化注入容器
});
})
.SubscribeAt() //消息订阅
//.UseServer("127.0.0.1", 98)
//.UseServer("127.0.0.1", 98,“true”) //自动生成Token
//.UseServer("127.0.0.1", 98,“123456789”) //固定密码Token
.UseServer(options=> {
options.Ip = "127.0.0.1";
options.Port = 98;
//options.IpEndpoint = new IPEndPoint(IPAddress.Any, 98);
//options.Ip = "0.0.0.0";
options.ExecutionTimeoutInMilliseconds = 30000; //执行超时时间
options.Strategy=(int)StrategyType.Failover; //容错策略使用故障切换
options.RequestCacheEnabled=true; //开启缓存(只有通过接口代理远程调用,才能启用缓存)
options.Injection="return null"; //注入方式
options.InjectionNamespaces= new string[] { "Surging.IModuleServices.Common" }); //脚本注入使用的命名空间
options.BreakeErrorThresholdPercentage=50; //错误率达到多少开启熔断保护
options.BreakeSleepWindowInMilliseconds=60000; //熔断多少毫秒后去尝试请求
options.BreakerForceClosed=false; //是否强制关闭熔断
options.BreakerRequestVolumeThreshold = 20;//10秒钟内至少多少请求失败,熔断器才发挥起作用
options.MaxConcurrentRequests=100000;//支持最大并发
options.ShuntStrategy=AddressSelectorMode.Polling; //使用轮询负载分流策略
options.NotRelatedAssemblyFiles = "Centa.Agency.Application.DTO\\w*|StackExchange.Redis\\w*"; //排除无需依赖注册
})
//.UseLog4net("Configs/log4net.config") //使用log4net记录日志
.UseNLog(LogLevel.Error, "Configs/NLog.config")// 使用NLog 记录日志
//.UseLog4net(LogLevel.Error) //使用log4net记录日志
//.UseLog4net() //使用log4net记录日志
.Configure(build =>
build.AddEventBusFile("eventBusSettings.json", optional: false))//使用eventBusSettings.json文件进行配置
.Configure(build =>
build.AddCacheFile("cacheSettings.json", optional: false))//使用cacheSettings.json文件进行配置
.UseProxy() //使用Proxy
.UseStartup<Startup>()
.Build(); using (host.Run())
{
Console.WriteLine($"服务端启动成功,{DateTime.Now}。");
}
文件配置:
{
"ConnectionString": "${Register_Conn}|127.0.0.1:8500", // ${环境变量名} |默认值,
"SessionTimeout": "${Register_SessionTimeout}|50",
"ReloadOnChange": true
}
非容器环境文件配置
{
"Ip": "${Server_IP}|127.0.0.1",
"WatchInterval": 30,
"Port": "${Server_port}",
"Token": "true",
"Protocol": "${Protocol}|Tcp", //支持Http,Tcp协议
"RootPath": "${RootPath}",
"RequestCacheEnabled": false
}
容器环境文件配置
{
"Ip": "${Server_IP}|0.0.0.0",//私有容器IP
"WatchInterval": 30,
"Port": "${Server_port}|98",//私有容器端口
"MappingIp": "${Mapping_ip}",//公开主机IP
"MappingPort": "${Mapping_Port}",//公开主机端口
"Protocol": "${Protocol}|Tcp", //支持Http,Tcp协议
"Token": "true",
"RootPath": "${RootPath}",
"RequestCacheEnabled": false
}
服务路由访问配置:
[ServiceBundle("api/{Service}")]
JWT验证,接口方法添加以下特性:
[Authorization(AuthType = AuthorizationType.JWT)];
AppSecret验证,接口方法添加以下特性:
[Authorization(AuthType = AuthorizationType.AppSecret)];
订阅功能:
ServiceLocator.GetService< ISubscriptionAdapt >().SubscribeAt();
增加服务容错、服务容错降级、服务强制降级
- 增加容错策略Injection,脚本注入:
[Command(Strategy= StrategyType.Injection ,Injection = @"return null;")]
[Command(Strategy= StrategyType.Injection ,Injection = @"return
Task.FromResult(new Surging.IModuleServices.Common.Models.UserModel
{
Name=""fanly"",
Age=18
});",InjectionNamespaces =new string[] { "Surging.IModuleServices.Common"})]
- 增加容错策略Injection,本地模块注入:
[Command(Strategy= StrategyType.Injection ,Injection = @"return true;")]
增加缓存降级,怎么使用?
在业务接口方法上添加如下特性
[Command(Strategy= StrategyType.Failover,FailoverCluster =3,RequestCacheEnabled =true)] //RequestCacheEnabled =true 就是启用缓存
怎么拦截获取缓存
在业务接口方法上添加如下特性
[InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", Mode = CacheTargetType.Redis, Time = 480)]
怎么拦截删除缓存
在业务接口方法上添加如下特性
[InterceptMethod(CachingMethod.Remove, "GetUser_id_{0}", "GetUserName_name_{0}", Mode = CacheTargetType.Redis)]
怎么添加缓存KEY
在业务模型属性上添加,如下特性,可以支持多个
[CacheKey(1)]
配置拦截器
.AddClientIntercepted(typeof(CacheProviderInterceptor))
推荐一款分布式微服务框架 Surging的更多相关文章
- Surging 分布式微服务框架使用入门
原文:Surging 分布式微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与S ...
- [转载]Surging 分布式微服务框架使用入门
前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...
- Net Core 分布式微服务框架
Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...
- Dapeng框架-开源高性能分布式微服务框架
我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...
- .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...
- .Net Core 分布式微服务框架介绍 - Jimu
系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...
- Kite: 一个分布式微服务框架(翻译)
原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...
- 推荐一款 Python 微服务框架 - Nameko
1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 本篇文章 ...
- 我的分布式微服务框架:YC-Framework
YC-Framework官方文档:http://framework.youcongtech.com/ YC-Framework源代码:https://github.com/developers-you ...
随机推荐
- C# vb .net实现大小调整特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的大小调整效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- 2-python元组和列表
目录 元组 列表 1.元组 - 元素有序排列 - 一个元组中的元素不需要具有相同的类型 - 元素不可增添.修改和删除 1.1.创建元组 # 创建元组 tup1 = (1,2,3,4) tup2 = t ...
- Spring源码——IOC控制反转
1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...
- webpack4引入JQuery的两种方法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_36185028/artic ...
- Navicat导出数据库设计文档
前言:仅支持单表导出 导出sql: SELECT TABLE_NAME 表名, COLUMN_NAME 列名, COLUMN_TYPE 数据类型, COLUMN_KEY 主键, IF(IS_NULLA ...
- 车间管理难?APS系统为你智能排程
对 APS系统不熟或者不了解他的一些运行规则也是在实施项目中导致经常不能正常运行不可忽视的因素,对 APS系统的早期了解是整个项目实施运行的成功至关重要的因素. 如果不了解 APS潜在的因素和运行准则 ...
- Android为TV端助力之无法依赖constraint-layout:1.1.3(转发)
原文地址 http://fanjiajia.cn/2018/09/25/Android%20Studio%20Could%20not%20resolve%20com.android.support.c ...
- Flink源码分析 - 剖析一个简单的Flink程序
本篇文章首发于头条号Flink程序是如何执行的?通过源码来剖析一个简单的Flink程序,欢迎关注头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech) ...
- 大数据之kafka-02.搞定kafka专业术语
02.搞定kafka专业术语 在kafka的世界中有很多概念和术语是需要我们提前理解并且熟练掌握的,下面来盘点一下. 之前我们提到过,kafka属于分布式的消息引擎系统,主要功能是提供一套完善的消息发 ...
- 【Spring Boot】Spring Boot之跨域解决方案
一.什么是跨域 跨域,指的是从一个域名去请求另外一个域名的资源.即跨域名请求!跨域时,浏览器不能执行其他域名网站的脚本,是由浏览器的同源策略造成的,是浏览器施加的安全限制. 跨域的严格一点来讲就是只要 ...