原文:Surging 分布式微服务框架使用入门

前言

本文非 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

Surging 分布式微服务框架使用入门的更多相关文章

  1. [转载]Surging 分布式微服务框架使用入门

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

  2. 推荐一款分布式微服务框架 Surging

    surging   surging 是一个分布式微服务框架,提供高性能RPC远程服务调用,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希,随机,轮询,压力最小优先作为 ...

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

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

  4. Net Core 分布式微服务框架

    Jimu : .Net Core 分布式微服务框架介绍 https://www.cnblogs.com/grissom007/p/9291345.html 一.前言 近些年一直浸淫在 .Net 平台做 ...

  5. Dapeng框架-开源高性能分布式微服务框架

    我们公司性质是新零售,公司也有专门的框架组.这群大牛自己开发了一整套分布式微服务框架.我们也在使用这套框架,有很多心得体会. 该框架既Dapeng也!开源github地址:https://github ...

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

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 最近有空就优化 Jimu (一个基于.Net ...

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

    系列文章 .Net Core 分布式微服务框架介绍 - Jimu .Net Core 分布式微服务框架 - Jimu 添加 Swagger 支持 一.前言 近些年一直浸淫在 .Net 平台做企业应用开 ...

  8. Kite: 一个分布式微服务框架(翻译)

    原文链接:https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/ 此为中文翻译 用GO语言来编写web ...

  9. 我的分布式微服务框架:YC-Framework

    YC-Framework官方文档:http://framework.youcongtech.com/ YC-Framework源代码:https://github.com/developers-you ...

随机推荐

  1. Codeforces 429D Tricky Function 近期点对

    题目链接:点击打开链接 暴力出奇迹. 正解应该是近期点对.以i点为x轴,sum[i](前缀和)为y轴,求随意两点间的距离. 先来个科学的暴力代码: #include<stdio.h> #i ...

  2. 如何分解json值设置到text文本框中

    <td><input type="text" id="name11"></td> //4设置访问成功返回的操作 xhr.on ...

  3. android--动态加载、插件化

    需求驱动 随着业务发展需要和无线部门的拆分,各业务产品模块归属到各业务BU,原有无线App开发团队被分为基础框架.业务A.业务B.业务C等多个开发团队,从此App的开发和发布进入了一个全新模式.在这种 ...

  4. 关于router-link的传参以及参数的传递

    1.路径:http://localhost:8081/#/test?name=1 <router-link :to="{path:'/test',query: {name: id}}& ...

  5. BZOJ5027: 数学题

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 140  Solved: 48[Submit][Status][Discuss] Description ...

  6. C#之用户自定义控件

    一.新建用户自定义控件 如下图所示,想通过LED的点击来实现亮和灭使用去控制下位机. LED亮: LED灭: 首先新建一个用户控件类,如下图所示步骤: 在资源中,添加现有文件中加入图片 加入的图片可以 ...

  7. 在OSG 实现的 oculus rift 效果

    在OSG 实现的oculus rift 效果,还不错 这个是Delta3d中实现的 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1eWluZ3Fpb ...

  8. PHP JSON的BUG

    将下面的数组进行 JSON 编码时出错,编码中丢掉了最后一维数组中的下标. Array ( [1] => Array ( [0] => Array ( [0] => Array ( ...

  9. matlab (.m)文件生成 windows 可执行(.exe)文件

    mex -setup:设置 C 语言编译器:(如果本地安装有 visual studio 20xx 集成开发环境,则会自动选择其下的 C/C++ 编译器 ) 将运行时环境(runtime enviro ...

  10. npm install (让别人下载自己的包)

    好几天没更新了,再这里跟大家说声抱歉,今天来点干货. 发布一个包在npm上,可以供世界所有人使用,想一下,以前我们做项目,都是在npm install 别人的包,什么时候才能install我们自己的包 ...