Thrifty Project
Thrifty.Net is a port of Swift(from facebook) for .Net , an attribute-based library for creating Thrift serializable types and services.
you can write C# attributed object instead of IDL file and IDL generation cli.
Thrifty = Thrift + Netty
OS | Testing |
---|---|
Linux |
|
Windows |
|
Thrifty Benchmark
end to end connection without connection pool
BenchmarkDotNet=v0.10.8, OS=Windows 10 Redstone 1 (10.0.14393) Processor=Intel Core i5-6300HQ CPU 2.30GHz (Skylake), ProcessorCount=4 Frequency=2250001 Hz, Resolution=444.4442 ns, Timer=TSC dotnet cli version=1.0.4 [Host] : .NET Core 4.6.25211.01, 64bit RyuJIT [AttachedDebugger] DefaultJob : .NET Core 4.6.25211.01, 64bit RyuJIT
Method | Mean | Error | StdDev |
---|---|---|---|
'LogCase.Log (Direct)' | 1.054 ms | 0.0090 ms | 0.0084 ms |
'LogCase.GetMessages (Direct)' | 1.047 ms | 0.0109 ms | 0.0091 ms |
locating services use Eureka,without connection pool
BenchmarkDotNet=v0.10.8, OS=Windows 10 Redstone 1 (10.0.14393) Processor=Intel Core i5-6300HQ CPU 2.30GHz (Skylake), ProcessorCount=4 Frequency=2250001 Hz, Resolution=444.4442 ns, Timer=TSC dotnet cli version=1.0.4 [Host] : .NET Core 4.6.25211.01, 64bit RyuJIT [AttachedDebugger] DefaultJob : .NET Core 4.6.25211.01, 64bit RyuJIT
Method | Mean | Error | StdDev |
---|---|---|---|
'LogCase.Log (Eureka)' | 1.104 ms | 0.0210 ms | 0.0207 ms |
'LogCase.GetMessages (Eureka)' | 1.108 ms | 0.0182 ms | 0.0161 ms |
locating services use Eureka,with connection pool
BenchmarkDotNet=v0.10.8, OS=Windows 10 Redstone 1 (10.0.14393) Processor=Intel Core i5-6300HQ CPU 2.30GHz (Skylake), ProcessorCount=4 Frequency=2250001 Hz, Resolution=444.4442 ns, Timer=TSC dotnet cli version=1.0.4 [Host] : .NET Core 4.6.25211.01, 64bit RyuJIT [AttachedDebugger] DefaultJob : .NET Core 4.6.25211.01, 64bit RyuJIT
Method | Mean | Error | StdDev | Median |
---|---|---|---|---|
'LogCase.GetMessages (Eureka&Pool)' | 302.1 us | 6.023 us | 14.55 us | 298.5 us |
'LogCase.Log (Eureka&Pool)' | 294.9 us | 6.789 us | 19.70 us | 289.2 us |
Serialization
Thrifty Codec convert POCO to and from Thrift. Thrifty support property、method、construction attributed. for example:
[ThriftStruct] public class LogEntry { [ThriftConstructor] public LogEntry([ThriftField(1)]String category, [ThriftField(2)]String message) { this.Category = category; this.Message = message; } [ThriftField(1)] public String Category { get; } [ThriftField(2)] public String Message { get; } }
Service
Thrifty Service attribute services to be exported with Thrift. For example:
[ThriftService("scribe")] public interface IScribe { [ThriftMethod("getMessages")] List<LogEntry> GetMessages(); [ThriftMethod] ResultCode Log(List<LogEntry> messages); } public class Scribe : IScribe { public List<LogEntry> GetMessages() { return new List<LogEntry> { new LogEntry { Category = "c1", Message = Guid.NewGuid().ToString() }, new LogEntry { Category = "c2", Message = Guid.NewGuid().ToString() }, new LogEntry { Category = "c3", Message = Guid.NewGuid().ToString() } }; } public ResultCode Log(List<LogEntry> messages) { return ResultCode.TRY_LATER; } }
Start Server
var factory = new LoggerFactory(); factory.AddConsole(LogLevel.Debug); var serverConfig = new ThriftyServerOptions { QueueTimeout = TimeSpan.FromMinutes(1), TaskExpirationTimeout = TimeSpan.FromMinutes(1), ConnectionLimit = 10000 }; var bootStrap = new ThriftyBootstrap(new object[] { new Scribe() }, serverConfig, new InstanceDescription("Sample", "EurekaInstance1", "127.0.0.1"), factory); bootStrap .SslConfig(new SslConfig { CertFile = "server.pfx", CertPassword = "abc@123", CertFileProvider = new EmbeddedFileProvider(typeof(Program).GetTypeInfo().Assembly) }) .AddService(typeof(IScribe), version: "1.0.0") //true to register into eureka , disable eureka , set to false .EurekaConfig(true, new EurekaClientConfig { EurekaServerServiceUrls = "http://192.168.0.10:8761/eureka" }) // bind any .Bind(IPAddress.Any.ToString(), 3366) .StartAsync();
Use Client
var factory = new LoggerFactory(); using (var client = new ThriftyClient(new ThriftyClientOptions { LoggerFactory = factory, ConnectionPoolEnabled = true, // default is true EurekaEnabled = true, //default is true Eureka = new ThriftyClientEurekaConfig { EurekaServerServiceUrls = "http://192.168.0.10:8761/eureka" } //optional })) { /** *************if without eureka:***************** * var service = client.Create<Thrifty.IScribe>("127.0.0.1:3366", new ClientSslConfig { CertFile = "ca.crt", FileProvider = new EmbeddedFileProvider(typeof(ClientProgram).GetTypeInfo().Assembly) }); */ var service = client.Create<Thrifty.IScribe>("1.0.0", "EurekaInstance1", new ClientSslConfig { CertFile = "ca.crt", FileProvider = new EmbeddedFileProvider(typeof(ClientProgram).GetTypeInfo().Assembly) }); var logs = service.GetMessages(); ... }
Documents
document is here (Only Chinese documents are available now).
Dependecy (our another project)
Chopin is a port of Apache Commons Object Pooling Library for .Net, to implement thrifty client connection pool.
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。