接触微服务框架已经很久了,很久之前就想写一个基于.net framework的微服务框架,奈何一直忙(LAN),最近终于抽出时间,实现了微服务通讯的主要功能,包括服务注册中心,微服务服务端以及微服务客户端。下面将逐一模块进行介绍SOA框架使用方式,
1 客户端主要类
1.1 ServicePool(服务池)
1.1.1 设置服务中心地址(SetServiceCenterInfo)
用于设置服务中心地址,设置服务中心地址后,可以自动收到服务中心推送的服务列表。而不需客户端一一订阅,并且当微服务集群某个节点down机后,会自动收到服务中心通知并且更新服务列表。从而剔除不响应的节点。
1.1.1.1 使用方式
ServicePool servicePool = new ServicePool();
servicePool.SetServiceCenterInfo("192.168.1.101", 5001);
1.1.2 订阅服务(SubMicroService)
从服务池中订阅微服务,返回MicroService(微服务)对象。
1.1.2.1 使用方式
ServicePool servicePool = new ServicePool();
servicePool.SetServiceCenterInfo("192.168.1.101", 5001);
var userService = servicePool.SubMicroService("UserService");
1.1.3 不通过服务注册中心订阅服务(SubWithoutServiceCenter)
跳过服务注册中心,直接订阅微服务,在测试环境下,有时不需要服务中心,跳过服务中心,直接订阅微服务即可。
1.1.3.1 使用方式
ServicePool servicePool = new ServicePool();
servicePool.SetServiceCenterInfo("192.168.1.101", 5001);
var userService= servicePool.SubWithoutServiceCenter("User",new ServerInfo {
Ip="192.168.1.101",
Port=5000,
IsEnable=true
})
1.2 MicroService(微服务)
1.2.1 调用微服务接口(Invoke)
调用微服务提供的接口。
1.2.1.1 使用方式
var res = userService.Invoke("UserService/GetUser", "UserId");或者
var res = userService.Invoke<T>("UserService/GetUser", "UserId");
方法1直接返回json,方法2会将json序列化成T对象后返回。
1.2.2 异步调用微服务接口(InvokeAsync)
为什么要有异步调用呢?比如有这样一个需求,客户端界面需要显示订单的基本信息(购买用户、下单时间、订单状态等)以及订单物流信息,而订单基本信息数据以及订单物流信息数据分别由不同的微服务提供。假如获取订单基本信息耗时150毫秒,获取订单物流信息耗时120毫秒,则客户端界面调用接口耗时为150毫秒+120毫秒=270毫秒,如果采用异步调用,则耗时会大概在150毫秒左右。提高系统的响应速度。
1.2.2.1 使用方式
var t1= userService.InvokeAsync("OrderService/GetDetail", "OrderId");
var t2 = userService.InvokeAsync("ExpressService/GetExpressInfo", "OrderId");
Task.WaitAll(t1, t2);
var res1= t1.Result;
var res2 = t2.Result;
2 服务端
2.1 MicroServiceEngine(服务引擎)
2.1.1 启动监听(Start)
启动监听,监听客户端的调用。同一个微服务可以发布多个节点,即服务Key相同,ip或者端口不通。
2.1.1.1 使用方式
MicroServiceEngine serviceEngine = new MicroServiceEngine();
serviceEngine.Start("192.168.1.101",5000);
2.1.2 将服务发布到服务注册中心(PublishToServiceCenter)
将服务发布到服务注册中心,发布到服务中心后,客户端会自动收到服务列表推送。
2.1.2.1 使用方式
serviceEngine.PublishToServiceCenter("UserService","192.168.1.101", 5001);
2.1.3 发布Api接口(PublishApi)
发布微服务接口。调用发布Api方法后,服务引擎会通过反射获取当前应用程序所有基类为RocService的类,并且将类中所有方法发布到Api集合中,供客户端调用。关于如何写一个服务端接口,例子如下:
2.1.3.1 使用方式
serviceEngine.PublishApi();
3 服务注册中心
服务注册中心使用起来相对简单。只需启动监听即可。
ServerCenter ServerCenter = new ServerCenter();
ServerCenter.Start("192.168.1.101", 5001);
4 简易例子
实现从服务注册中心获取服务列表,并且调用微服务UserService提供的GetUser接口的例子。
1)实例化服务注册中心,并且启动监听,采用Console Application。
代码如下:
启动后界面如下:
由于没有任何输出,所以黑屏。。
2)发布微服务接口
- 实例化服务引擎类,启动监听
- 发布到服务中心(参数为Key(客户端将通过key订阅服务),服务中心Ip,服务中心端口
- 发布接口
调用PublishApi后,微服务引擎或自动将发布以下方法:
4.启动程序
启动后界面如下:
微服务会向服务注册中心发送心跳包,证明我还活着。
3)调用微服务提供的接口
- 实例化ServicePool,并设置服务注册中心地址
- 订阅服务,并获取微服务对象
- 调用接口
启动程序后界面如图:
可以看出调用微服务接口成功,输出的信息为微服务接口返回的数据。
以上为Roc.SOAFramework使用方式,后续将一一介绍各个模块实现思路。。