前言git
本文非 Surging 官方教程,只是本身学习的总结。若有哪里不对,还望指正。github
我对 surging 的见解web
我目前所在的公司采用架构就是相似与Surging的RPC框架,在.NET 4.0框架上搭建Socket RPC,经过分组轮询的方式调度RPC,经历过3次双十一的考验,实际最高时有800多人同时做业,同时并发达到600人/链接rpc ,24小时不间断做业,这是实际数据,理论上更高,只须要加RPC就能够了,剩下的就看数据库以及缓存的性能了,说到数据库,这又是另一个技术栈了。虽然这个数据并不能说明RPC有多高效,但确是实实在在的现场数据。算法
surging的出现给了我眼前一亮的感受。surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper、Consul做为surging服务的注册中心,集成了哈希,随机,轮询、压力最小优先做为负载均衡的算法,RPC集成采用的是netty框架,采用异步传输。内部RPC,外部网关。原来这就是微服务框架,数据监控、流量控制、分流控制、重试、熔断........。竟然还能这样作,尽管部分术语你可能很早很早就听过了,但却没有造成一个框架,或者使用起来很困难。surging 偏偏就是这样一个集大成者的框架,全部这些surging帮你作了,并且很是很是高效。这个高效不只仅体如今surging的性能上(surging性能做者有过测试),还体如今开发上,只要稍有基础就能轻易驾驭,剩下就是整合业务进行开发了。sql
这是Surging做者的PC电脑全套运行测试的数据,能够说是很是厉害了。相信在部署集群的环境中,多实例,性能确定不存在问题。数据库
欢迎补充...windows
服务注册中心的选择:目前 Surging 提供了 Zookeeper、Consul 做为服务注册中心,后期还可能会把 service-fabric 加入进来,中文官方地址:https://docs.microsoft.com/zh-cn/azure/service-fabric/api
Event Bus 的选择:Surging 一样提供了多种选择,有 RabbitMQ,Kafka 等选择。缓存
Redis安全
具体使用哪一种,就看本身的技术栈啦
运行下面脚本,生成user表
clone代码 git clone https://github.com/billyang/SurgingDemo.git
nuget
引用,直接从 surging 项目引用,没有拷贝一份放在本身的解决方案,D:\git\surging
D:\git\SurgingDemo
Surging
和SurgingDemo
在同一个目录这样作的好处:
Surging.ApiGateway 提供了服务管理以及网关统一访问入口。 目前开发还不完善,若是如今要用于正式开发建议本身要部分重写 ApiGateway,加入权限验证。相信等到1.0版本做者也会把数据监控、流量控制、数据安全、分流控制、身份认证等管理功能加入,固然这些功能并不会影响正常使用。
服务管理使用 consul,由于调试简单,只需 consul agent -dev 便可开启consul
假设你已经把SurgingDemo已运行起来了,便可对根据Dapper对User进行增删改查
1 public class UserRepository: BaseRepository, IBaseRepository<User> 2 { 3 /// <summary> 4 /// 建立一个用户 5 /// </summary> 6 /// <param name="entity">用户</param> 7 /// <param name="connectionString">连接字符串</param> 8 /// <returns></returns> 9 public Task<Boolean> CreateEntity(User entity, String connectionString = null) 10 { 11 using (IDbConnection conn = DataBaseConfig.GetSqlConnection(connectionString)) 12 { 13 string insertSql = @"INSERT INTO dbo.auth_User 14 ( TenantId , 15 Name , 16 Password , 17 SecurityStamp , 18 FullName , 19 Surname , 20 PhoneNumber , 21 IsPhoneNumberConfirmed , 22 EmailAddress , 23 IsEmailConfirmed , 24 EmailConfirmationCode , 25 IsActive , 26 PasswordResetCode , 27 LastLoginTime , 28 IsLockoutEnabled , 29 AccessFailedCount , 30 LockoutEndDateUtc 31 ) 32 VALUES ( @tenantid , 33 @name , 34 @password , 35 @securitystamp , 36 @fullname , 37 @surname , 38 @phonenumber , 39 @isphonenumberconfirmed , 40 @emailaddress , 41 @isemailconfirmed , 42 @emailconfirmationcode , 43 @isactive , 44 @passwordresetcode , 45 @lastlogintime , 46 @islockoutenabled , 47 @accessfailedcount , 48 @lockoutenddateutc 49 );"; 50 return Task.FromResult<Boolean>(conn.Execute(insertSql, entity) > 0); 51 } 52 } 53 }
Task<UserDto> GetUserById(Int64 id); Task<Boolean> UpdateUser(UserDto user); Task<Boolean> DeleteUser(Int64 userId);
如:
1 public async Task<UserDto> GetUserById(Int64 id) 2 { 3 var user = await _repository.GetEntityById(id); 4 return new UserDto() 5 { 6 Id = user.Id, 7 EmailAddress = user.EmailAddress, 8 Name = user.Name, 9 PhoneNumber = user.PhoneNumber, 10 Surname = user.Surname, 11 TenantId = user.TenantId, 12 FullName = user.FullName, 13 }; 14 } 15 16 public async Task<Boolean> UpdateUser(UserDto user) 17 { 18 var entity = await _repository.GetEntityById(user.Id); 19 entity.Name = user.Name; 20 entity.Password = user.Password; 21 entity.FullName = user.FullName; 22 entity.Surname = user.Surname; 23 entity.EmailAddress = user.EmailAddress; 24 entity.PhoneNumber = user.PhoneNumber; 25 26 return await _repository.Update(entity); 27 28 } 29 30 public async Task<Boolean> DeleteUser(Int64 userId) 31 { 32 return await _repository.Delete(userId); 33 }
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); }
码托管在github,https://github.com/billyang/SurgingDemo
Surging: