Surging 微服务框架使用入门
前言
本文非 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 等选择。
具体使用哪种,就看自己的技术栈啦
二、示例开发
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
最终保持Surging和SurgingDemo在同一个目录
这样做的好处:
是和 surging 保持最新代码
是方便学习surging和调试,毕竟你想使用surging、理解surging才是踏出第一步
ApiGateway 使用 surging 的例子,当然正式开发建议自己重写 ApiGateway
服务管理使用 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)
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);
}
}
}
Bill.Demo.IModuleServices (和Surging项目一样,定义模块服务接口以及领域模型)
Task<UserDto> GetUserById(Int64 id);
Task<Boolean> UpdateUser(UserDto user); Task<Boolean> DeleteUser(Int64 userId);
Bill.Demo.ModuleServices (和Surging项目一样,实现模块服务)
如:
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);
}
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);
}
原文地址: https://www.cnblogs.com/billyang/p/8376076.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
Surging 微服务框架使用入门的更多相关文章
- 【非官方】Surging 微服务框架使用入门
前言 本文非 Surging 官方教程,只是自己学习的总结.如有哪里不对,还望指正. 我对 surging 的看法 我目前所在的公司采用架构就是类似与Surging的RPC框架,在.NET 4.0框架 ...
- (三)surging 微服务框架使用系列之我的第一个服务(审计日志)
前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志. 首先我们先创建两个项目,一个控制台的服务启动项目,一个业务的实现项目. ...
- 一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装(转载 https://www.cnblogs.com/alangur/p/8339905.html)
(一)surging 微服务框架使用系列之surging 的准备工作rabbitmq安装 (1)下载erlang: http://www.erlang.org/download/otp_win64 ...
- 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)
(三)surging 微服务框架使用系列之我的第一个服务(审计日志) 前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...
- golang微服务框架go-micro 入门笔记2.4 go-micro service解读
本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布
本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...
- golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web
micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...
- golang微服务框架go-micro 入门笔记2.1 micro工具之micro api
micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.s ...
- golang微服务框架go-micro 入门笔记1.搭建 go-micro环境
微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...
随机推荐
- ecshop微信通中微信自动登录的设置方法
ecshop微信通中微信自动登录的设置方法 来 源:共享世纪 作 者:网络 时间:2015-12-03 点击: 4017 注意:微信自动登录,必须同时满足两个条件: 第一.微信公众号必须是服务号经过认 ...
- Spark 性能相关參数配置具体解释-任务调度篇
作者:刘旭晖 Raymond 转载请注明出处 Email:colorant at 163.com BLOG:http://blog.csdn.net/colorant/ 随着Spark的逐渐成熟完好, ...
- ElasticSearch概述和定义
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
- Day2上午解题报告
预计分数:100+0+60=160 实际分数:100+0+60=160 mmpT1数据错了... T1遭遇 题目描述 你是能看到第一题的 friends呢. —— hja ?座楼房,立于城中 . 第? ...
- 解决 Ubuntu 下解压 .zip 文件时出现乱码
Ubuntu 下解压含中文名的 .zip 文件时,有时候会出现乱码的情况.我们可以通过下列命令来解决此类问题: $ unzip -O CP936 xxx.zip 原文网址 http://www.cnb ...
- PythonOOP面向对象编程1
什么是对象? 对象是指现实中的物体或实体(拥有一系列变量.函数(方法)的) 什么事面向对象? 把一切看成对象(实例),让对象和对象之间建立关联关系 对象都有什么特征? 属性(名词)实例变量 姓名.年龄 ...
- gdal读写图像分块处理
转自赵文原文 gdal读写图像分块处理(精华版) Review: 用gdal,感觉还不如直接用C++底层函数对遥感数据进行处理.因为gdal进行太多封装,如果你仅仅只是Geotif等格式进行处理,IO ...
- 微软自拍应用iOS版公布
微软自拍(Microsoft Selfie)主要是支持自拍后还能加强自拍效果的功能. 只是和其它自拍应用不同的是.Microsoft Selfie 利用了机器学习来增强照片,应用会"考虑年龄 ...
- List-ArrayList 使用
今天优化一段代码,如下 int num = 0; boolean skipAppend = false; int types_ext1[] = new int[] { ModuleType.TYPE_ ...
- Spring中的AOP注解方式和XML方式
应掌握内容:1. AOP的全名2. AOP的实现原理[静态代理和动态代理]3. 注解方式的配置4. 通知类型 A. 每种通知的特点和使用方式 B. 获取各种数据,方便日后操作5. 执行表 ...