Viper 是.NET平台下的Anno微服务框架的一个示例项目。入门简单安全稳定高可用全平台可监控。底层通讯可以随意切换thrift grpc 自带服务发现、调用链追踪、Cron 调度、限流、事件总线、CQRS 、DDD、类似MVC的开发体验,插件化开发  

 github: https://github.com/duyanming/Viper

文档地址: https://duyanming.github.io/

体验地址: http://140.143.207.244/

如果对Viper不了解可以看:

  1、 net core 微服务 快速开发框架 Viper 初体验

  2、打不死的小强 .net core 微服务 快速开发框架 Viper 限流

       3、net core 微服务框架 Viper 调用链路追踪

       4、hello world .net core 微服务框架 Viper-01

  前面章节我们已经创建好了一个HelloWorldService 服务,这一小节我们来编写一个HelloWorld插件。启动注册中心ViperCenter 修改HelloWorldService 注册中心地址。

  新建一个HelloWorld功能插件, 稍后我们以同样的方式添加一个SoEasy功能插件。最后我们让两个插件相互调用并输出结果。

添加Anno功能插件依赖

  1. Install-Package Anno.EngineData -Version 1.0.2.6

增加一个插件启动初始化配置类 HelloWorldBootStrap

  1. using Anno.EngineData;
  2. using System;
  3. namespace Anno.Plugs.HelloWorldService
  4. {
  5. /// <summary>
  6. /// 插件启动引导器
  7. /// DependsOn 依赖的类型程序集自动注入DI容器
  8. /// </summary>
  9. [DependsOn(
  10. //typeof(Domain.Bootstrap)
  11. //, typeof(QueryServices.Bootstrap)
  12. //, typeof(Repository.Bootstrap)
  13. //, typeof(Command.Handler.Bootstrap
  14. )]
  15. public class HelloWorldBootStrap : IPlugsConfigurationBootstrap
  16. {
  17. /// <summary>
  18. /// Service 依赖注入构建之后调用
  19. /// </summary>
  20. public void ConfigurationBootstrap()
  21. {
  22. //throw new NotImplementedException();
  23. }
  24. /// <summary>
  25. /// Service 依赖注入构建之前调用
  26. /// </summary>
  27. /// </summary>
  28. public void PreConfigurationBootstrap()
  29. {
  30. //throw new NotImplementedException();
  31. }
  32. }
  33. }

 

增加一个业务模块 HelloWorldViperModule

  1. /******************************************************
  2. Writer:Du YanMing
  3. Mail:dym880@163.com
  4. Create Date:2020/10/30 13:15:24
  5. Functional description: HelloWorldViperModule
  6. ******************************************************/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. namespace Anno.Plugs.HelloWorldService
  11. {
  12. using Anno.Const.Attribute;
  13. using Anno.EngineData;
  14. using HelloWorldDto;
  15. public class HelloWorldViperModule: BaseModule
  16. {
  17. [AnnoInfo(Desc = "世界你好啊SayHi")]
  18. public dynamic SayHello([AnnoInfo(Desc = "称呼")] string name, [AnnoInfo(Desc = "年龄")] int age) {
  19. Dictionary<string, string> input = new Dictionary<string, string>();
  20. input.Add("vName",name);
  21. input.Add("vAge", age.ToString());
  22. var soEasyMsg = Newtonsoft.Json.JsonConvert.DeserializeObject<ActionResult<string>>(this.InvokeProcessor("Anno.Plugs.SoEasy", "AnnoSoEasy", "SayHi", input)).OutputData;
  23. return new { HelloWorldViperMsg = $"{name}你好啊,今年{age}岁了", SoEasyMsg= soEasyMsg };
  24. }
  25. [AnnoInfo(Desc = "两个整数相减等于几?我来帮你算(x-y=?)")]
  26. public int Subtraction([AnnoInfo(Desc = "整数X")] int x, [AnnoInfo(Desc = "整数Y")] int y)
  27. {
  28. return x - y;
  29. }
  30. [AnnoInfo(Desc = "买个商品吧,双十一马上就来了")]
  31. public ProductDto BuyProduct([AnnoInfo(Desc = "商品名称")] string productName, [AnnoInfo(Desc = "商品数量")] int number)
  32. {
  33. double price = new Random().Next(2, 90);
  34. Dictionary<string, string> input = new Dictionary<string, string>();
  35. input.Add("productName", productName);
  36. input.Add("number", number.ToString());
  37. var product = Newtonsoft.Json.JsonConvert.DeserializeObject<ActionResult<ProductDto>>(this.InvokeProcessor("Anno.Plugs.SoEasy", "AnnoSoEasy", "BuyProduct", input)).OutputData;
  38. product.CountryOfOrigin = $"中国北京中转--{ product.CountryOfOrigin}";
  39. return product;
  40. }
  41. }
  42. }

