1、Anno是什么?

  Anno是一个微服务引擎。在此之前我们通过 Viper项目对Anno有一个基本的认识,并且Viper也受到的很多朋友的喜欢,截止发稿前Viper在GitHub收获了300多个星。并且Anno也在昨天(2020年11月24日)开源。今天我们就聊一聊Anno如何与传统的项目相结合。

github   :https://github.com/duyanming/Anno.Core  

gitee      :https://gitee.com/duyanming/anno.core

体验地址:http://140.143.207.244/Home/Login

2、Anno和传统项目相结合

  我们新建一个asp.net framework WebApi 项目。然后我们通过客户端代理(Install-Package Anno.Rpc.Client.DynamicProxy)生成服务接口代理类,并注入到Autofac容器中去。服务提供方可以是.netcore服务、.netframework服务、java服务以及其他语言提供的服务(期待大佬的加入扩展出更多)。

  Demo地址:https://github.com/duyanming/Viper/tree/master/Samples

  以下Demo我们用.netcore提供服务。

创建一个传统的ASP.NET WEB API项目,结构如下:

第一步 引入Nuget包 :

Install-Package Anno.Rpc.Client.DynamicProxy -Version 1.0.2.8
Install-Package Autofac.WebApi2 -Version 4.3.1

第二步:

  新增文件:IocManager.cs  

 1  public static class IocManager
2 {
3 public static IContainer IoContainer;
4 private static readonly ContainerBuilder Builder = new ContainerBuilder();
5
6 public static ContainerBuilder GetContainerBuilder()
7 {
8 return Builder;
9 }
10
11 public static void Build(params Assembly[] assemblies)
12 {
13 if (assemblies != null)
14 {
15 assemblies.ToList().ForEach(assembly =>
16 {
17 assembly.GetTypes().Where(x => x.GetTypeInfo().IsClass && !x.GetTypeInfo().IsAbstract && !x.GetTypeInfo().IsInterface).ToList().ForEach(
18 t =>
19 {
20 var interfaces = t.GetInterfaces();
21 if (interfaces.Length <= 0)
22 {
23 Builder.RegisterType(t);
24 }
25 else
26 {
27 Builder.RegisterType(t).As(t.GetInterfaces());
28 }
29 });
30 });
31
32 }
33 IoContainer = Builder.Build();
34 }
35 }

  新增文件:AutoFacConfig.cs  

 1 public class AutoFacConfig
2 {
3 public static void Register()
4 {
5 var builder = IocManager.GetContainerBuilder();
6 var config = GlobalConfiguration.Configuration;
7
8 builder.RegisterApiControllers(Assembly.GetCallingAssembly())
9 .PropertiesAutowired();
10 builder.RegisterWebApiFilterProvider(config);
11 builder.RegisterWebApiModelBinderProvider();
12 /*
13 * Anno服务接口通过代理注册到IOC容器中去
14 */
15 builder.RegisterInstance<IHelloWorldViperService>(AnnoProxyBuilder.GetService<IHelloWorldViperService>());
16
17 IocManager.Build(typeof(IocManager).Assembly);
18 config.DependencyResolver = new AutofacWebApiDependencyResolver(IocManager.IoContainer);
19
20
21 }
22 }

  修改文件:WebApiConfig.cs  

 1 public static class WebApiConfig
2 {
3 public static void Register(HttpConfiguration config)
4 {
5 //1、将默认的xml格式化程序清除
6 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
7
8 // Web API 配置和服务
9
10 // Web API 路由
11 config.MapHttpAttributeRoutes();
12
13 config.Routes.MapHttpRoute(
14 name: "DefaultApi",
15 routeTemplate: "api/{controller}/{id}",
16 defaults: new { id = RouteParameter.Optional }
17 );
18 config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "MM/dd/yyy HH:mm:ss";
19 }
20 }

  修改文件:Global.asax  

 1  using Anno.Rpc.Client;
