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. 创建Sqlite数据库(二)

    先创建一个数据库表,然后在主activity中执行删除更新操作 public class MainActivity extends AppCompatActivity { @Override prot ...

  2. 循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

    用户在系统登录后,一般会提供一个入口给当前用户更改当前的密码,其实更改密码操作是很简单的一个处理,不过本篇随笔主要是介绍结合前后端来实现这个操作,后端是基于ABP框架的,需要对密码的安全性进行一个设置 ...

  3. LuoguP3615 如厕计划

    题面 现有两个厕所,一个女士专用,一个通用,给出\(2*n\)个排成一列的人的性别 每人如厕需要一分钟,假如女厕是空的,女生中最靠前的可以直接进入. 需要通过调换顺序使得所有人都上完厕所最后的时间为n ...

  4. .netcore 简单使用ElasticSearch

    .netcore 简单使用ElasticSearch(7.6) 最近在捣鼓学习了下ElasticSearch,在此记录下使用.netcore操作elastic search 的实现(简单的封装,使用) ...

  5. Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

    在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...

  6. Vue常用性能优化

    Vue常用性能优化 Vue常用的一些优化方式,主要是在构建项目过程需要注意的方面. 编码优化 避免响应所有数据 不要将所有的数据都放到data中,data中的数据都会增加getter和setter,并 ...

  7. Javascript的运行效率是原生代码的20%-30%

    所以jser们,写代码更仔细些吧. http://www.cnblogs.com/codemood/p/3213459.html

  8. ES2020 系列:可选链 "?." 为啥出现,我们能用它来干啥?

    可选链 "?." 可选链 ?. 是一种访问嵌套对象属性的安全的方式.即使中间的属性不存在,也不会出现错误. "不存在的属性"的问题 如果你才刚开始读此教程并学习 ...

  9. IP 层收发报文简要剖析2--ip报文的输入ip_local_deliver

    ip报文根据路由结果:如果发往本地则调用ip_local_deliver处理报文:如果是转发出去,则调用ip_forward 处理报文. 一.ip报文转发到本地: /* * Deliver IP Pa ...

  10. binary hacks读数笔记(dlopen、dlsym、dlerror、dlclose)

    1.dlopen是一个强大的库函数.该函数将打开一个动态库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.比如 Apache Web 服务器利用这个函数在运行过程中加载 ...