net core集成CAP
net core集成CAP
https://www.cnblogs.com/guolianyu/p/9756941.html
一、前言
感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP【手把手视频教程】,之前也在工作中遇到分布式数据一致性的问题,也一直都是基于CAP理论和Base。
之前一直有关注杨老板的博客,直到今天才尝试一下CAP,发现好用,非常的棒,特此把CAP以组件化的方式引入到我的框架中。
二、CAP介绍
针对CAP介绍可以参考上面给出的两个链接。在此我只简单的说明一下:
CAP 是一个在分布式系统中(SOA,MicroService)实现事件总线及最终一致性(分布式事务)的一个开源的 C# 库,她具有轻量级,高性能,易使用等特点。
你可以轻松的在基于 .NET Core 技术的分布式系统中引入CAP,包括但限于 ASP.NET Core 和 ASP.NET Core on .NET Framework。
CAP 以 NuGet 包的形式提供,对项目无任何入侵,你仍然可以以你喜爱的方式来构建分布式系统。
CAP 具有 Event Bus 的所有功能,并且CAP提供了更加简化的方式来处理EventBus中的发布/订阅。
CAP 具有消息持久化的功能,也就是当你的服务进行重启或者宕机时,她可以保证消息的可靠性。
CAP 实现了分布式事务中的最终一致性,你不用再去处理这些琐碎的细节。
CAP 提供了基于 Microsoft DI 的 API 服务,她可以和你的 ASP.NET Core 系统进行无缝结合,并且能够和你的业务代码集成支持强一致性的事务处理。
三、asp.net core集成CAP
由于我的框架是DDD六边形架构,为了解耦方便,我针对外部的工具都是以组件化的方式引入到项目中,即新建了一个CAP类库。
第一步:扩展了Startup类中的IServiceCollection,在CAP中我加入了Consul的注册,如下图:
复制代码
public static void AddCAPConfigure(this IServiceCollection services, IConfiguration configuration)
{
services.AddCap(x =>
{
//使用Dapper ORM
x.UseMySql(configuration.GetConnectionString("DBConnection"));
//使用kafka 进行日志、case的消息推送
//需要配置一下MQ地址,kafka放在linux系统上,不建议放在window上
x.UseKafka(configuration["KafkaConfig"]);
x.UseDashboard();//得到UI界面
//注册服务发现
x.UseDiscovery(d =>
{
d.DiscoveryServerHostName = "192.168.161.163";
d.DiscoveryServerPort = 8500;
d.CurrentNodeHostName = "localhost";
d.CurrentNodePort = 64616;
d.NodeName = "CAP No.1 Node";
});
});
}
复制代码
我用的是mysql数据库,以及使用kafka消息队列,这边要注意,kafka最好部署在linux系统上,在windows系统会存在很多的坑,如果你觉得你的天坑能力强,可以尝试一下。
我这边也集成了 Consul服务注册,如果大家对cosnul感谢的兴趣的可以看我的另外一篇文章:实战中的asp.net core结合Consul集群&Docker实现服务治理 里面有讲解了consul集群部署。
好了然后我在我的主项目中配置一下,就开始用吧:
region 配置CAP
services.AddCAPConfigure(Configuration);
endregion
第二步:在asp.net core webapi项目中新建一个控制器
配置如下:
复制代码
[Route("api/[controller]/[action]")]
public class ValuesController : Controller
{
private readonly ICapPublisher _capBus;
public ValuesController(ICapPublisher capPublisher)
{
_capBus = capPublisher;
}
[HttpGet]
public IActionResult Get()
{
_capBus.Publish("show.time", DateTime.Now);
return Ok();
}
[HttpGet]
[CapSubscribe("show.time")]
public void CheckReceiveMessage(DateTime time)
{
Console.WriteLine(time.AddDays(1));
}
}
复制代码
此处的mysql配置大家可自行补充,或者按照 @Savorboard 给出的demo操作即可。
第三步:部署一下kafka。
我在centos服务器上采用docker部署,命令如下:
//下载zookeeper
docker pull wurstmeister/zookeeper
//下载kafka
docker pull wurstmeister/kafka:2.11-0.11.0.3
//启动zookeeper
docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper
//启动kafka
docker run -d --name kafka --publish 9092:9092
--link zookeeper
--env KAFKA_ZOOKEEPER_CONNECT=192.168.161.163:2181
--env KAFKA_ADVERTISED_HOST_NAME=192.168.161.163
--env KAFKA_ADVERTISED_PORT=9092
--volume /etc/localtime:/etc/localtime
wurstmeister/kafka:2.11-0.11.0.3
部署完毕后就进入下一步运行啦。
第四步:运行项目,运行成功后,我嗯可以在数据库中发现cap会自动在数据库中创建两张表,一张是 发布信息表、一张是接收信息表。
表:
发现 表中有数据存在:
数据体现法发送接收成功。
我们再来看看cap有提供的UI界面,发现里面有一个我们用consul注册的服务器。完美实现。
我们看一下consul集群:
四、总结
欢迎大家积极尝试CAP,我也会在后续的项目中采用CAP,希望我们的社区越来越强大。
net core集成CAP的更多相关文章
- asp.net core集成CAP(分布式事务总线)
一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...
- 如何在你的项目中集成 CAP【手把手视频教程】
前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...
- asp.net core集成MongoDB
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- [Abp 源码分析]十七、ASP.NET Core 集成
0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...
- Net Core集成Exceptionless分布式日志功能以及全局异常过滤
Net Core集成Exceptionless分布式日志功能以及全局异常过滤 相信很多朋友都看过我的上篇关于Exceptionless的简单入门教程[asp.Net Core免费开源分布式异常日志收集 ...
- Asp.Net Core 集成 Hangfire 配置使用 Redis 存储
Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...
- asp.net core 集成JWT(一)
[什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...
随机推荐
- UDP协议----简单的CS模型实现
UDP简单介绍 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议.TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输.但UDP也是网络通信中不可或缺 ...
- LAMP服务器的搭建
LAMP是一组构建Web应用平台的开源软件解决方案,它是一个开源套件组合.其中L:linux,A :Apache HTTP服务器,M : MySQL或MariaDB,P : perl或Python.这 ...
- android studio 慢的问题
转自:http://www.jianshu.com/p/e1c0b46e317c 在使用Android studio的时候常常遇到这样的问题,从github或是其他地方导入项目,Android stu ...
- Hebernate -- 映射继承关系
1. Employee 为基类, 派生出HourEmployee 和 SalaryEmployee两个类. 采用 subclass 元素的继承映射(1) 采用 subclass 的继承映射可以实现对于 ...
- ASCII_01
1.来自“http://baike.baidu.com/link?url=WgFPtGe-rT6x6X0r_OiHGVZAV87Fu4_P5fvr7FsGyrm8QqTGuvVUfg4Jx7Rn-Le ...
- Spring scope解惑
在2.0之前只有两种singleton和prototype(网上说的,没去验证),后面增加了session.request.global session三种专门用于web应用程序上下文的Bean Si ...
- define用于条件编译
格式: #ifndef _test.h_ //这里放不想被重复包含的代码 #define _test.h_ #endif define用于条件编译的意思是不想让头文件重复编译,头文件重复编译会造成的结 ...
- 为啥YII2 会出现 mcrypt_generic_init(): Key size is 0
解决方案如下: (关键) 示例代码中,加密解密类的实例创见通过 Class 同名方法 的方式创建. public function WXBizMsgCrypt($token, $encodingAes ...
- hdu1695莫比乌斯反演模板题
hdu1695 求1<=i<=n&&1<=j<=m,gcd(i,j)=k的(i,j)的对数 最后的结果f(k)=Σ(1<=x<=n/k)mu[x]* ...
- 安装Charles报错
去年用的是charles4.1.2版本,今年这个版本的安装包始终安装报错,不管公司电脑还是自己电脑........ 我的解决方案很Lower的.......... 登录Charles官网:https: ...