zoukankan      html  css  js  c++  java
  • 分布式事务DotNet Core.CAP(1)

    在分布式系统中,存在分布式事务的问题需要我们去解决,这是一个不可避免的问题,.Net中有一个开源的分布式框架可以供我们使用。我们先来看看它是如何使用的。

    1-新建一个.Net Core3.1的WebApi项目

    2-引入以下包

    3-新建一个WebApi作为消息队列的发布方

    PublishController

    [Route("api/[controller]")]
        [ApiController]
        public class PublishController : ControllerBase
        {
            private readonly string ConnectionString = MyConst.mysqlCommectionString;//数据库连接地址
            private readonly ICapPublisher _capBus;
    
            public PublishController(ICapPublisher capPublisher)
            {
                _capBus = capPublisher;
    
            }
    
            [Route("adonet/transaction/publish")]
            public IActionResult AdonetWithTransaction()
            {
                using (var connection = new MySqlConnection(ConnectionString))
                {
                    using (var transaction = connection.BeginTransaction(_capBus, autoCommit: true))
                    {
                        //your business logic code
                        _capBus.Publish("product.services.time", DateTime.Now);//product.services.time为消息队列的名称
                    }
                }
    
                return Ok();
    
            }
        }

    4-新建消息的订阅方

    图片

    具体代码如下

    public interface ISubscriberService
        {
            void ReceivedMessage(DateTime datetime);
        }
    
    
     public class SubscriberService : ISubscriberService, ICapSubscribe
        {
            [CapSubscribe("product.services.time")]
            public void ReceivedMessage(DateTime datetime)
            {
                Console.WriteLine($"============{datetime}===========");
                //throw new Exception($"异常重试!");
    
            }
    
        }

    5-Startup.cs里面初始化DotNetCore.CAP框架内容

    public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            public IConfiguration Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
    
                services.AddTransient<ISubscriberService, SubscriberService>();
    
                services.AddCap(x =>
                {
                    x.UseMySql(MyConst.mysqlCommectionString);
    
                    x.UseRabbitMQ(options =>
                    {
    
                        options.UserName = "admin";//用户名
    
                        options.Password = "admin";//密码
    
                        options.HostName = "172.17.17.17";//rabbitmq ip
    
                        //options.Port = 15672;
    
                    });
    
                    x.UseDashboard();//DotNetCore.CAP框架管控台,地址是:http://localhost:端口/cap
    
                });
    
            }
    
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
    
                });
    
            }
    
        }

    6-在数据库里面新建一个空的数据库,名字叫capdb,注意这个名字是可以自定义的,但注意在数据库连接地址的地址就要与你自定义的名字保持一致

    7-我们请求地址

    http://localhost:49237/api/Publish/adonet/transaction

    8-这时订阅方即SubscriberService会收到消息

    9-这时数据库里面会自动生成2张表,且里面会各自有一条数据,这表的作用可以认为就是分布式事务的事务日志表

    更多分享请关注我的公众号

  • 相关阅读:
    数据结构学习之前言,为年后换新工作做准备
    马云不想成为“马云”
    2014找工作总结-机会往往留给有准备的人
    数据分析≠Hadoop+NoSQL,不妨先看完善现有技术的10条捷径
    做个犀利的码农:如何持续培养/更新自己的开发技能
    Google七夕情人节Doodle背后技术揭秘
    把帖子用循环显示出来
    php验证登录
    用户注册
    form 表单用php来跳转页面
  • 原文地址:https://www.cnblogs.com/wangoublog/p/15336953.html
Copyright © 2011-2022 走看看