2 public class WebApiApplication : System.Web.HttpApplication
3 {
4 protected void Application_Start()
5 {
6 /*
7 * 配置注册中心地址
8 * 客户端名称:MvcCallAnno
9 * 注册中心IP:127.0.0.1
10 * 注册中心端口:7010
11 * 调用链追踪:false(true开启,false关闭)
12 */
13 DefaultConfigManager.SetDefaultConfiguration("MvcCallAnno", "127.0.0.1", 7010, true);
14 /*
15 * Autofac Ioc 初始化
16 */
17 AutoFacConfig.Register();
18 GlobalConfiguration.Configure(WebApiConfig.Register);
19 }
20 }

  增加服务接口:IHelloWorldViperService.cs  

 1 namespace MvcCallAnno.Service
2 {
3 using Anno.Rpc.Client.DynamicProxy;
4
5 /// <summary>
6 /// 对应Anno.Plugs.HelloWorldService 插件的 HelloWorldViperModule 模块
7 /// 接口名称和接口方法和 AnnoService端的 名称不一样的时候使用AnnoProxy 指定别名
8 /// </summary>
9 [AnnoProxy(Channel = "Anno.Plugs.HelloWorld", Router = "HelloWorldViper")]
10 public interface IHelloWorldViperService
11 {
12 /// <summary>
13 /// 名称不一致
14 /// </summary>
15 /// <param name="name"></param>
16 /// <param name="age"></param>
17 /// <returns></returns>
18 [AnnoProxy(Method = "SayHello")]
19 dynamic SayHello(string name, int age);
20 /// <summary>
21 /// 名称一致
22 /// </summary>
23 /// <param name="x"></param>
24 /// <param name="y"></param>
25 /// <returns></returns>
26 int Subtraction(int x, int y);
27
28 ProductDto BuyProduct(string productName, int number);
29 }
30
31
32 public class ProductDto
33 {
34 public string Name { get; set; }
35 public int Number { get; set; }
36 public double Price { get; set; }
37 public double Amount { get { return Price * Number; } }
38 public string CountryOfOrigin { get; set; }
39 }
40 }

  增加控制器:ValuesController.cs   

 1   public class ValuesController : ApiController
