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. Vue基础(1)

    Vue简介 1.JavaScript框架 2.简化Dom操作 3.响应式数据驱动 Vue基础 通过下面代码引用vue: <script src="https://cdn.jsdeliv ...

  2. JAVA NIO 基础学习

    package com.hrd.netty.demo.jnio; import java.io.BufferedReader; import java.io.IOException; import j ...

  3. 4G工业路由器的传输功率是越高越好吗?

    现在人们越来越多的利用运营商网络进行家庭的Wi-Fi上网,早已是非常普遍的事情了.而无线路由器作为设备组网的重要组成部分,与路由器相关的话题.知识总会能够引发大家的热议.这里,以众山物联网研发.生产的 ...

  4. Mybatis日记

    SqlSession build: ExecutorType :SIMPLE ,REUSE, BATCH, SIMPLE 为默认执行器: REUSE 为可重用执行器,重用Statement,执行器会缓 ...

  5. 【Android Studio】安卓开发初体验3.1——UI设计之常用控件

    常用控件 首先对xml文件的编辑有三种模式 Code为纯代码 Split是一边代码,一边预览效果图 Designer就是有UI设计界面 TextView 用于在界面上显示一段文本信息 所有控件都可以在 ...

  6. 按揭贷款的计算原理与java实现

    Number部分(6) Mortgage Calculator--按揭贷款计算器 题目描述: Mortgage Calculator – Calculate the monthly payments ...

  7. leetcode68-search-in-rotated-sorted-array-ii

    题目描述 继续思考题目 "Search in Rotated Sorted Array": 如果数组种允许有重复元素怎么办? 会影响时间复杂度吗?是怎样影响时间复杂度的,为什么? ...

  8. 9个JavaScript日常开发小技巧

    1.生成指定范围的数字 在某些情况下,我们会创建一个处在两个数之间的数组.假设我们要判断某人的生日是否在某个范围的年份内,那么下面是实现它的一个很简单的方法 1 2 3 4 5 6 let start ...

  9. 【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件

    写在前面 在分布式数据库中间件领域,Mycat和ShardingSphere可以说是在开源界有着相当重要的位置,不少小伙伴也在问我:Mycat和sharding-jdbc哪个好呀!其实,就我本身而言, ...

  10. hadoop之yarn(优化篇)

    最近一直在学习hadoop的一些原理和优化,然后也做了一些实践,也有没有去做实践的,反正个人观点都记录下来 一.yarn的介绍 YARN的基本结构由一个ResourceManager与多个NodeMa ...