前言

本文非 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) > 0);
51             }
52         }
53    }

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

        Task<UserDto> GetUserById(Int64 id);Task<Boolean> UpdateUser(UserDto user);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 客户端

        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:

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

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

原文:https://www.cnblogs.com/billyang/p/8376076.html

转载于:https://www.cnblogs.com/bigmango/p/10392681.html

[转载]Surging 分布式微服务框架使用入门相关推荐

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

    Surging 分布式微服务框架使用入门 原文:Surging 分布式微服务框架使用入门 前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的 ...

  2. 【ASP.NET CORE】 Surging 分布式微服务框架学习笔记(1)

    2019年02月24日,终于完成之前的项目.发现多年的工作开发节奏有点脱节了,刚好有时间多学一下,同时在这里记录一下爬坑遇到的问题.之前一直使用WEB API 做单点服务端开发,其中涉及到 ASP.N ...

  3. 基于docker 如何部署surging分布式微服务引擎

    1.前言 转眼间surging 开源已经有1年了,经过1年的打磨,surging已从最初在window 部署的分布式微服务框架,到现在的可以在docker部署利用rancher 进行服务编排的分布式微 ...

  4. .Net Core 分布式微服务框架介绍 - Jimu

    .Net Core 分布式微服务框架介绍 - Jimu 系列文章 [原文] .Net Core 分布式微服务框架介绍 - Jimu [原文] .Net Core 分布式微服务框架 - Jimu 添加 ...

  5. .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持

    https://www.cnblogs.com/grissom007/p/9432708.html 一.前言 最近有空就优化 Jimu (一个基于.Net Core 的分布式微服务框架),考虑到现在的 ...

  6. Jimu : .Net Core 分布式微服务框架介绍

    一.前言 近些年一直浸淫在 .Net 平台做企业应用开发,用过的 .Net 框架不多(具体数量不清,印象深刻的有 Asp.Net MVC,WPF,其他很多都是基于微软开发的框架做些封装而形成新的框架, ...

  7. java 微服务源码_Redkale 1.9.4 Java 分布式微服务框架

    Redkale 1.9.4 发布.Redkale (中文名: 红菜苔,一种湖北特产蔬菜)是基于Java 8全新的微服务框架, 包含HTTP.WebSocket.TCP/UDP.数据序列化.数据缓存.依 ...

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

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

  9. (十六)java springcloud版b2b2c社交电商spring cloud分布式微服务-使用spring cloud Bus刷新配置...

    b2b2c电子商务社交平台源码请加企鹅求求:一零三八七七四六二六.我们使用spring cloud分布式微服务云架构做了b2b2c的电子商务系统,除了架构本身自带的系统服务外,我们将b2b2c的业务服 ...

最新文章

  1. 革命性移动端开发框架-Flutter时间简史
  2. android 沉浸式导航栏
  3. 复制linux内核,linux内核写时复制机制源代码解读
  4. PolandBall and Forest(并查集)
  5. Linux下的用户和组
  6. 队列的基本操作_算法与数据结构(五) 栈和队列
  7. H3C之虚拟路由器冗余协议(VRRP)的原理及应用
  8. 计算机装机 基础知识,电脑diy硬件基础知识 菜鸟装机必看! (全文)
  9. 基于Linux系统的网络聊天室实现
  10. 【kali-漏洞扫描】(2.1)Nessus下载安装(上)
  11. 【万人千题】结对编程排位赛(第一期) 第一周 排名公布,这也太卷了
  12. cpu空载50度,大热天,cpu都上50度了! -
  13. 苹果6s上市时间_6s为什么会在iOS14系统支持名单?
  14. 简单几步实现内网穿透
  15. JSD-2204-创建Spring项目-Day19
  16. typeof(undefined) == undefined 成立吗?
  17. 根据污水处理厂的实际情况选型及校准方案
  18. 视频压缩技术及安卓中用法
  19. .dll反编译工具Reflector的使用
  20. AWVS_扫描报告分析

热门文章

  1. 2022-2028年中国乙丙橡胶行业市场全景调查及投资潜力研究报告
  2. 通过聚合数据API获取微信精选文章
  3. 显卡不够时,如何训练大型网络
  4. 条件随机场(CRF) - 1 - 简介
  5. 工艺技术:14nm与28nm工艺
  6. GPU加速库AmgX
  7. Linux 2 的 Windows 子系统上发布 CUDA
  8. 队列:实用程序服务和数据结构
  9. 2021年大数据Spark(六):环境搭建集群模式 Standalone
  10. python 把元组转为列表