c#---Socean.Rpc之EasyProxy
目录
简介
这几天给Socean.RPC加上了动态代理,简称EasyProxy,特点是性能高、稳定性好、使用简便
使用入门:
服务端 :
1.定义序列化器和消息处理器
public class RpcSerializer : Socean.Rpc.DynamicProxy.IRpcSerializer
{
public object Deserialize(string content, Type type)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type);
}
public string Serialize(object obj)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
}
}
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(); server.Start<CustomMessageProcessor>();
客户端:
1.定义序列化器
public class RpcSerializer : Socean.Rpc.DynamicProxy.IRpcSerializer
{
public object Deserialize(string content, Type type)
{
return Newtonsoft.Json.JsonConvert.DeserializeObject(content, type);
}
public string Serialize(object obj)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
}
}
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.生成代理服务
, new RpcSerializer());
4.执行函数
bookServiceProxy.RegisterForSale(new Book { Name = "相对论", Price = 108.88 });
bookServiceProxy.AddStock();
其他功能
想实现日志或鉴权等功能,可以使用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
c#---Socean.Rpc之EasyProxy的更多相关文章
- c#---Socean.RPC框架实测[并发量13w][响应时间0.04ms]
目录1.高性能RPC框架:Socean.RPC 前言 经过一段时间的优化,Socean.RPC的性能又提高了一些,不过这差不多是socketAPM模型的极限了.本框架仅仅2000多行代码,无第三方框架 ...
- C# -- 高性能RPC框架:Socean.RPC
简介 Socean.RPC是一个.Net下的高性能RPC框架,框架以高性能.高稳定性为目标,底层基于socket,无第三方库引用,代码简洁,总代码量大约在2000行,框架性能较高,在普通PC上测试,长 ...
- 从RPC开始(一)
这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...
- RPC 使用中的一些注意点
最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验
运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- spider RPC入门指南
本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
随机推荐
- 如何学习理解Redux Middleware
Redux中的middleware其实就像是给你提供一个在action发出到实际reducer执行之前处理一些事情的机会.可以允许我们添加自己的逻辑在这段当中.它提供的是位于 action 被发起之后 ...
- 玩转Django2.0---Django笔记建站基础三(编写URL规则)
第三章 编写URL规则 URL(Uniform Resource Locator,统一资源定位符)是对可以从互联网上得到的资源位置和访问方法简洁的表示,是互联网上标准资源的地址. 在App里由于Dja ...
- URL方案最佳做法|高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
使 URL整洁和人性化 GET(安全交互)和POST(不安全交互):选用正确的一个.
- 简单看看LockSupport和AQS
这次我们可以看看并发中锁的原理,大概会说到AQS,ReentrantLock,ReentrantReadWriteLock以及JDK8中新增的StampedLock,这些都是在java并发中很重要的东 ...
- Map梳理
Map梳理 类型介绍 通用Map:用于在应用程序中管理映射,通常在 java.util 程序包中实现 HashMap.Hashtable.Properties.LinkedHashMap.Identi ...
- SpringCloud与微服务Ⅷ --- Hystrix断路器
复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 服务雪崩 多个微服务之间调用的时候,假设微服务调用服务B和微服务C,微服务B和微服务C又调用其他服务,这就是 ...
- IDEA | Dot Executable: null..No dot executable found
背景 今天想在IDEA上打开.puml后缀的类图,发现IDEA并不能识别,但是正常的时序图却能正常打开,打开类图就报如下错误: 解决方案 经排查,idea的plantuml插件默认只支持时序图,类图还 ...
- PAT (Advanced Level) Practice 1001-1005
PAT (Advanced Level) Practice 1001-1005 PAT 计算机程序设计能力考试 甲级 练习题 题库:PTA拼题A官网 背景 这是浙大背景的一个计算机考试 刷刷题练练手 ...
- Dubbo(三):深入理解Dubbo源码之如何将服务发布到注册中心
一.前言 前面有说到Dubbo的服务发现机制,也就是SPI,那既然Dubbo内部实现了更加强大的服务发现机制,现在我们就来一起看看Dubbo在发现服务后需要做什么才能将服务注册到注册中心中. 二.Du ...
- VC简单操作mysql
#include <iostream> #include <winsock.h> #include <mysql.h> #pragma comment(lib, & ...