简介

surging 经过两年多的研发,微服务引擎已经略有雏形,也承蒙各位的厚爱, GitHub上收获了将近2800星,fork 811,付费用户企业也有十几家,还有咨询培训,

在2020年,我们将依靠社区的力量,去完善社区版本,更会花更多的精力去维护好付费用户,大家一起把surging 的社区建设好,还有十几天就要过年,大家可以加入surging唯一官方群:615562965, 过年的时候会和往常一样发红包,而且不少哦。让我们过年狂欢起来。

surging 将会有自己的官方站,作者正在用VuePress进行研发,在不久的日子将会和大家见面

新功能简述

1.GRPC协议支持:

添加接口,将ServerCallContext参数的默认值设置为null。 代码如下:

using Greet;
using Grpc.Core;
using Surging.Core.CPlatform.Ioc;
using Surging.Core.CPlatform.Runtime.Server.Implementation.ServiceDiscovery.Attributes;
using System.Threading.Tasks; namespace Surging.IModuleServices.Common
{
[ServiceBundle("api/{Service}/{Method}")]
public interface IGreeterService : IServiceKey
{
Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context=null);
}
}

添加GreeterBehavior,代码如下

using Greet;
using Surging.Core.CPlatform.Ioc; namespace Surging.Modules.Common.GreeterServices
{
public partial class GreeterBehavior : Greeter.GreeterBase,IServiceBehavior
{ }
}

添加业务代码,代码如下:

using Greet;
using Grpc.Core;
using Surging.IModuleServices.Common;
using Surging.Modules.Common.GreeterServices; using System.Threading.Tasks; namespace Surging.Modules.Common.Domain
{
public class GreeterService: GreeterBehavior, IGreeterService
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply
{
Message = "Hello " + request.Name
});
}
}
}

客户端GRPC调用,代码如下

using Greet;
using Grpc.Core;
using System; namespace GrpcService1
{
public class Program
{
public static void Main(string[] args)
{
var channel = new Channel("127.0.0.1", , ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
var result = client.SayHello(new HelloRequest
{
Name = "fanly"
}); Console.WriteLine("grpc Client Call SayHello():" + result);
Console.ReadKey();
}
}
}

2.支持WorkService后台托管守护程序

引擎支持WorkService后台服务,可以支持RPC远程调用开启,关闭,添加任务处理,代码如下:

添加接口代码如下:

   [ServiceBundle("Background/{Service}")]
public interface IWorkService : IServiceKey
{
Task<bool> AddWork(Message message); Task StartAsync(); Task StopAsync();
}

然后需要继承BackgroundServiceBehavior,而且服务的生命周期设置为ISingleInstance

 public class WorkService : BackgroundServiceBehavior, IWorkService, ISingleInstance
{
private readonly ILogger<WorkService> _logger;
private readonly Queue<Message> _queue = new Queue<Message>();
private readonly IServiceProxyProvider _serviceProxyProvider;
private CancellationToken _token; public WorkService(ILogger<WorkService> logger, IServiceProxyProvider serviceProxyProvider)
{
_logger = logger;
_serviceProxyProvider = serviceProxyProvider;
} public Task<bool> AddWork(Message message)
{
_queue.Enqueue(message);
return Task.FromResult(true);
} protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
_token = stoppingToken;
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
_queue.TryDequeue(out Message message);
if (message != null)
{
var result = await _serviceProxyProvider.Invoke<object>(message.Parameters, message.RoutePath, message.ServiceKey);
_logger.LogInformation("Invoke Service at: {time},Invoke result:{result}", DateTimeOffset.Now, result);
}
if (!_token.IsCancellationRequested)
await Task.Delay(, stoppingToken);
}
catch (Exception ex){
_logger.LogError("WorkService execute error, message:{message} ,trace info:{trace} ", ex.Message, ex.StackTrace);
}
} public async Task StartAsync()
{
if (_token.IsCancellationRequested)
{
await base.StartAsync(_token);
}
} public async Task StopAsync()
{
if (!_token.IsCancellationRequested)
{
await base.StopAsync(_token);
}
}
}

3.支持特性验证

支持接口特性验证,代码如下

   [ServiceBundle("api/{Service}/{Method}")]
