前言
本文非 Surging 官方教程,只是自己学习的总结。如有哪里不对,还望指正。?
我对 surging 的看法
我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架上搭建Socket RPC,通过分组轮询的方式调度RPC,经历过3次双十一的考验,实际最高时有800多人同时作业,同时并发达到600人/连接rpc?,24小时不间断作业,这是实际数据,理论上更高,只需要加RPC就可以了,剩下的就看数据库以及缓存的性能了,说到数据库,这又是另外一个技术栈了。虽然这个数据并不能说明RPC有多高效,但确是实实在在的现场数据。
surging的出现给了我眼前一亮的感觉,内部RPC,外部网关。原来这就是微服务框架,数据监控、流量控制、分流控制、重试、熔断........。居然还能这样做,尽管部分术语你可能很早很早就听过了,但却没有形成一个框架,或者使用起来很困难。surging 恰恰就是这样一个集大成者的框架,所有这些surging帮你做了,而且非常非常高效。这个高效不仅仅体现在surging的性能上(surging性能作者有过测试),还体现在开发上,只要稍有基础就能轻易驾驭,剩下就是整合业务进行开发了。
服务注册中心的选择:目前 Surging 提供了 Zookeeper、Consul 作为服务注册中心,后期还可能会把?service-fabric?加入进来,中文官方地址:https://docs.microsoft.com/zh-cn/azure/service-fabric/
Event Bus 的选择:Surging 同样提供了多种选择,有 RabbitMQ,Kafka 等选择。
具体使用哪种,就看自己的技术栈啦
运行下面脚本,生成user表
test.db
clone代码?git clone https://github.com/billyang/SurgingDemo.git
nuget
?引用,直接从 surging 项目引用,没有拷贝一份放在自己的解决方案,D:\git\surging
D:\git\SurgingDemo
Surging
和SurgingDemo
在同一个目录这样做的好处:
是和 surging 保持最新代码
是方便学习surging和调试,毕竟你想使用surging、理解surging才是踏出第一步
?
ApiGateway 使用 surging 的例子,当然正式开发建议自己重写 ApiGateway
服务管理使用 consul,因为调试简单,只需 consul agent -dev 即可开启consul
假设你已经把SurgingDemo已运行起来了,即可对根据Dapper对User进行增删改查?
?
public class UserRepository: BaseRepository, IBaseRepository<User>
? ? {
? ? ? ? /// <summary>
? ? ? ? /// 创建一个用户
? ? ? ? /// </summary>
? ? ? ? /// <param name="entity">用户</param>
? ? ? ? /// <param name="connectionString">链接字符串</param>
? ? ? ? /// <returns></returns>
? ? ? ? public Task<Boolean> CreateEntity(User entity, String connectionString = null)
? ? ? ? {
? ? ? ? ? ? using (IDbConnection conn = DataBaseConfig.GetSqlConnection(connectionString))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? string insertSql = @"INSERT? INTO dbo.auth_User
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ( TenantId ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Name ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Password ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SecurityStamp ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FullName ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Surname ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PhoneNumber ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? IsPhoneNumberConfirmed ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EmailAddress ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? IsEmailConfirmed ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? EmailConfirmationCode ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? IsActive ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PasswordResetCode ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LastLoginTime ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? IsLockoutEnabled ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AccessFailedCount ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LockoutEndDateUtc
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? VALUES? ( @tenantid ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @name ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @password ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @securitystamp ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @fullname ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @surname ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @phonenumber ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @isphonenumberconfirmed ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @emailaddress ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @isemailconfirmed ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @emailconfirmationcode ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @isactive ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @passwordresetcode ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @lastlogintime ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @islockoutenabled ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @accessfailedcount ,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @lockoutenddateutc
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? );";
? ? ? ? ? ? ? ? return Task.FromResult<Boolean>(conn.Execute(insertSql, entity) > 0);
? ? ? ? ? ? }
? ? ? ? }
? ?}
Task<UserDto> GetUserById(Int64 id); ? ? ? ? ? ? ? ?Task<Boolean> UpdateUser(UserDto user); ? ? ? ?Task<Boolean> DeleteUser(Int64 userId);
如:
public async Task<UserDto> GetUserById(Int64 id)
? ? ? ? {
? ? ? ? ? ? var user = await _repository.GetEntityById(id);
? ? ? ? ? ? return new UserDto()
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Id = user.Id,
? ? ? ? ? ? ? ? EmailAddress = user.EmailAddress,
? ? ? ? ? ? ? ? Name = user.Name,
? ? ? ? ? ? ? ? PhoneNumber = user.PhoneNumber,
? ? ? ? ? ? ? ? Surname = user.Surname,
? ? ? ? ? ? ? ? TenantId = user.TenantId,
? ? ? ? ? ? ? ? FullName = user.FullName,
? ? ? ? ? ? };
? ? ? ? }
? ? ? ? public async Task<Boolean> UpdateUser(UserDto user)
? ? ? ? {
? ? ? ? ? ? var entity = await _repository.GetEntityById(user.Id);
? ? ? ? ? ? entity.Name = user.Name;
? ? ? ? ? ? entity.Password = user.Password;
? ? ? ? ? ? entity.FullName = user.FullName;
? ? ? ? ? ? entity.Surname = user.Surname;
? ? ? ? ? ? entity.EmailAddress = user.EmailAddress;
? ? ? ? ? ? entity.PhoneNumber = user.PhoneNumber;
? ? ? ? ? ? return await _repository.Update(entity);
? ? ? ? }
? ? ? ? public async Task<Boolean> DeleteUser(Int64 userId)
? ? ? ? {
? ? ? ? ? ? return await _repository.Delete(userId);
? ? ? ? }
? ? ? ? public async Task<IActionResult> Delete(Int64 id)
? ? ? ? {
? ? ? ? ? ? var service = ServiceLocator.GetService<IServiceProxyFactory>();
? ? ? ? ? ? var userProxy = service.CreateProxy<IUserService>("User");
? ? ? ? ? ? await userProxy.DeleteUser(id);
? ? ? ? ? ? return RedirectToAction("User");
? ? ? ? }
? ? ? ? public async Task<JsonResult> GetUser(Int64 id)
? ? ? ? {
? ? ? ? ? ? var service = ServiceLocator.GetService<IServiceProxyFactory>();
? ? ? ? ? ? var userProxy = service.CreateProxy<IUserService>("User");
? ? ? ? ? ? var output= await userProxy.GetUserById(id);
? ? ? ? ? ? return new JsonResult(output);
? ? ? ? }
? ? ? ? public async Task<JsonResult> Update(UserDto dto)
? ? ? ? {
? ? ? ? ? ? var service = ServiceLocator.GetService<IServiceProxyFactory>();
? ? ? ? ? ? var userProxy = service.CreateProxy<IUserService>("User");
? ? ? ? ? ? var output = await userProxy.UpdateUser(dto);
? ? ? ? ? ? return new JsonResult(output);
? ? ? ? }
原文地址: https://www.cnblogs.com/billyang/p/8376076.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
原文:https://www.cnblogs.com/lonelyxmas/p/10410077.html