增加一个业务模块 Anno.Plugs.SoEasyService 、AnnoSoEasyModule

  1. /******************************************************
  2. Writer:Du YanMing
  3. Mail:dym880@163.com
  4. Create Date:2020/10/30 13:16:23
  5. Functional description: AnnoSoEasyModule
  6. ******************************************************/
  7. using Anno.EngineData;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Text;
  11. namespace Anno.Plugs.SoEasyService
  12. {
  13. using Anno.Const.Attribute;
  14. using Anno.EngineData;
  15. using HelloWorldDto;
  16. public class AnnoSoEasyModule : BaseModule
  17. {
  18. [AnnoInfo(Desc = "AnnoSoEasy你好啊SayHi")]
  19. public dynamic SayHi([AnnoInfo(Desc = "称呼")] string vname, [AnnoInfo(Desc = "年龄")] int vage)
  20. {
  21. var msg = string.Empty;
  22. if (vage < 12)
  23. {
  24. msg = "小朋友年纪轻轻就就开始玩变成了啊!加油Baby!";
  25. }else if (vage < 23)
  26. {
  27. msg = "小兄弟,找女朋友了吗?没有的话赶紧找一个吧。别把心思都放在写代码上!";
  28. }
  29. else if (vage < 30)
  30. {
  31. msg = "兄弟,你家小孩几岁了?开始学编程了吗?";
  32. }
  33. else if (vage < 45)
  34. {
  35. msg = "大哥,你好能给我介绍个对象吗?";
  36. }
  37. else if (vage < 55)
  38. {
  39. msg = "大叔,你家邻居有小妹妹介绍吗?";
  40. }
  41. else
  42. {
  43. msg = "还不退休?别写代码了!";
  44. }
  45. return $"{vname}:你好,我是SoEasy,{msg}";
  46. }
  47. [AnnoInfo(Desc = "两个整数相加等于几?我来帮你算")]
  48. public int Add([AnnoInfo(Desc = "整数X")] int x, [AnnoInfo(Desc = "整数Y")] int y)
  49. {
  50. return x + y;
  51. }
  52. [AnnoInfo(Desc = "买个商品吧,双十一马上就来了")]
  53. public ProductDto BuyProduct([AnnoInfo(Desc = "商品名称")] string productName, [AnnoInfo(Desc = "商品数量")] int number)
  54. {
  55. double price = new Random().Next(2, 90);
  56. return new ProductDto() { Name=productName,Price=price ,Number=number, CountryOfOrigin="中国台湾"};
  57. }
  58. }
  59. }

  至此两个插件已经编写完成,然后在上一章节中新建的 HelloWorldService 服务中引入我们编写的两个功能插件 Anno.Plugs.HelloWorldService、Anno.Plugs.SoEasyService。

启动 HelloWorldService 服务

 

 我们看到服务已经正常启动,且已经成功注册到注册中心。下的章节我们一起来看一下Viper的 Api文档  ,并且增加 全局过滤器、模块过滤器、方法过滤器、异常过滤器、身份验证顾虑器、如何增加请求缓存、单个服务如何限流、单个服务限流和Api网关限流之间的关系。

 

 github: https://github.com/duyanming/Viper

文档地址: https://duyanming.github.io/

体验地址: http://140.143.207.244/

 关于Viper的更多内容,随后更新。敬请关注。开源不易,感谢Star。

版权声明:本文为duyanming原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/duyanming/p/13914622.html