c#---Socean.Rpc之EasyProxy
目录
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); } }
- 点赞
- 收藏
- 分享
- 文章举报
- 使用XML-RPC来控制Webmin
- go rpc 简单用法
- RPC的有关问题及其解决方法
- thriftrpc编译安装和开发环境的搭建
- 冯彦文:在ajax环境下使用rpc
- 分布式架构核心RPC原理
- 两种RPC编程
- 如何实现一个简单的rpc框架
- Java RPC通信机制之SOAP:应用Apache Axis进行Web Service开发
- RPC远程调用概念 && demo实例
- (word导出问题)解决:服务器出现意外情况。 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))的解决方法
- RPC
- MS Windows DNS RPC Remote Buffer Overflow Exploit (win2k SP4)
- 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
- ISA 发生RPC通信问题排错方法
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试,零基础(2)
- XML-RPC
- WEB开发中,使用JSON-RPC好,还是RESTful API好?
- RPC漏洞的通用分析方法
- 深入了解 gRPC:协议