Viper 微服務框架 編寫一個hello world 外掛-02

杜燕明發表於2020-11-03

1、Viper是什麼?

  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

2、Viper微服務編寫一個Hello World外掛

  前面章節我們已經建立好了一個HelloWorldService 服務,這一小節我們來編寫一個HelloWorld外掛。啟動註冊中心ViperCenter 修改HelloWorldService 註冊中心地址。

2.1 新建一個HelloWorld外掛

  新建一個HelloWorld功能外掛, 稍後我們以同樣的方式新增一個SoEasy功能外掛。最後我們讓兩個外掛相互呼叫並輸出結果。

新增Anno功能外掛依賴

Install-Package Anno.EngineData -Version 1.0.2.6

增加一個外掛啟動初始化配置類 HelloWorldBootStrap

using Anno.EngineData;
using System;

namespace Anno.Plugs.HelloWorldService
{
    /// <summary>
    /// 外掛啟動引導器
    /// DependsOn 依賴的型別程式集自動注入DI容器
    /// </summary>
    [DependsOn(
        //typeof(Domain.Bootstrap)
        //, typeof(QueryServices.Bootstrap)
        //, typeof(Repository.Bootstrap)
        //, typeof(Command.Handler.Bootstrap
        )]
    public class HelloWorldBootStrap : IPlugsConfigurationBootstrap
    {
        /// <summary>
        /// Service 依賴注入構建之後呼叫
        /// </summary>
        public void ConfigurationBootstrap()
        {
            //throw new NotImplementedException();
        }
        /// <summary>
        /// Service 依賴注入構建之前呼叫
        /// </summary>
        /// </summary>
        public void PreConfigurationBootstrap()
        {
            //throw new NotImplementedException();
        }
    }
}

 

增加一個業務模組 HelloWorldViperModule

/****************************************************** 
Writer:Du YanMing
Mail:dym880@163.com
Create Date:2020/10/30 13:15:24 
Functional description: HelloWorldViperModule
******************************************************/
using System;
using System.Collections.Generic;
using System.Text;

namespace Anno.Plugs.HelloWorldService
{
    using Anno.Const.Attribute;
    using Anno.EngineData;
    using HelloWorldDto;

    public class HelloWorldViperModule: BaseModule
    {
        [AnnoInfo(Desc = "世界你好啊SayHi")]
        public dynamic SayHello([AnnoInfo(Desc = "稱呼")] string name, [AnnoInfo(Desc = "年齡")] int age) {
            Dictionary<string, string> input = new Dictionary<string, string>();
            input.Add("vName",name);
            input.Add("vAge", age.ToString());
            var soEasyMsg = Newtonsoft.Json.JsonConvert.DeserializeObject<ActionResult<string>>(this.InvokeProcessor("Anno.Plugs.SoEasy", "AnnoSoEasy", "SayHi", input)).OutputData;
            return new { HelloWorldViperMsg = $"{name}你好啊,今年{age}歲了", SoEasyMsg= soEasyMsg };
        }

        [AnnoInfo(Desc = "兩個整數相減等於幾?我來幫你算(x-y=?)")]
        public int Subtraction([AnnoInfo(Desc = "整數X")] int x, [AnnoInfo(Desc = "整數Y")] int y)
        {
            return x - y;
        }
        [AnnoInfo(Desc = "買個商品吧,雙十一馬上就來了")]
        public ProductDto BuyProduct([AnnoInfo(Desc = "商品名稱")] string productName, [AnnoInfo(Desc = "商品數量")] int number)
        {
            double price = new Random().Next(2, 90);
            Dictionary<string, string> input = new Dictionary<string, string>();
            input.Add("productName", productName);
            input.Add("number", number.ToString());
            var product = Newtonsoft.Json.JsonConvert.DeserializeObject<ActionResult<ProductDto>>(this.InvokeProcessor("Anno.Plugs.SoEasy", "AnnoSoEasy", "BuyProduct", input)).OutputData;
            product.CountryOfOrigin = $"中國北京中轉--{ product.CountryOfOrigin}";
            return product;
        }
    }
}

增加一個業務模組 Anno.Plugs.SoEasyService 、AnnoSoEasyModule

/****************************************************** 
Writer:Du YanMing
Mail:dym880@163.com
Create Date:2020/10/30 13:16:23 
Functional description: AnnoSoEasyModule
******************************************************/
using Anno.EngineData;
using System;
using System.Collections.Generic;
using System.Text;

namespace Anno.Plugs.SoEasyService
{
    using Anno.Const.Attribute;
    using Anno.EngineData;
    using HelloWorldDto;

    public class AnnoSoEasyModule : BaseModule
    {
        [AnnoInfo(Desc = "AnnoSoEasy你好啊SayHi")]
        public dynamic SayHi([AnnoInfo(Desc = "稱呼")] string vname, [AnnoInfo(Desc = "年齡")] int vage)
        {
            var msg = string.Empty;
            if (vage < 12)
            {
                msg = "小朋友年紀輕輕就就開始玩變成了啊!加油Baby!";
            }else if (vage < 23)
            {
                msg = "小兄弟,找女朋友了嗎?沒有的話趕緊找一個吧。別把心思都放在寫程式碼上!";
            }
            else if (vage < 30)
            {
                msg = "兄弟,你家小孩幾歲了?開始學程式設計了嗎?";
            }
            else if (vage < 45)
            {
                msg = "大哥,你好能給我介紹個物件嗎?";
            }
            else if (vage < 55)
            {
                msg = "大叔,你家鄰居有小妹妹介紹嗎?";
            }
            else
            {
                msg = "還不退休?別寫程式碼了!";
            }
            return $"{vname}:你好,我是SoEasy,{msg}";
        }

        [AnnoInfo(Desc = "兩個整數相加等於幾?我來幫你算")]
        public int Add([AnnoInfo(Desc = "整數X")] int x, [AnnoInfo(Desc = "整數Y")] int y)
        {
            return x + y;
        }
        [AnnoInfo(Desc = "買個商品吧,雙十一馬上就來了")]
        public ProductDto BuyProduct([AnnoInfo(Desc = "商品名稱")] string productName, [AnnoInfo(Desc = "商品數量")] int number)
        {
            double price = new Random().Next(2, 90);
            return new ProductDto() { Name=productName,Price=price ,Number=number, CountryOfOrigin="台灣"};
        }
    }
}

  至此兩個外掛已經編寫完成,然後在上一章節中新建的 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。

相關文章