基于.NET CORE微服务框架 -浅析如何使用surging
1、前言
surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人的开源项目,无法与成熟的开源社区的项目相比,也只有等到后面有许许多多志同道合的朋友加入一起研发完善surging,这样才能让surging 成为流行的微服务框架。
这篇文章介绍如何使用surging
开源地址:https://github.com/dotnetcore/surging
2、设计模式
Surging 提供了以下四种设计模式
2.1 代理模式
通过代理调用不同的微服务。并且针对于规则控制其访问,如下图所示:
2.2 异步消息模式
再处理等待而阻塞的问题时候, 基于微服务的架构会选择使用消息队列来代替请求/响应模式,如下图所示:
2.3 链式模式
这种模式在接收到请求后会进行互相合并的响应,如下图所示:
服务A接收到请求后会与服务B进行通信,服务B会同服务C进行通信。所有服务之间的通信使用基于Netty的RPC通信。
2.4 分支模式
这种模式允许调用多个服务提供者,来合并数据进行返回,如下图所示:
3、外部如何交互
服务主要针对提交的数据进行处理,在单个服务或多个服务调用的问题上,采取使用网关统一访问的形式进行处理,如下图所示
网关包括以下功能:
- 安全身份认证
- 统一访问
- 流量控制
- 分流控制
- 数据监控
- 缓存拦截
2.简单示例
服务端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var host = new ServiceHostBuilder() .RegisterServices(option=> { option.Initialize(); //初始化服务 option.RegisterServices(); //依赖注入领域服务 option.RegisterRepositories(); //依赖注入仓储 option.RegisterModules(); //依赖注入第三方模块 option.RegisterServiceBus(); //依赖注入ServiceBus }) .RegisterServices(builder => { builder.AddMicroService(option => { option.AddServiceRuntime(); // // 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的消费的服务适配 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 .UseStartup<Startup>() .Build(); using (host.Run()) { Console.WriteLine($ "服务端启动成功,{DateTime.Now}。" ); } |
服务路由访问配置
在接口上,添加以下特性(还未实现统一方法配置)
[ServiceBundle("api/{Service}")]
服务创建代理调用 (需要依赖接口创建代理)
ServiceLocator.GetService<IServiceProxyFactory>().CreateProxy<T>(key)
服务根据RoutePath 进行调用(不需要依赖接口,耦合性低)
1 | ServiceLocator.GetService<IServiceProxyProvider>().Invoke< string >(model, path, serviceKey) |
本地模块和服务调用
ServiceLocator.GetService<T>(key)
通过以上配置,可以通过网关进行访问,如果我们要访问接口IUserService ,方法为GetUser,路由映射的规则[ServiceBundle("api/{Service}/{Method}")],所转化地址应该是api/User/GetUser,
用Postman测试的效果如下:
4. 总结
surging外部通过Api 网关 Rest 访问,内部通过netty RPC访问,surging还在不断完善中,帮助文档也正在赶工中,请大家耐心等待。如感兴趣请多关注或者加入QQ群:615562965
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验