您的位置:首页 > 编程语言 > C#

c#---Socean.Rpc之EasyProxy

2020-04-25 07:29 1251 查看

目录

1.高性能RPC框架:Socean.RPC

2.Socean.RPC框架实测

3.Socean.Rpc之EasyProxy

简介

这几天给Socean.RPC加上了动态代理,简称EasyProxy,特点是性能高、稳定性好、使用简便

 

使用入门:

服务端 :

1.定义序列化器和消息处理器

 

public class RpcSeralizer : Socean.Rpc.DynamicProxy.IBinarySerializer
{
public object Deserialize(byte[] contentBytes, Type type)
{
var content = Encoding.UTF8.GetString(contentBytes);
return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type);
}

public byte[] Serialize(object obj)
{
var content = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
return Encoding.UTF8.GetBytes(content);
}
}

public class CustomMessageProcessor : Socean.Rpc.DynamicProxy.EasyProxyMessageProcessor
{
public override void Init(IServiceHost serviceHost)
{
serviceHost.RegisterServices(Assembly.GetExecutingAssembly(), new RpcSerializer());
}
}

 

2.定义服务

public class Book
{
public string Name { get; set; }

public double Price { get; set; }
}

[RpcService]
public class BookService
{
public bool RegisterForSale(Book book)
{
Console.WriteLine("RegisterForSale,bookName:{0},bookPrice:{1}", book.Name, book.Price);
return true;
}

public void AddStock(string bookName, int count)
{
Console.WriteLine("AddStock,bookName:{0},count:{1}", bookName, count);
}
}

 

3.启动服务

var server = new RpcServer();
server.Bind(IPAddress.Parse("127.0.0.1"), 11111);
server.Start<CustomMessageProcessor>();

 

客户端:

1.定义序列化器

 

public class RpcSeralizer : Socean.Rpc.DynamicProxy.IBinarySerializer
{
public object Deserialize(byte[] contentBytes, Type type)
{
var content = Encoding.UTF8.GetString(contentBytes);
return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type);
}

public byte[] Serialize(object obj)
{
var content = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
return Encoding.UTF8.GetBytes(content);
}
}

 

2.定义服务接口

[RpcProxy(ServiceName = "BookService")]
public interface IBookService
{
bool RegisterForSale(Book book);

void AddStock(string bookName, int count);
}

public class Book
{
public string Name { get; set; }

public double Price { get; set; }
}

 

3.生成代理服务

var bookServiceProxy = EasyProxyGenerator<IBookService>.Create(IPAddress.Parse("127.0.0.1"), 11111, new RpcSerializer());

 

4.执行函数

bookServiceProxy.RegisterForSale(new Book { Name = "相对论", Price = 108.88 });
bookServiceProxy.AddStock("相对论", 1000);

 

其他功能

想实现日志或鉴权等功能,可以使用ServiceFilter

1.定义日志记录ServiceFilter

public class LogFilter : IServiceFilter
{
public void Do(ServiceContext context, FilterChain filterChain)
{
Console.WriteLine("before request");

filterChain.DoNext(context);

Console.WriteLine("after request");
}
}


2.注册日志记录Filter

public class CustomMessageProcessor : Socean.Rpc.DynamicProxy.EasyProxyMessageProcessor
{
public override void Init(IServiceHost serviceHost)
{
serviceHost.RegisterServices(Assembly.GetExecutingAssembly(), new RpcSerializer());

serviceHost.RegisterFilter(new LogFilter());
}
}

 

测试

    简单测试了一下IBookService.AddStock方法,在我的破旧笔记本上测试,并发量大约5w/秒(压测时请注释掉AddStock内部的Console.WriteLine函数,因为此函数并发不高,会影响测试结果)

项目地址

项目地址:https://github.com/ch00486259/Socean.Rpc

 

public class RpcSeralizer : Socean.Rpc.DynamicProxy.IBinarySerializer    {        public object Deserialize(byte[] contentBytes, Type type)        {            var content = Encoding.UTF8.GetString(contentBytes);            return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type);        }
        public byte[] Serialize(object obj)        {            var content = Newtonsoft.Json.JsonConvert.SerializeObject(obj);            return Encoding.UTF8.GetBytes(content);        }    }

  • 点赞
  • 收藏
  • 分享
  • 文章举报
rizon886 发布了2 篇原创文章 · 获赞 0 · 访问量 1018 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: