Viper 微服务框架 编写一个hello world 插件-02
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 限流
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 微服务框架 编写一个hello world 插件-02的更多相关文章
- hello world .net core 微服务框架 Viper
		
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
 - net core 微服务框架 Viper 调用链路追踪
		
1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...
 - YoyoGo微服务框架入门系列-快速编写WEB API
		
前言 YoyoGo是一个使用Golang编写的一个简单.轻量.快速.基于依赖注入的微服务框架,目前依然在研发阶段,欢迎Star以及一起参与到框架的研发 GitHub地址:https://github. ...
 - spring cloud 入门,看一个微服务框架的「五脏六腑」
		
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
 - 从 Spring Cloud 看一个微服务框架的「五脏六腑」
		
原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构 ...
 - 从 Spring Cloud 看一个微服务框架的「五脏六腑」(转)
		
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 本文将从 Spring Cloud 出发,分两小节讲述微服务框架的「五脏六腑」: ...
 - 从 1.5 开始搭建一个微服务框架——日志追踪 traceId
		
你好,我是悟空. 前言 最近在搭一个基础版的项目框架,基于 SpringCloud 微服务框架. 如果把 SpringCloud 这个框架当做 1,那么现在已经有的基础组件比如 swagger/log ...
 - MicroService.Core简易微服务框架《一、简介》
		
MicroService.Core MicroService.Core 的初衷是为了方便的创建一个微服务, 可作为 Windows Service 或者控制台模式启动. 它底层使用了 OWin 自托管 ...
 - (三)surging 微服务框架使用系列之我的第一个服务(审计日志)
		
前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志. 首先我们先创建两个项目,一个控制台的服务启动项目,一个业务的实现项目. ...
 
随机推荐
- CUP的MESI协议
			
MESI协议中的状态 CPU中每个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示): M: 被修改(Modified) 该缓存行只被缓存在该CPU的缓存中,并且是被修 ...
 - java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能
			
//为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...
 - PHP 7:真实世界的应用开发(中文翻译)
			
前言 PHP 7:真实世界的应用开发(中文翻译) 作者:Doug Bierer, Altaf Hussain, Branko Ajzele 原书名称:<PHP 7: Real World App ...
 - linux内核 idr机制
			
idr机制解决了什么问题?为什么需要idr机制(或者说,idr机制这种解决方案,相对已有的其他方案,有什么优势所在) ? idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整 ...
 - 请编写sql多语句表值函数统,计指定年份中每本书的销售总额
			
create table 图书表( 书号 varchar(50), 书名 varchar(50), 单价 int ) create table 销售表( 书号 varchar(50), 销售时间 da ...
 - JDK1.8前_HashMap的扩容机制原理
			
最近在研究hashmap的扩容机制,作为一个小白,相信我的理解,对于一些同样是刚刚接触hashmap的白白是有很很大的帮助,毕竟你去看一些已经对数据结构了解透彻的大神谈hashmap的原理等,人家说的 ...
 - php正则偷电影
			
1.是将电影网站弄到自己的phpstudy下面,然后进行获取电影的一些数据,然后将其存到数据库,不要获取别人网站的数据,不然会导致网站的崩溃.
 - 机器学习算法——kNN(k-近邻算法)
			
算法概述 通过测量不同特征值之间的距离进行 [分类] 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围: 数值型 和 标称型 . 算法流程 数据 样本数 ...
 - mapbox处理中文标注不能换行问题
			
mapbox的换行侧率是根据空格进行的,因为中文中没有设置空格,因此换行不起作用. 解决方法:在node_modules\ol-mapbox-style\util.js 60行添加下列代码: let ...
 - 多测师讲解接口测试 _HTTP常见的状态码归纳_高级讲师肖sir
			
100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分 101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议 200 OK 一切正常,对 ...