2 {
3 private readonly IHelloWorldViperService helloWorldViperService;
4 public ValuesController(IHelloWorldViperService helloWorldViperService) {
5 this.helloWorldViperService = helloWorldViperService;
6 }
7 [HttpGet]
8 public dynamic SayHello(string name, int age) {
9 var rlt= helloWorldViperService.SayHello(name,age);
10 return Json(rlt);
11 }
12 [HttpGet]
13 public int Subtraction(int x, int y) {
14 return helloWorldViperService.Subtraction(x,y);
15 }
16 [HttpGet]
17 public dynamic BuyProduct(string productName, int number) {
18 return helloWorldViperService.BuyProduct(productName, number);
19 }

主要步骤:

安装Nuget包---》初始化Anno注册中心配置----》代理注入AutoFac容器---》控制器通过构造函数注入服务接口

2.1、开始演示

1、启动注册中心

2、启动HelloWorldService服务

再来看下注册中心输出的信息

注册中心已经收到HelloWorldService服务的注册

3、启动我们的Asp.net Web API

  调用控制器接口:SayHello  

[HttpGet]
public dynamic SayHello(string name, int age) {
var rlt= helloWorldViperService.SayHello(name,age);
return Json(rlt);
}

看到了输出结果,第一个接口调用成功。

  第二个接口:Subtraction  

1  [HttpGet]
2 public int Subtraction(int x, int y) {
3 return helloWorldViperService.Subtraction(x,y);
4 }

看到了输出结果75,也是我们预期的结果。调用成功。

  第三个接口:BuyProduct

  

1 [HttpGet]
2 public dynamic BuyProduct(string productName, int number) {
3 return helloWorldViperService.BuyProduct(productName, number);
4 }

也是我们预期的结果。调用成功。

学习交流 QQ群:478399354 ,到这里我们互为师长项目学习。

Anno核心源码:https://github.com/duyanming/Anno.Core  

Viper示例项目:https://github.com/duyanming/Viper  

体验地址:http://140.143.207.244/Home/Login

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

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

 

Anno微服务引擎与传统应用相融合的更多相关文章

  1. Anno微服务Viper(控制面板) 支持在线部署

    1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可监控.依赖第三方框架少.可在线升级部署. 2.Viper简介 Viper 是一个基于Anno微服务引擎开发的Da ...

  2. surging 微服务引擎 2.0 会有多少惊喜?

    surging 微服务引擎从2017年6月至今已经有两年的时间,这两年时间有多家公司使用surging 服务引擎,并且有公司搭建了CI/CD,并且使用了k8s 集群,这里我可以说下几家公司的服务搭建情 ...

  3. 微服务理论之二:面向微服务架构与传统架构、SOA对比,以及云化对比

    一.Monolith 网上对Microservice进行介绍的文章常常以Monolith作为开头,我也不会例外.原因是,知道了Monolith的不便之后才能更容易地理解Microservice架构模式 ...

  4. 云图说丨初识华为云微服务引擎CSE

    摘要:微服务引擎(Cloud Service Engine,CSE),是用于微服务应用的云中间件,为用户提供注册发现.服务治理.配置管理等高性能和高韧性的企业级云服务能力 本文分享自华为云社区< ...

  5. GoldenGate 12.3微服务架构与传统架构的区别

    随着Oracle GoldenGate 12c(12.3.0.1.0)的发布,引入了可用于复制业务数据的新架构. 多年来,这种架构有着不同的称谓,Oracle终于在最后GA发布的版本中,以“Micro ...

  6. Docker微容器+微服务将颠覆传统的软件架构

    从我的观点看:Docker是一个微容器,一个云计算的微PaaS容器,类似JVM但比其更强大的容器,直接基于Linux内核,支持各种语言,它比VM虚拟机更加轻量,能够在Linux或云计算IaaS等平台上 ...

  7. 谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

    一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务 ...

  8. surging 微服务引擎 -协议主机的Behavior特性

    1.前言 因为工作的关系,最近很少更新surging,因为surging 一直处在不温不火的状态,而自己每天利用业余时间进行完善,每天都是疲惫的状态,还要应付新手的提问,曾经一度想放弃,但是有些人劝说 ...

  9. surging 微服务引擎 1.0 正式发布

    surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希 ...

随机推荐

  1. Angular双向绑定简单理解

    在使用Antd的时候,一直很好奇里面的双向绑定的自定义组件是怎么做的. 因为之前一直用,没有去细看文档. 今天抽空来简单的撸一下. 在ng中,()是单向数据流,从视图目标到数据源,[()]这样就是双向 ...

  2. Django model总结(上)

    Django model是django框架中处于比较核心的一个部位,准备分三个博客从不同的方面分别进行阐述,本文为<上篇>,主要对[a]Model的基本流程,比如它的创建,迁移等:默认行为 ...

  3. Java 运行时动态生成class

    转载 http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 Java是一门静态语言 ...

  4. Java动态代理——框架中的应用场景和基本原理

    前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...

  5. 力扣 - 232. 用栈实现队列.md

    目录 题目 思路 代码实现 复杂度分析 题目 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列的支持的所有操作(push.pop.peek.empty): 实现 MyQueue 类: void ...

  6. CF1303G Sum of Prefix Sums

    点分治+李超树 因为题目要求的是树上所有路径,所以用点分治维护 因为在点分治的过程中相当于将树上经过当前$root$的一条路径分成了两段 那么先考虑如何计算两个数组合并后的答案 记数组$a$,$b$, ...

  7. STC转STM32第一次开发

    目录 前言 项目 1. 模数转换,并通过OLED屏显示出来 需求: 实验器材: 接线: 源程序: 成品: 2. 简易频率计(0.1-10MHZ) 需求: 原理: 实验器材: 接线: 源程序: 写在结尾 ...

  8. 3.5 MyLinkedList 实现

    3.5 MyLinkedList 类的实现 MyLinkedList 将用双链表实现,并且还需要保留该表两端的引用.这将需要三个类 MyLinkedList 类,包含到两端的链.表的大小以及一些方法. ...

  9. Cuda常用概念及注意点

    线程的索引计算 只需要知并行线程的初始索引,以及如何确定递增的量值,我们希望每个并行线程从不同的索引开始,因此就需要对线程索引和线程块索引进行线性化,每个线程的其实索引按照以下公式来计算: int t ...

  10. PHP直播平台源码搭建教程

    直播源码市场火爆,但是PHP直播平台源码的搭建过程较为复杂,本文就简单为大家概述一下直播的实现过程以及PHP直播平台源码是如何搭建的. 一.直播的定义 如今PHP直播平台源码绝大部分情况下是指在现场架 ...