- Notifications
You must be signed in to change notification settings - Fork175
Viper 是一个基于Anno微服务引擎开发的Dashboard示例项目。Anno 底层通讯采用 grpc、thrift。自带服务发现、调用链追踪、Cron 调度、限流、事件总线等等
License
NotificationsYou must be signed in to change notification settings
duyanming/Viper
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Viper 是一个基于Anno微服务引擎开发的Dashboard项目、示例项目。Anno 底层通讯可选用grpc、thrift。自带服务发现、调用链追踪、Cron 调度、限流、事件总线等等
账号:anno密码:123456
Anno 是一个分布式开发框架,支持 .net core3.1 、.net frameworker4.5 、 java
运行数据库脚本创建数据库1、Viper\database\viper20210617_01.sql2、修改viperService 数据库连接字符串Viper\ViperService\bin\Debug\net6.0\Anno.config
<appSettings><!-- 数据库连接字符串 Mysql--> <addkey="ConnStr"value="server=127.0.0.1;database=viper;uid=bif;pwd=123456;SslMode=None;"/></appSettings>
第一步:启动注册中心Viper\ViperCenter\bin\Debug\net6.0\Anno.config
<?xml version="1.0" encoding="utf-8"?><configuration><!--ViperCenter 端口--> <Port>7010</Port><!--ViperCenter 超时时间--> <TimeOut>120000</TimeOut> <Servers><!--dc 注册到注册中心的 服务节点 (下面的内容是ViperService 启动后自动写入的内容)--> <dcname="Anno.Plugs.LogicService,Anno.Plugs.TraceService,Anno.Plugs.ViperService"nickname="ViperService-01"ip="100.100.100.9"port="7011"timeout="20000"weight="1" /> </Servers></configuration>
Viper\ViperCenter\bin\Debug\net6.0运行命令 dotnet ViperCenter.dll看到下图 说明运行成功
第二步:启动 ViperServiceViper\ViperService\bin\Debug\net6.0\Anno.config
<?xml version="1.0" encoding="utf-8" ?><configuration><!--0,0 第一位是 工作站,第二位数据中心 (所有的 AnnoService 的 两位数不能重复例如不能存在【1,2】【1,2】) 可以存在【1,2】【2,1】--> <IdWorker>0,0</IdWorker><!--App名称--> <AppName>ViperService-01</AppName><!--监听端口--> <Port>7011</Port><!--权重--> <Weight>1</Weight><!--功能 非Anno.Plugs 加入方式--> <FuncName></FuncName><!--忽略的功能 Trace,Logic--> <IgnoreFuncName></IgnoreFuncName><!--超时时间毫秒--> <TimeOut>20000</TimeOut><!--注册到的目标--> <TsIp="127.0.0.1"Port="7010"/> <IocDll><!-- IOC 仓储--><!-- <Assembly>Anno.Repository</Assembly>--><!-- 领域--><!-- <Assembly>Anno.Domain</Assembly>--><!-- 查询服务--><!-- <Assembly>Anno.QueryServices</Assembly>--><!--事件Handler--><!-- <Assembly>Anno.Command.Handler</Assembly>--> </IocDll> <appSettings><!-- 数据库连接字符串 Mysql--> <addkey="ConnStr"value="server=127.0.0.1;database=viper;uid=bif;pwd=123456;SslMode=None;"/><!-- redisConn Redis 连接字符串 127.0.0.1:6379,abortConnect=false,allowAdmin =true,keepAlive=180 redisPrefix Key 前缀 Anno: redisExpiryDate Key 有效期 单位(分钟) 20 redisSwitch 是否开启数据库 false 不开启 false <add key="redisConn" value=""/> <add key="redisPrefix" value="SW:"/> <add key="redisExpiryDate" value="20"/> <add key="redisSwitch" value="false"/>--> </appSettings></configuration>
一般情况下只用修改
<!--注册到的目标--> <TsIp="127.0.0.1"Port="7010"/><!-- 数据库连接字符串 Mysql--> <addkey="ConnStr"value="server=127.0.0.1;database=viper;uid=bif;pwd=123456;SslMode=None;"/>
ViperService 可以和 ViperCenter 不在同一台电脑,也可以运行多个server 也可以负载均衡,高级用法随后介绍进入项目文件夹 Viper\ViperService\bin\Debug\net6.0 运行命令 dotnet ViperService.dll看到下图 说明 ViperService 成功运行 并且已经注册到 注册中心(ViperCenter)运行成功
启动 Viper.GetWay
第三步:调用链追踪Viper\Viper\appsettings.json
{"Target": {"AppName":"ApiGateway","IpAddress":"127.0.0.1","Port":7010,"TraceOnOff":true },"Limit": {"Enable":true,"TagLimits": [ {"channel":"*","router":"*","timeSpan":"1","rps":100,"limitSize":100 } ],"DefaultIpLimit": {"timeSpan":1,"rps":200,"limitSize":200 },"IpLimits": [ {"ipMatch":"0.0.0.1","timeSpan":1,"rps":100,"limitSize":100 }, {"ipMatch":"192.168.0.10 - 192.168.10.20","timeSpan":1,"rps":100,"limitSize":100 } ],"White": ["0.0.0.1","192.168.1.2","192.168.2.18" ],"Black": ["0.0.0.2","192.168.3.18" ] }}
调用链详情
第四步:集群路由信息
调试邮件接口成功
第五步:服务性能监控
Eventbus Support InMemory and Rabbitmq
//指定EventHandler的 所在程序集varfuncs=Anno.Const.Assemblys.Dic.Values.ToList(); #region RabbitMQEventBus//消费失败通知EventBusSetting.Default.RabbitConfiguration=newRabbitConfiguration(){HostName="192.168.100.173",VirtualHost="dev",UserName="dev",Password="dev",Port=5672};RabbitMQEventBus.Instance.ErrorNotice+=(stringexchange,stringroutingKey,Exceptionexception,stringbody)=>{Log.Fatal(new{exchange,routingKey,exception,body},typeof(RabbitMQEventBus));};RabbitMQEventBus.Instance.SubscribeAll(funcs); #endregion #region InMemory EventBusEventBus.Instance.ErrorNotice+=(stringexchange,stringroutingKey,Exceptionexception,stringbody)=>{Log.Fatal(new{exchange,routingKey,exception,body},typeof(EventBus));};EventBus.Instance.SubscribeAll(funcs);
usingAnno.EventBus;namespaceEvents{publicclassFirstMessageEvent:EventData{publicstringMessage{get;set;}}}
namespaceAnno.Plugs.SamsundotService.EventHandler{usingAnno.EventBus;usingEvents;classFirstMessageEventHandler:IEventHandler<FirstMessageEvent>{publicvoidHandler(FirstMessageEvententity){Log.Log.Info(new{Plugs="Samsundot",Entity=entity},typeof(FirstMessageEventHandler));}}}
namespaceAnno.Plugs.YYTestService.EventHandler{usingAnno.EventBus;usingEvents;classFirstMessageEventHandler:IEventHandler<FirstMessageEvent>{publicvoidHandler(FirstMessageEvententity){Log.Log.Info(new{Plugs="YYTest",Entity=entity},typeof(FirstMessageEventHandler));}}/// <summary>/// 异常消费演示,测试 消费失败通知/// </summary>classFirstMessageExceptionEventHandler:IEventHandler<FirstMessageEvent>{publicvoidHandler(FirstMessageEvententity){Log.Log.Info(new{Plugs="YYTest",Handle="FirstMessageExceptionEventHandler",Entity=entity},typeof(FirstMessageEventHandler));thrownewException("异常消费演示,测试 消费失败通知 From FirstMessageExceptionEventHandler!");}}}
Install-Package Anno.EngineData.Cache
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingAnno.EngineData;usingAnno.EngineData.Cache;namespaceAnno.Plugs.CacheRateLimitService{publicclassCacheModule:BaseModule{/* 参数1:缓存长度 参数2:缓存存活时间 参数3:缓存存活时间是否滑动 */[CacheLRU(5,6,true)]publicActionResultCache(stringmsg){Console.WriteLine(msg);returnnewActionResult(true,null,null,msg);}}}
Install-Package Anno.EngineData.RateLimit
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingAnno.EngineData;usingAnno.RateLimit;namespaceAnno.Plugs.CacheRateLimitService{publicclassLimitModule:BaseModule{/* 参数1:限流算法是令牌桶还是漏桶 参数2:限流时间片段单位秒 参数3:单位时间可以通过的请求个数 参数4:桶容量 */[EngineData.Limit.RateLimit(LimitingType.TokenBucket,1,5,5)]publicActionResultLimit(stringmsg){Console.WriteLine(msg);returnnewActionResult(true,null,null,msg);}}}
#dotnetdotnet publish "E:\gitProject\Anno\DCS\AppCenter\AppCenter.csproj" -c Release -r linux-x64 -o "E:\gitProject\Anno\DCS\AppCenter\bin"
#配置文件说明
{"Target": {"AppName":"traceWeb",--服务名称"IpAddress":"127.0.0.1",--注册中心地址"Port":6660,--注册中心端口"TraceOnOff":true--启用调用链追踪 },"Limit": {--限流"Enable":true,--是否启用限流"TagLimits": [--标签限流 {"channel":"*",--管道"router":"*",--路由"timeSpan":"10",--时间片单位秒"rps":1,--时间片内的 有效请求个数"limitSize":2--漏桶容量大小 做缓冲用 } ],"DefaultIpLimit": {--默认IP限流策略"timeSpan":1,"rps":20,"limitSize":200 },"IpLimits": [--IP限流策略(ipMatch参考IPAddressRange) {"ipMatch":"0.0.0.1","timeSpan":1,"rps":100,"limitSize":100 }, {"ipMatch":"192.168.0.10 - 192.168.10.20","timeSpan":1,"rps":100,"limitSize":100 } ],"White": [--白名单"0.0.0.1","192.168.1.2","192.168.2.18" ],"Black": [--黑名单"0.0.0.2","192.168.3.18" ] }}