# Anno.Core
**Repository Path**: zhihuicode/anno.core
## Basic Information
- **Project Name**: Anno.Core
- **Description**: Anno 是一个微服务引擎,底层通可选用 grpc或thrift。自带服务发现、调用链追踪、Cron 调度、限流、事件总线、CQRS 、DDD、插件化开发。Viper是 Anno的示例项目和管理面板。
- **Primary Language**: C#
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: http://49.232.112.70/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 260
- **Created**: 2021-10-25
- **Last Updated**: 2021-10-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🏡Anno 分布式微服务开发框架
**Anno 是一个分布式开发框架,专注于服务治理、监控、链路追踪。RPC可选用高性能跨语言的Thrift(推荐)、Grpc。同时支持 .net core 、.net framework、java。**
[](https://www.nuget.org/packages/Anno.EngineData)
[](https://raw.githubusercontent.com/duyanming/Anno.Core/master/LICENSE)













[在线演示](http://49.232.112.70) :http://49.232.112.70
[示例项目](https://github.com/duyanming/Viper) :https://github.com/duyanming/Viper
## 🎄Nuget 基础
Package name |Description | Version | Downloads
-----------------------------------------|--------------|-----------------------------|-------------------------
`Anno.Const`|配置库 | [](https://www.nuget.org/packages/Anno.Const/) | 
`Anno.Log`|日志库 | [](https://www.nuget.org/packages/Anno.Log/) | 
`Anno.Loader`|依赖注入库 | [](https://www.nuget.org/packages/Anno.Loader/) | 
`Anno.CronNET`|任务调度库 | [](https://www.nuget.org/packages/Anno.CronNET/) | 
`Anno.EngineData`|业务处理基础库 | [](https://www.nuget.org/packages/Anno.EngineData/) | 
## 🎃Nuget 通信
Package name |Description | Version | Downloads
-----------------------------------|------------------|-----------------------------|---------------------
`Anno.Rpc.Center`|Thrift注册中心库 | [](https://www.nuget.org/packages/Anno.Rpc.Center/) | 
`Anno.Rpc.Client` |Thrift客户端库| [](https://www.nuget.org/packages/Anno.Rpc.Client/) | 
`Anno.Rpc.Server`|Thrift Server服务库 | [](https://www.nuget.org/packages/Anno.Rpc.Server/) | 
`Anno.Rpc.CenterGrpc`|Grpc注册中心库 | [](https://www.nuget.org/packages/Anno.Rpc.CenterGrpc/) | 
`Anno.Rpc.ClientGrpc`|Grpc客户端库 | [](https://www.nuget.org/packages/Anno.Rpc.ClientGrpc/) | 
`Anno.Rpc.ServerGrpc`|GrpcServer服务库 | [](https://www.nuget.org/packages/Anno.Rpc.ServerGrpc/) | 
## 🎁Nuget 扩展
Package name |Description | Version | Downloads
---------------------------------------|----------------|-----------------------------|------------------------
`Anno.EventBus`|EventBus事件总线库 | [](https://www.nuget.org/packages/Anno.EventBus/) | 
`Anno.RateLimit`|令牌桶、漏桶限流库 | [](https://www.nuget.org/packages/Anno.RateLimit/) | 
`Anno.EngineData.RateLimit` |Anno服务限流中间件| [](https://www.nuget.org/packages/Anno.EngineData.RateLimit/) | 
`Anno.LRUCache`|缓存库 | [](https://www.nuget.org/packages/Anno.LRUCache/) | 
`Anno.EngineData.Cache`|Anno服务缓存中间件 | [](https://www.nuget.org/packages/Anno.EngineData.Cache/) | 
`Anno.Plugs.MonitorService`|Anno服务监控中间件 | [](https://www.nuget.org/packages/Anno.Plugs.MonitorService/) | 
`Anno.Rpc.Client.DynamicProxy`|接口代理Anno客户端扩展 | [](https://www.nuget.org/packages/Anno.Rpc.Client.DynamicProxy/) | 
## 🎂整体架构

整体架构主要分为三个部分
1、注册中心:AnnoCenter
2、微服务:AnnoService(可以是多个服务例如:订单服务A、库存服务B、支付服务C、用户服务D)
3、ApiGateway:[参考Viper](https://github.com/duyanming/Viper)
# 📢主要功能
服务注册中心、服务发现、健康检查、负载均衡、限流、失败重试、链路追踪、资源监控等功能
# 📦注册中心(AnnoCenter)
AnnoCenter 是一个服务注册中心,主要职责是 发现服务(例如订单服务A、库存服务B)、存储服务配置信息、健康检查、简单键值KV存储。客户端定时从注册中心获取服务信息缓存到本地。即便注册中心宕机也不影响整个集群运行,因为客户端已经缓存了整个集群的服务信息。但是新加入的服务无法注册进来,需要启动注册中心才可以。
客户端(例如:ApiGateway )发送过来请求时,客户端类库从本地缓存找出能够处理此请求的服务列表(这个过程可能涉及权重等策略)选择一个去处理请求,然后返回,如果失败会有重试机制。
注册中心会定时对每个服务做健康检查,如果连接不上服务则标记此服务为亚健康状态,此时不会将此服务踢出也不会将自服务返回给客户单使用,然后开始重复做检查。如果一分钟内恢复正常则重新标记为健康状态切可以对外提供服务,否则永久踢出服务。
服务注册中心(AnnoCenter) 是整个集群第一个需要运行起来的程序。
配置文件:只需要配置端口、超时时间即可。服务节点信息会在服务注册进来的时候自动写入
```xml
6660
120000
```
# 👑服务(AnnoService)
服务宿主程序,本着约定大于配置的开发原则。
插件式开发具体参考:
Packages
命名空间和程序集名称相同,格式为Anno.Plugs.XXXService 例如:Anno.Plugs.HelloWorldService
初始化配置
实现接口:IPlugsConfigurationBootstrap
```cs
using Anno.EngineData;
using System;
namespace Anno.Plugs.HelloWorldService
{
///
/// 插件启动引导器
/// DependsOn 依赖的类型程序集自动注入DI容器
///
[DependsOn(
//typeof(Domain.Bootstrap)
//, typeof(QueryServices.Bootstrap)
//, typeof(Repository.Bootstrap)
//, typeof(Command.Handler.Bootstrap
)]
public class HelloWorldBootStrap : IPlugsConfigurationBootstrap
{
///
/// Service 依赖注入构建之后调用
///
public void ConfigurationBootstrap()
{
//throw new NotImplementedException();
}
///
/// Service 依赖注入构建之前调用
///
///
public void PreConfigurationBootstrap()
{
//throw new NotImplementedException();
}
}
}
```
功能模块实现
继承: BaseModule
Module命名规范为 XXXModule,以Module结尾 例如:HelloWorldViperModule
```cs
/******************************************************
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;
using System.ComponentModel.DataAnnotations;
public class HelloWorldViperModule : BaseModule
{
[AnnoInfo(Desc = "世界你好啊SayHi")]
public dynamic SayHello([AnnoInfo(Desc = "称呼")] string name, [AnnoInfo(Desc = "年龄")] int age)
{
Dictionary input = new Dictionary();
input.Add("vname", name);
input.Add("vage", age.ToString());
var soEasyMsg = Newtonsoft.Json.JsonConvert.DeserializeObject>(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 input = new Dictionary();
input.Add("productName", productName);
input.Add("number", number.ToString());
var product = Newtonsoft.Json.JsonConvert.DeserializeObject>(this.InvokeProcessor("Anno.Plugs.SoEasy", "AnnoSoEasy", "BuyProduct", input)).OutputData;
product.CountryOfOrigin = $"中国北京中转--{ product.CountryOfOrigin}";
return product;
}
}
}
```
配置文件:
```xml
0,0
App001
6659
1
Anno.Plugs.LogicService,Anno.Plugs.TraceService
20000
Anno.Repository
```
# 🏄网关
[参考Viper](https://github.com/duyanming/Viper)