//[ServiceBundle("api/{Service}")]
//[ServiceBundle("api/{Service}/{Method}/test")]
//[ServiceBundle("api/{Service}/{Method}/test",false)]
public interface IUserService: IServiceKey
{
/// <summary>
/// 获取用户姓名
/// </summary>
/// <param name="id">用户编号</param>
/// <returns></returns>
[ServiceRoute("{id}")]
Task<string> GetUserName([Validate] [Range(, , ErrorMessage = "只能为1到10")] int id); /// <summary>
/// 获取用户
/// </summary>
/// <param name="user">用户模型</param>
/// <returns></returns>
[Command(Strategy = StrategyType.Injection, Injection = @"return
new Surging.IModuleServices.Common.Models.UserModel
{
Name=""fanly"",
Age=19
};", RequestCacheEnabled = true, InjectionNamespaces = new string[] { "Surging.IModuleServices.Common" })]
[InterceptMethod(CachingMethod.Get, Key = "GetUser_id_{0}", CacheSectionType = SectionType.ddlCache, Mode = CacheTargetType.Redis, Time = )]
[Validate]
Task<UserModel> GetUser(UserModel user); }

支持模型特性验证,接口方法一定要添加 [Validate]特性,要不然不会进行验证,代码如下

   [ProtoContract]
public class UserModel
{ [ProtoMember()]
[CacheKey()]
public int UserId { get; set; } [ProtoMember()]
public string Name { get; set; } [ProtoMember()]
[Range(, , ErrorMessage = "年龄只能在0到150岁之间")]
public int Age { get; set; } [ProtoMember()]
[Range(, , ErrorMessage = "性别只能选男或女")]
public Sex Sex { get; set; } }

总结

开源不易,请大家多多支持

surging 社区版本支持.net core 3.1的更多相关文章

  1. CYQ.Data 正式支持 DotNET Core 版本发布

    闲话几句: 自从上周开始,IOS人员逝去,就开始接手IOS的代码了. 并开始整理IOS的代码(包括当时一开始设计的开发框架). 在未来不远的日子里,设想是有一个系列详细的介绍I恋App和IT连App及 ...

  2. C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。

    报错信息: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标.请将 .NET Core 2.1 或 ...

  3. 在vs2017 版本15.7.6中不支持2.1.0以上版本的net core sdk

    问题起因 :使用.net core 2.1sdk 电脑直接安装的2.1.1 没有安装2.1.0的sdk 在项目开发过程中报错:当前 . NET SDK 不支持将 .NET Core 2.1.1 设置为 ...

  4. .net core 版本支持

    NetCore sdk并不是每个版本都支持VS2017工具,也不是每个版本的sdk版本号和Runtime版本号都一样,这就需要我们在创建某个版本的net core应用时注意:使用不同版本的vs时需要对 ...

  5. 将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

    目录 前言 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 消失了 升级到 ASP.NET Core 3.1 项目文件(.csproj) Program. ...

  6. 老牌开源Office操作组件NPOI现已支持.NET Core

    昨天在微信群里听到老牌Excel开发利器NPOI的作者瞿总说4.6.1版本的NPOI已经支持.NET Standard 2.0了,这也就意味着你可以在.NET Core中使用NPOI了. 作者:依乐祝 ...

  7. CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF

    CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF https://devblogs.microsoft.com/dotnet/corewcf-v1-relea ...

  8. 开源:Taurus.MVC 框架 (已支持.NET Core)

    为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...

  9. MongoDB社区版本和企业版本差别

    MongoDB社区版本和企业版本差异主要体现在安全认证.系统认证等方面,具体信息参考下表: 版本特性 社区版本 企业版本 JSON数据模型.自由模式 支持 支持 水平扩展的自动分片功能 支持 支持 内 ...

随机推荐

  1. phpstudy一直使用php5.6版本一直“”“报错应用程序无法正常启动0xc000007b”,亲测可行

    http://www.php.cn/xiazai/gongju/1351 vc9和vc11-vc14运行库 2018-01-26 来源/作者:php中文网 «» 下载次数:7808 工具简介: php ...

  2. ccf-201703-4-地铁修建

    二分+并查集 发现了一个很奇怪的问题,二分的上界设置错了,结果是运行错误...只有95分.后来改了上界就100了,百思不得其解 #include<cstdio> #include<c ...

  3. H3C 用debugging ppp all命令调试PPP

  4. css模仿ipad的日历

    https://www.cnblogs.com/sandraryan/ 题外话之:最近的练习用js之类的写起来会简单点,但是为了巩固基础,只好html和css硬怼页面X﹏X 这是一个日历的代码 注释有 ...

  5. HDU 2674

    0 <= N<=10^9 看到这个数据范围知道常规方法肯定做不出来. 不过一想想既然是mod2009,是不是只要其中含有一个2009,那么其结果一定是0了呢 说了这里思路,就是看什么时候出 ...

  6. Navicat for MySQL 使用SSH方式链接远程数据库(二)

    这里我们使用SSH连接远程mysql数据库 2 SSH这种方式,可以使我们连接到远程服务器,但是现在并不能访问数据库,因为我们还没有连接到数据库 3 既然已经连接到服务器了,我们就该连接服务器上的数据 ...

  7. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

  8. QQ三方登录

    申请了十天,最终通过了审核,能够上线了,事实上申请的第一天,站点的qq登录已经做好了,而且能够用測试帐号登录,但提交审核后,总是通只是,提示:您的站点审核未通过.原因是"未放置QQ登录but ...

  9. P1049 找第K大的数

    题目描述 给定一个无序正整数序列, 以及另一个数n (1<=n<=1000000), 然后以类似快速排序的方法找到序列中第n大的数(关于第n大的数:例如序列{1,2,3,4,5,6}中第3 ...

  10. 2018-10-23-使用-Pandoc-把-Markdown-转-Docx

    title author date CreateTime categories 使用 Pandoc 把 Markdown 转 Docx lindexi 2018-10-23 10:56:18 +080 ...