MicroService.Core简易微服务框架《一、简介》
MicroService.Core
MicroService.Core的初衷是为了方便的创建一个微服务, 可作为 Windows Service 或者控制台模式启动。 它底层使用了 OWin 自托管技术,抛弃了微软 Mvc 的那套东 西,进而选择了 Nancy,使得开发过程很顺心,很简单!
快速入门
一、创建控制台项目(需要.net 4.5以上)
二、安装Nuget包
PM> Install-Package MicroService.Core -Version 1.1.1
或在 Nuget 包管理器中搜索 MicroService.Core 安装。
三、编写 Program.cs,输入以下代码
添加引用:using MicroService.Core; Main 方法中写如下代码:
var service = new MicroServiceBase("MyService");
service.Run(args);
这时 Program.cs 文件内容如下
using MicroService.Core;
namespace MicroService.Samples
{
class Program
{
static void Main(string[] args)
{
var service = new MicroServiceBase("MyService");
service.Run(args);
}
}
}
生成项目,然后在生成的 EXE 文件目录下打开一个命令行窗口,执行:
如生成的 EXE 文件为
MicroService.Samples.exe
1、命令行模式运行:
MicroService.Samples.exe --console
即可看到如下的运行效果:

2、Windows 服务模式
MicroService.Samples.exe --install
运行结果如果出现下面这个情况:

是因为权限不够,无法安装windows服务,以管理员权限运行命令行窗口再次执行以上命令, 截图如下:

查看 Windows 服务 列表,可以看到此服务已经正常运行:

四、如何测试此服务是否已经正常运行?
此微服务框架默认提供了服务状态地址 /health,如图,默认绑定地址是 http://127.0.0.1:8080,从浏览器访问地址http://127.0.0.1:8080/health 可以得到如下的输出:

