前言

本文非 Surging 官方教程,只是自己学习的总结。如有哪里不对,还望指正。

我对 surging 的看法

我目前所在的公司采用架构就是类似与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性能作者有过测试),还体现在开发上,只要稍有基础就能轻易驾驭,剩下就是整合业务进行开发了。

这是Surging作者的PC电脑全套运行测试的数据,可以说是非常厉害了。相信在部署集群的环境中,多实例,性能肯定不存在问题。

Surging 分布式微服务框架适合做什么

  1. 企业级互联网架构平台;
  2. 传统大型项目,伸缩性很强的项目,可应对突发的流量暴增(比如双十一订单暴增);
  3. 移动互联网项目,比如为了因对突发的因营销等带来的流量暴增,评论暴增等等情况;

欢迎补充...

一、准备

服务注册中心的选择:目前 Surging 提供了 Zookeeper、Consul 作为服务注册中心,后期还可能会把 service-fabric 加入进来,中文官方地址:https://docs.microsoft.com/zh-cn/azure/service-fabric/

Event Bus 的选择:Surging 同样提供了多种选择,有 RabbitMQ,Kafka 等选择。

Redis

具体使用哪种,就看自己的技术栈啦

二、示例开发

1.在sqlserver中建立Test 数据库

运行下面脚本,生成user表

test.db

2.运行Surging Demo

clone代码 git clone https://github.com/billyang/SurgingDemo.git

因为本示例项目没有从nuget 引用,直接从 surging 项目引用,没有拷贝一份放在自己的解决方案,

假设目录结构如下:

D:\git\surging
D:\git\SurgingDemo

最终保持SurgingSurgingDemo在同一个目录

这样做的好处:

  • 是和 surging 保持最新代码
  • 是方便学习surging和调试,毕竟你想使用surging、理解surging才是踏出第一步

Surging.ApiGateway 提供了服务管理以及网关统一访问入口。 目前开发还不完善,如果现在要用于正式开发建议自己要部分重写 ApiGateway,加入权限验证。相信等到1.0版本作者也会把数据监控、流量控制、数据安全、分流控制、身份认证等管理功能加入,当然这些功能并不会影响正常使用。

服务管理使用 consul,因为调试简单,只需 consul agent -dev 即可开启consul

在 windows 中启动:
发布网关 1. ApiGateway                dotnet run Surging.ApiGateway
启用服务 2. Server              dotnet Bill.Demo.Services.Server.dll
发布客户端(本示例使用 web mvc) 3. Bill.Demo.Web               dotnet run Bill.Demo.Web

假设你已经把SurgingDemo已运行起来了,即可对根据Dapper对User进行增删改查

三、介绍一下本示例各项目的职责

Bill.Demo.Core 用户定义数据模型

Bill.Demo.DapperCore (Dapper仓储,其中仓储需继承 UserRepository: Surging.Core.CPlatform.Ioc.BaseRepository)

  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) > );
  51. }
  52. }
  53. }

Bill.Demo.IModuleServices (和Surging项目一样,定义模块服务接口以及领域模型)

  1. Task<UserDto> GetUserById(Int64 id);
  2.  
  3. Task<Boolean> UpdateUser(UserDto user);
  4.  
  5. Task<Boolean> DeleteUser(Int64 userId);

Bill.Demo.ModuleServices (和Surging项目一样,实现模块服务)

如:

  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. }

Bill.Demo.Services.Server 服务

Bill.Demo.Web 客户端

  1. public async Task<IActionResult> Delete(Int64 id)
  2. {
  3. var service = ServiceLocator.GetService<IServiceProxyFactory>();
  4. var userProxy = service.CreateProxy<IUserService>("User");
  5. await userProxy.DeleteUser(id);
  6.  
  7. return RedirectToAction("User");
  8. }
  9.  
  10. public async Task<JsonResult> GetUser(Int64 id)
  11. {
  12. var service = ServiceLocator.GetService<IServiceProxyFactory>();
  13. var userProxy = service.CreateProxy<IUserService>("User");
  14. var output= await userProxy.GetUserById(id);
  15.  
  16. return new JsonResult(output);
  17. }
  18. public async Task<JsonResult> Update(UserDto dto)
  19. {
  20. var service = ServiceLocator.GetService<IServiceProxyFactory>();
  21. var userProxy = service.CreateProxy<IUserService>("User");
  22. var output = await userProxy.UpdateUser(dto);
  23. return new JsonResult(output);
  24. }

码托管在github,https://github.com/billyang/SurgingDemo

Surging:

博客:http://www.cnblogs.com/fanliang11/

开源:https://github.com/dotnetcore/surging

【非官方】Surging 微服务框架使用入门的更多相关文章

  1. Surging 微服务框架使用入门

    原文:Surging 微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正.  我对 surging 的看法 我目前所在的公司采用架构就是类似与Sur ...

  2. (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志. 首先我们先创建两个项目,一个控制台的服务启动项目,一个业务的实现项目. ...

  3. 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)

    (一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装   (1)下载erlang: http://www.erlang.org/download/otp_win64 ...

  4. 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)

    (三)surging 微服务框架使用系列之我的第一个服务(审计日志)   前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...

  5. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  6. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  7. golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

    micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

  8. golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

    micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...

  9. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

随机推荐

  1. [BZOJ1041] [HAOI2008] 圆上的整点 (数学)

    Description 求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数. Input 只有一个正整数n,n<=2000 000 000 Output 整点个数 Samp ...

  2. [BZOJ2298] [HAOI2011] problem a (dp)

    Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个 ...

  3. unity(c# ioc框架) 使用总结

    这里的unity指的是完成依赖注入的unity而不是游戏引擎. 原本项目完成依赖注入用的是spring.net,但是spring.net已经很久没人维护了,所以微软官方推出的Unity成为了替代spr ...

  4. 云主机和vps的区别

    云主机和vps的区别   近年来,IT行业开始热衷于各种云概念,而云主机就是其中之一,并且有越来越热之势.对普通用户而言,可能不太清楚云主机和VPS的区别,下面我们就来说说云主机和VPS到底有什么不同 ...

  5. 记kkpager分页控件的使用

    kkpager支持异步加载分页: 1.页面添加div标签和引用JS,默认标签为<div id="kkpager"></div> 引用JS和样式 <sc ...

  6. Python 3 中生成器函数yield表达式的使用

    生成器函数或生成器方法中包含了一个yield表达式.调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法).每次调用__next__()时,生成器函数的yi ...

  7. mySQL语法中的存储过程及if语句的使用简例

    create procedure gh() #注意各个地方的分号!此代码应先运行除掉最后一句的部分,然后运行call gh显示已经存储的结果 BEGIN declare c_no int; #声明数据 ...

  8. DBI-1.634之selectrow_array与fetchrow_array的区别

    在DBI-1.634使用手册里有一个selectrow_array函数,该函数具体说明如下: This utility method combines "prepare", &qu ...

  9. [模拟赛] T3 Exploit

    Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...

  10. FileReader对象的readAsDataURL方法来读取图像文件

     FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Dat ...