MicroService.Core简易微服务框架《一、简介》_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MicroService.Core简易微服务框架《一、简介》

MicroService.Core简易微服务框架《一、简介》

 2017/11/5 10:21:39  MrHuo工作室  程序员俱乐部  我要评论(0)
  • 摘要:MicroService.CoreMicroService.Core的初衷是为了方便的创建一个微服务,可作为WindowsService或者控制台模式启动。它底层使用了OWin自托管技术,抛弃了微软Mvc的那套东西,进而选择了Nancy,使得开发过程很顺心,很简单!快速入门一、创建控制台项目(需要.net4.5以上)二、安装Nuget包PM>Install-PackageMicroService.Core-Version1.1.1或在Nuget包管理器中搜索MicroService
  • 标签:Service 简介 服务

system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 1.5em; font-style: normal; font-weight: 600; margin-top: 0px !important; margin-bottom: 16px; word-spacing: 0px; border-bottom-color: #eaecef; border-bottom-width: 1px; border-bottom-style: solid; white-space: normal; box-sizing: border-box; orphans: 2; widows: 2; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">MicroService.Core

monospace; font-size: 13.6px; box-sizing: border-box; background-color: rgba(27, 31, 35, 0.047058);">MicroService.Coreclass="Apple-converted-space"> 的初衷是为了方便的创建一个微服务, 可作为 Windows Service 或者控制台模式启动。 它底层使用了 OWin 自托管技术,抛弃了微软 Mvc 的那套东 西,进而选择了 Nancy,使得开发过程很顺心,很简单!

快速入门

一、创建控制台项目(需要.net 4.5以上)

二、安装Nuget包

break: normal; -ms-word-wrap: normal; box-sizing: border-box;">PM> Install-Package MicroService.Core -Version 1.1.1

或在 Nuget 包管理器中搜索 MicroService.Core 安装。

三、编写 Program.cs,输入以下代码

添加引用:using MicroService.Core; Main 方法中写如下代码:

1 var service = new MicroServiceBase("MyService");
2 service.Run(args);

这时 Program.cs 文件内容如下

 1 using MicroService.Core;
 2 namespace MicroService.Samples
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             var service = new MicroServiceBase("MyService");
 9             service.Run(args);
10         }
11     }
12 }

生成项目,然后在生成的 EXE 文件目录下打开一个命令行窗口,执行:

如生成的 EXE 文件为 MicroService.Samples.exe

1、命令行模式运行:
MicroService.Samples.exe --console

即可看到如下的运行效果:

 Sample1canonical-src="/Upload/Images/2017110510/90DF7A02C2349BE5.png" />

2、Windows 服务模式
MicroService.Samples.exe --install

运行结果如果出现下面这个情况:

 Sample2

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

 Sample3

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

 Sample4

四、如何测试此服务是否已经正常运行?

此微服务框架默认提供了服务状态地址 /health,如图,默认绑定地址是 http://127.0.0.1:8080,从浏览器访问地址http://127.0.0.1:8080/health 可以得到如下的输出:

 Sample5 

可以看出服务的一些情况,运行时常,暴露端点等等...

五、是否被惊到?

仅仅3行代码,抛去 using 引用,就只有2行代码,就可以做一个可以运行在命令行 /windows 服务的对外提供 API 能力的程序。