可以看出服务的一些情况,运行时常,暴露端点等等...
五、是否被惊到?
仅仅3行代码,抛去 using 引用,就只有2行代码,就可以做一个可以运行在命令行 /windows 服务的对外提供 API 能力的程序。
原理
- 通过集成 Owin 使得她有了自托管的能力
- 通过实现了一个内部的 ServiceBase 类使得她有了能作为 windows 服务运行的能力
- 通过集成 Nancy (http://nancyfx.org/) 使得她有了很容易开放 Api 服务的能力
有人可能会说,这有个鸟用?先别急,我们来扩展一下,做个什么呢? 就先来个加法器吧,输入两个数字,返回两个数字之和。
进阶
一、写一个 Nancy 模块:
关于 Nancy 模块的编写,请自行前往链接 http://nancyfx.org/ 学习,作为技术人员,学习是必不可少的技能。当然,你看到这里,先不用着急去学习 Nancy, 继续往下看,很简单的!
1、新增一个类
在项目中新建一个名为 AddModule 的 Nancy 模块,代码如下:
using Nancy;
using System.Threading.Tasks;
namespace MicroService.Samples
{
public class AddModule : NancyModule
{
public AddModule()
{
Get["/add", true] = async (_, ctx) =>
{
return await Task.Run(() =>
{
int? num1 = Request.Query.num1;
int? num2 = Request.Query.num2;
if (num1.HasValue && num2.HasValue)
{
return $"{num1} + {num2} = {num1 + num2}";
}
return "Paramters num1 and num2 missing!";
});
};
}
}
}
这段代码可能对没有 Nancy 模块经验的人,稍微有点难度,但是代码通俗易懂,一看就会!
停掉上面运行的 Windows 服务,然后重新生成项目,启动服务。
访问浏览器:http://127.0.0.1:8080/add?num1=1&num2=2

如果不出意外,你的运行结果应该和我无异!
到这里可能你有点想法了,那我不能用 VS 调试吗? 答案是:可以!
在 VS 项目上右键,进入项目属性页面,在调试选项卡下的启动参数里输入 --console,然后启动项目 如图:

现在重新看看控制台的运行效果:

看红色箭头处,新增了两行,加载刚刚新建的模块成功!
连暴露的URL都列出来了,是否很贴心?
到这里我感觉还是没有体现出他的优势,我们再将这个项目处理处理!
2、再单独新建一个类 RedisService.cs
代码如下:
using System;
namespace MicroService.Samples
{
public class RedisService
{
public string RedisServiceStatus
{
get
{
var rnd = new Random().Next(1, 10);
if (rnd % 3 == 0)
{
return "DOWN";
}
return "UP";
}
}
}
}
代码很简单,只有一个只读属性,获取了 Redis 服务的状态(模拟)。 下面,我们把他加入到上面的 /health 端点中,让我们的服务更加直观的展示出整体服务的状态。
修改 Program.cs 类中的代码:
using MicroService.Core;
using Nancy.TinyIoc;
namespace MicroService.Samples
{
class Program
{
static void Main(string[] args)
{
var service = new MicroServiceBase("MyService");
service.OnServiceStarting += Service_OnServiceStarting;
service.OnServiceStatusUpdating += Service_OnServiceStatusUpdating;
service.Run(args);
}
/// <summary>
/// 服务启动之前执行事件
/// </summary>
/// <param name="service"></param>
/// <param name="container"></param>
private static void Service_OnServiceStarting(
MicroServiceBase service,
TinyIoCContainer container)
{
var redisService = new RedisService();
container.Register(redisService);
}
/// <summary>
/// 服务状态更新事件
/// </summary>
/// <param name="service"></param>
/// <param name="serviceStatus"></param>
private static void Service_OnServiceStatusUpdating(
MicroServiceBase service,
ServiceStatus serviceStatus)
{
var redisService = service.GetComponent<RedisService>();
if (redisService != null)
{
serviceStatus.AddOrUpdate("RedisStatus", redisService.RedisServiceStatus);
}
}
}
}
有人可能要骂我了,你 TM 逗我啊,这叫简单?其实仔细看看不难!
加了两个事件,服务启动之前执行事件和服务状态更新事件,在服务启动之前执行事件代码中, 使用 Nancy 内置的 TinyIoCContainer IoC容器注册了一个 RedisService 的实例。 在服务状态更新事件中,通过 service.GetComponent<RedisService>() 获取到了这个 RedisService 实例,在 serviceStatus 添加进去。
现在,再次运行,看看结果:

这样就完成了一个小型的微服务啦,当然这条路还很长,这只是一个核心框架。 有兴趣的童鞋,可以深入研究一下,欢迎探讨!
QQ: 491217650 邮件:admin@mrhuo.com
现在时间 2017-11-05 03:52:10,夜深了,该睡了!晚点再写其他的教程!
Github 开源地址:https://github.com/mrhuo/MicroService.Core
MicroService.Core简易微服务框架《一、简介》的更多相关文章
- 基于.NET CORE微服务框架 -谈谈surging API网关
1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中剥析下surging的Api 网关 开源地址:https://git ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- net core 微服务框架 Viper 调用链路追踪
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- hello world .net core 微服务框架 Viper
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
- 基于.NET CORE微服务框架 -浅析如何使用surging
1.前言 surging受到大家这么强烈的关注,我感到非常意外,比如有同僚在公司的分享会上分享surging, 还有在博客拿其它的RPC框架,微服务做对比等等,这些举动都让我感觉压力很大,毕竟作为个人 ...
- .NET Core Community 第四个千星项目诞生:微服务框架 Surging
本文所有打赏将全数捐赠于 NCC(NCC 的资金目前由 倾竹大人 负责管理),请注明捐赠于 NCC.捐赠情况将由倾竹大人在此处公示. 提及 .NET 微服务,我们脑海中浮现的一系列印象中,总有 Sur ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:4、微服务应用程序发布到Docker部署(上)。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- 微服务框架之微软Service Fabric
常见的微服务架构用到的软件&组件: docker(成熟应用) spring boot % spring cloud(技术趋势) Service Fabric(属于后起之秀 背后是微软云的驱动) ...
随机推荐
- [python学习笔记] python程序打包成exe文件
安装 pyinstaller pip3 install pyinstaller 命令 pyinstaller -F -w -i ../ui/icon.ico --clean ../Login.py 参 ...
- NameError: name 'messagebox' is not defined 错误处理
写了段代码,想在按下button的时候跳个提示框出来,调试的时候提示了messagebox未定义 from tkinter import * def test_show(): messagebox.s ...
- oracle 数据字典和动态性能视图
一.概念数据字典是oracle数据库中最重要的组成部分,它提供了数据库的一些系统信息.动态性能视图记载了例程启动后的相关信息. 二.数据字典1).数据字典记录了数据库的系统信息,它是只读表和视图的集合 ...
- return及break区别
一.break 语句 中止当前循环,switch 语句或 label 语句,并把程序控制流转到紧接着被中止语句后面的语句. 示例 下面的函数里有个 break 语句,当 i 为 3 时,会中止 whi ...
- NET应用——使用RSA构建相对安全的数据交互
最近又被[现场破解共享单车系统]刷了一脸,不得不开始后怕:如何防止类似的情况发生? 想来想去,始终觉得将程序加密是最简单的做法.但是摩拜.ofo也有加密,为什么仍然被破解?那是因为请求在传输过程中被篡 ...
- 石子合并(NOI1995)
石子合并(NOI1995) 时间限制: 1 Sec 内存限制: 128 MB提交: 90 解决: 48[提交][状态][讨论版] 题目描述 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并 ...
- sql的存储过程使用详解--基本语法
存储过程简介 SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储 ...
- BaseServlet,让一个servlet处理多个请求
BaseServlet 第一次学习servlet的时候是跟着传智播客免费的教学视频,其中崔希凡讲的是我学过自认讲的最好的一位,BaseServlet也是跟着他写过一次,当时很多东西不能理解,后来慢慢发 ...
- 深度学习入门篇--手把手教你用 TensorFlow 训练模型
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:付越 导语 Tensorflow在更新1.0版本之后多了很多新功能,其中放出了很多用tf框架写的深度网络结构(https://git ...
- 反射型 DDoS 攻击的原理和防范措施
随着僵尸网络的兴起,同时由于攻击方法简单.影响较大.难以追查等特点,分布式拒绝服务攻击(DDoS,Distributed Denial of Service)得到快速壮大和日益泛滥. 成千上万主机组成 ...