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. echarts常用功能封装|抽象为mixin

    目前已解锁以下功能: [x] 初始化echarts(initChart) [x] 获取echarts参数配置(getOption) [x] 生成echarts图表(setOption) [x] 监听r ...

  2. js内建函数reduce()

    reduce函数,是ECMAScript5规范中出现的数组方法.在平时的工作中,相信大家使用的场景并不多,一般而言,可以通过reduce方法实现的逻辑都可以通过forEach方法来变相的实现,虽然不清 ...

  3. 在充电桩联网部署方案中4G DTU的优势是什么

    充电桩作为电动汽车充电生态链的一环,具有非常重要的作用,成都远向电子为电动车充电桩.充电站提供专业的无线通信组网产品与技术解决方案,协助充电桩厂家.充电桩运营商.商业充电服务商实现:充电桩设备工作状态 ...

  4. nginx反向代理三台web服务器,实现负载均衡

    修改nginx.conf #在http和server之间加入这个模块 upstream guaji{ server 127.0.0.1:8080; server 127.0.0.2:8080; ser ...

  5. websocket报400错误

    解决方案看了下讨论区说的方案,问题出现在nginx的配置文件,需要修改nginx.conf文件.在linux终端中敲入vim /etc/nginx/nginx.conf,找到location这个位置, ...

  6. python解决百钱买百鸡

    百钱买百鸡 关注公众号"轻松学编程"了解更多. 现有100钱,公鸡5文钱一只,母鸡3文钱一只,小鸡一文钱3只 要求:公鸡.母鸡,小鸡都要有,把100文钱花完,买的鸡的数量正好是10 ...

  7. (四)HTTP消息报头

    HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成.请求消息和响应消息都是由开始行,消息报头,空行(只有CRLF的行),消息正文组成.对于请求消息,开始行就是请求行:对于响应消息,开始行就是 ...

  8. leetcode76set-matrix-zeroes

    题目描述 给定一个m*n的矩阵,如果有一个元素是0,就把该元素所在的行和列上的元素全置为0,要求使用原地算法. 拓展: 你的算法有使用额外的空间吗? 一种比较直接的算法是利用O(m,n)的空间,但是这 ...

  9. 【linux】-Makefile简要知识+一个通用Makefile

    目录 Makefile Makefile规则与示例 为什么需要Makefile Makefile样式 先介绍Makefile的两个函数 完善Makefile 通用Makefile的使用 通用的Make ...

  10. [MIT6.006] 4. Heaps and Heap Sort 堆,堆排序

    第4节课仍然是讲排序,但介绍的是一种很高效的堆排序. 在编程过程中,有时候会需要进行extrat_max的操作,即从一个数列里挨个抽取最大值并将其它从原数列中移除.而排序问题也可以看作是一个extra ...