原理

  • 通过集成 Owin 使得她有了自托管的能力
  • 通过实现了一个内部的 ServiceBase 类使得她有了能作为 windows 服务运行的能力
  • 通过集成 Nancy (http://nancyfx.org/) 使得她有了很容易开放 Api 服务的能力

有人可能会说,这有个鸟用?先别急,我们来扩展一下,做个什么呢? 就先来个加法器吧,输入两个数字,返回两个数字之和。

进阶

一、写一个 Nancy 模块:

关于 Nancy 模块的编写,请自行前往链接 http://nancyfx.org/ 学习,作为技术人员,学习是必不可少的技能。当然,你看到这里,先不用着急去学习 Nancy, 继续往下看,很简单的!

1、新增一个类

在项目中新建一个名为 AddModule 的 Nancy 模块,代码如下:

 1 using Nancy;
 2 using System.Threading.Tasks;
 3 namespace MicroService.Samples
 4 {
 5     public class AddModule : NancyModule
 6     {
 7         public AddModule()
 8         {
 9             Get["/add", true] = async (_, ctx) =>
10             {
11                 return await Task.Run(() =>
12                 {
13                     int? num1 = Request.Query.num1;
14                     int? num2 = Request.Query.num2;
15                     if (num1.HasValue && num2.HasValue)
16                     {
17                         return $"{num1} + {num2} = {num1 + num2}";
18                     }
19                     return "Paramters num1 and num2 missing!";
20                 });
21             };
22         }
23     }
24 }

这段代码可能对没有 Nancy 模块经验的人,稍微有点难度,但是代码通俗易懂,一看就会!

停掉上面运行的 Windows 服务,然后重新生成项目,启动服务。

访问浏览器:http://127.0.0.1:8080/add?num1=1&num2=2

 Sample6

如果不出意外,你的运行结果应该和我无异!

到这里可能你有点想法了,那我不能用 VS 调试吗? 答案是:可以!

在 VS 项目上右键,进入项目属性页面,在调试选项卡下的启动参数里输入 --console,然后启动项目 如图:

 Sample7

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

 Sample8

看红色箭头处,新增了两行,加载刚刚新建的模块成功!

连暴露的URL都列出来了,是否很贴心?

到这里我感觉还是没有体现出他的优势,我们再将这个项目处理处理!

2、再单独新建一个类 RedisService.cs

代码如下:

 1 using System;
 2 namespace MicroService.Samples
 3 {
 4     public class RedisService
 5     {
 6         public string RedisServiceStatus
 7         {
 8             get
 9             {
10                 var rnd = new Random().Next(1, 10);
11                 if (rnd % 3 == 0)
12                 {
13                     return "DOWN";
14                 }
15                 return "UP";
16             }
17         }
18     }
19 }

代码很简单,只有一个只读属性,获取了 Redis 服务的状态(模拟)。 下面,我们把他加入到上面的 /health 端点中,让我们的服务更加直观的展示出整体服务的状态。

修改 Program.cs 类中的代码:

 1 using MicroService.Core;
 2 using Nancy.TinyIoc;
 3 namespace MicroService.Samples
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             var service = new MicroServiceBase("MyService");
10             service.OnServiceStarting += Service_OnServiceStarting;
11             service.OnServiceStatusUpdating += Service_OnServiceStatusUpdating;
12             service.Run(args);
13         }
14         /// <summary>
15         /// 服务启动之前执行事件
16         /// </summary>
17         /// <param name="service"></param>
18         /// <param name="container"></param>
19         private static void Service_OnServiceStarting(
20             MicroServiceBase service, 
21             TinyIoCContainer container)
22         {
23             var redisService = new RedisService();
24             container.Register(redisService);
25         }
26         /// <summary>
27         /// 服务状态更新事件
28         /// </summary>
29         /// <param name="service"></param>
30         /// <param name="serviceStatus"></param>
31         private static void Service_OnServiceStatusUpdating(
32             MicroServiceBase service, 
33             ServiceStatus serviceStatus)
34         {
35             var redisService = service.GetComponent<RedisService>();
36             if (redisService != null)
37             {
38                 serviceStatus.AddOrUpdate("RedisStatus", redisService.RedisServiceStatus);
39             }
40         }
41     }
42 }

有人可能要骂我了,你 TM 逗我啊,这么多代码这叫简单?其实仔细看看不难!

加了两个事件,服务启动之前执行事件和服务状态更新事件,在服务启动之前执行事件代码中, 使用 Nancy 内置的 TinyIoCContainer IoC容器注册了一个 RedisService 的实例。 在服务状态更新事件中,通过 service.GetComponent<RedisService>() 获取到了这个 RedisService 实例,在 serviceStatus 添加进去。

现在,再次运行,看看结果:

 Sample9

这样就完成了一个小型的微服务啦,当然这条路还很长,这只是一个核心框架。 有兴趣的童鞋,可以深入研究一下,欢迎探讨!

QQ: 491217650 邮件:admin@mrhuo.com

现在时间 2017-11-05 03:52:10,夜深了,该睡了!晚点再写其他的教程!

Github 开源地址:https://github.com/mrhuo/MicroService.Core

上一篇: 剖析Java泛型通配符 下一篇: 没有下一篇了!
发表评论
用户名: 匿名