Anno微服务引擎与传统应用相融合
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微服务引擎与传统应用相融合的更多相关文章
- Anno微服务Viper(控制面板) 支持在线部署
1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可监控.依赖第三方框架少.可在线升级部署. 2.Viper简介 Viper 是一个基于Anno微服务引擎开发的Da ...
- surging 微服务引擎 2.0 会有多少惊喜?
surging 微服务引擎从2017年6月至今已经有两年的时间,这两年时间有多家公司使用surging 服务引擎,并且有公司搭建了CI/CD,并且使用了k8s 集群,这里我可以说下几家公司的服务搭建情 ...
- 微服务理论之二:面向微服务架构与传统架构、SOA对比,以及云化对比
一.Monolith 网上对Microservice进行介绍的文章常常以Monolith作为开头,我也不会例外.原因是,知道了Monolith的不便之后才能更容易地理解Microservice架构模式 ...
- 云图说丨初识华为云微服务引擎CSE
摘要:微服务引擎(Cloud Service Engine,CSE),是用于微服务应用的云中间件,为用户提供注册发现.服务治理.配置管理等高性能和高韧性的企业级云服务能力 本文分享自华为云社区< ...
- GoldenGate 12.3微服务架构与传统架构的区别
随着Oracle GoldenGate 12c(12.3.0.1.0)的发布,引入了可用于复制业务数据的新架构. 多年来,这种架构有着不同的称谓,Oracle终于在最后GA发布的版本中,以“Micro ...
- Docker微容器+微服务将颠覆传统的软件架构
从我的观点看:Docker是一个微容器,一个云计算的微PaaS容器,类似JVM但比其更强大的容器,直接基于Linux内核,支持各种语言,它比VM虚拟机更加轻量,能够在Linux或云计算IaaS等平台上 ...
- 谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能
一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务 ...
- surging 微服务引擎 -协议主机的Behavior特性
1.前言 因为工作的关系,最近很少更新surging,因为surging 一直处在不温不火的状态,而自己每天利用业余时间进行完善,每天都是疲惫的状态,还要应付新手的提问,曾经一度想放弃,但是有些人劝说 ...
- surging 微服务引擎 1.0 正式发布
surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用,服务引擎支持http.TCP.WS.Mqtt协议,采用Zookeeper.Consul作为surging服务的注册中心,集成了哈希 ...
随机推荐
- uniapp swiper高度自适应问题
这里的话是想做一个比较常见的左右滑动更改tab的效果,引用了uview-ui中的u-tabs-swiper组件,需要结合swiper组件来使用 先来讲下主体思路:每个tab页(swiper-item) ...
- Redis 数据结构与编码技术 (Object Encoding)
数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串.整数.位图) list:列表(可以表示线性表.栈.双端队列.阻塞队列) hash:哈希表 set:集 ...
- lora技术在电力行业的应用
智能电网的目标是建立一个高速通信网络之上的传统电网.它通过传感,分析,预测,决策和控制提供稳定,高效的电力供应.传统电网分为三个主要区域S-发电,输电和配电.先进的计量系统是使这种传统电网智能化的基础 ...
- “wget: 无法解析主机地址”的解决方法
问题: 1 [root@iZ2zefny2a19ms6azli2pwZ ~]# wget https://download.redis.io/releases/redis-5.0.10.tar.gz ...
- 如何在 Debian 9 上搭建 LNMP 环境
步骤一.安装Nginx Nginx在默认的Debian存储库中可用. 使用以下命令更新软件包索引并安装Nginx: sudo apt update sudo apt install nginx 安装过 ...
- 重要 | Spark和MapReduce的对比,不仅仅是计算模型?
[前言:笔者将分上下篇文章进行阐述Spark和MapReduce的对比,首篇侧重于"宏观"上的对比,更多的是笔者总结的针对"相对于MapReduce我们为什么选择Spar ...
- Hash 算法与 Manacher 算法
目录 前言 简单介绍 简述 Hash 冲突 离散化 基本结构 普通 Hash 简述 例题 字符串 Hash 简单介绍 核心思想 基本运算 二维字符串 Hash 例题 兔子与兔子 回文子串的最大长度 后 ...
- Netcore中简单使用MemoryCache
用到缓存架构,我们一般都会想到的Redis,因为它支持分布式,高可用,速率非常快.MemoryCache则相对较少提到,但是对于单体项目或者小型项目,memorycache还是是不错的选择.Memor ...
- 【Kata Daily 190912】Alphabetical Addition(字母相加)
题目: Your task is to add up letters to one letter. The function will be given a variable amount of ar ...
- 1、Web应用
一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...