# Surging 微服务框架使用入门
**Repository Path**: wangjun0710/SurgingDemo
## Basic Information
- **Project Name**: Surging 微服务框架使用入门
- **Description**: Surging 微服务框架使用入门
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 2
- **Created**: 2018-09-06
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SurgingDemo
base surging
### 前言:
### Surging 分布式微服务框架适合做什么
1. 企业级互联网架构平台;
2. 传统大型项目,伸缩性很强的项目,可应对突发的流量暴增(比如双十一订单暴增);
3. 移动互联网项目,比如为了因对突发的因营销等带来的流量暴增,评论暴增等等情况;
欢迎补充...
本示例项目是基于 Surging https://github.com/dotnetcore/surging
### 旨在描述如何在 surging 的基础上运行dapper完成一个增删改的例子
[Surging缓存拦截](https://github.com/billyang/SurgingDemo/wiki/Surging-%E7%BC%93%E5%AD%98%E6%8B%A6%E6%88%AA%E9%85%8D%E7%BD%AE%E7%A4%BA%E4%BE%8B)
1.在sqlserver中建立Test 数据库
----
运行下面脚本,生成user表
[test.db](https://github.com/billyang/SurgingDemo/blob/master/src/sql/surgingdemo.sql)
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才是踏出第一步

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)
```C#
public class UserRepository: BaseRepository, IBaseRepository
{
///
/// 创建一个用户
///
/// 用户
/// 链接字符串
///
public Task 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(conn.Execute(insertSql, entity) > 0);
}
}
}
```
## Bill.Demo.IModuleServices (和Surging项目一样,定义模块服务接口以及领域模型)
```C#
Task GetUserById(Int64 id);
Task UpdateUser(UserDto user);
Task DeleteUser(Int64 userId);
```
## Bill.Demo.ModuleServices (和Surging项目一样,实现模块服务)
如:
```C#
public async Task 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 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 DeleteUser(Int64 userId)
{
return await _repository.Delete(userId);
}
```
## Bill.Demo.Services.Server 服务
## Bill.Demo.Web 客户端
```C#
public async Task Delete(Int64 id)
{
var service = ServiceLocator.GetService();
var userProxy = service.CreateProxy("User");
await userProxy.DeleteUser(id);
return RedirectToAction("User");
}
public async Task GetUser(Int64 id)
{
var service = ServiceLocator.GetService();
var userProxy = service.CreateProxy("User");
var output= await userProxy.GetUserById(id);
return new JsonResult(output);
}
public async Task Update(UserDto dto)
{
var service = ServiceLocator.GetService();
var userProxy = service.CreateProxy("User");
var output = await userProxy.UpdateUser(dto);
return new JsonResult(output);
}
```