• 【seata源码学习】001


    (PS. 随缘看心情写,坚持不了几天。文章还是写的超级的烂,排版也奇差无比~~~~ 脑壳疼~~~)

    1. 相关知识

    1. netty

    2. netty多线程模型:Reactor模型

    3. protobuf(Google Protocol Buffers)
      “在以不同语言编写并在不同平台上运行的应用程序之间交换数据时,Protobuf 编码可提高效率。”
      个人也没有去大致了解过,只是因为启动seata-server时报错才看到的。
      参考:
      github, protobuf
      深入 ProtoBuf - 简介

    4. "com.typesafe.config"
      "configuration library for JVM languages using HOCON files"
      例如seata中主要的2个配置文件register.conffile.conf,底层都是依赖"com.typesafe.config"读取并解析其配置。
      参考:
      github, com.typesafe.config

    2. protobuf(Google Protocol Buffers)

    启动seata-server时遇到的问题:

    E:Workspace Gitseata-forkcodecseata-codec-protobufsrcmainjavaioseatacodecprotobufconvertorBranchCommitRequestConvertor.java
    Error:(19, 41) java: 程序包io.seata.codec.protobuf.generated不存在
    

    通过查找protobuf的资料...BALABALABALA...

    2.1 protobuf 本地安装

    下载地址:github, protobuf-release

    特别:通过maven-plugin来编译proto文件,可能不需要这么安装protobuf。(ps. 搞懵逼了,i'm five~~)

    注意windows下载的是protoc-3.11.3-win64.zip,而不是protobuf-java-3.11.3.zip(这个需要自己编译)。

    下载并解压后,将bin目录添加到环境变量 - 系统变量 - path。通过cmd验证是否安装成功:

    PS C:UsersAdministrator> protoc --version
    libprotoc 3.11.3
    

    2.2 protobuf-maven-plugin

    1. idea安装插件Protobuf Support(proto语法高亮,mvn编译命令)
    1. maven-plugin 配置,例如seata源码中的相应 pom.xml
    <plugin>
        <groupId>org.xolstice.maven.plugins</groupId>
        <artifactId>protobuf-maven-plugin</artifactId>
        <version>${protobuf-maven-plugin.version}</version>
        <configuration>
            <protoSourceRoot>${project.basedir}/src/main/resources/protobuf/io/seata/protocol/transcation/</protoSourceRoot>
            <protocArtifact>
                com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}
            </protocArtifact>
        </configuration>
        <executions>
            <execution>
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    
    1. 手动编译,idea中Maven - {seata-codec-protobuf 1.0.0} - plugins - protobuf - [protobuf:compile | protobuf:compile-javanano]
      关于protobuf:compile或者protobuf:compile-javanano并不清楚其具体的含义。
      大致的表面现象是,最终生成的代码在target/generated-sources下目录不一样。

    到此,IDEA中查看例如"io.seata.codec.protobuf.convertor.BranchCommitRequestConvertor"不在报错。

    2.3 扩展,protobuf生成代码缺少"com.google.protobuf.nano.*"

    为了解决这个问题,我在codec/seata-codec-protobuf/pom.xml中增加了其MAVEN依赖:

    <!-- vergilyn-comment, 2020-02-13 >>>> 添加 -->
    <dependency>
        <groupId>com.google.protobuf.nano</groupId>
        <artifactId>protobuf-javanano</artifactId>
        <version>3.1.0</version>
    </dependency>
    

    3. 配置文件的读取(register.conf、file.conf)

    register_conf_load

    4. 将seata-server注册到服务注册中心(例如eureka、nacos)

    seata_register_to_nacos

    4.1 备注

    1. seata v1.0.0中,通过nacos获取conf并不支持指定GROUP,默认从SEATA_GROUP获取(在下一个版本开始支持配置GROUP)。
    package io.seata.config.nacos;
    
    public class NacosConfiguration extends AbstractConfiguration {
    
        private static final String SEATA_GROUP = "SEATA_GROUP";
    
        @Override
        public String getConfig(String dataId, String defaultValue, long timeoutMills) {
            String value;
            if ((value = getConfigFromSysPro(dataId)) != null) {
                return value;
            }
            try {
                value = configService.getConfig(dataId, SEATA_GROUP, timeoutMills);
            } catch (NacosException exx) {
                LOGGER.error(exx.getErrMsg());
            }
            return value == null ? defaultValue : value;
        }
    }
    
    1. question: 现在seata支持的nacos的配置是一项一项的(nacos的dataId过多)
    store {
      ## store mode: file、db
      mode = "db"
    
      ## database store property
      db {
        datasource = "druid"
        db-type = "mysql"
        driver-class-name = "com.mysql.jdbc.Driver"
        url = "jdbc:mysql://127.0.0.1:3306/test_microservice"
        user = "root"
        password = "123456"
      }
    }
    
    对应的是7个data-id,而不是一个data-id中的key-value:
    1. store.mode
    2. store.db.datasource
    3. store.db.db-type
    4. ...
    
    1. seata注册到nacos的服务名默认叫“serverAddr”

    相关代码参考:io.seata.discovery.registry.nacos.NacosRegistryServiceImpl#register(...)

    package io.seata.discovery.registry.nacos;
    public class NacosRegistryServiceImpl implements RegistryService<EventListener> {
        private static final String PRO_SERVER_ADDR_KEY = "serverAddr";
    
        @Override
        public void register(InetSocketAddress address) throws Exception {
            validAddress(address);
            // vergilyn-question, 2020-02-13 >>>> FIXME,注册到nacos的serviceName始终是“serverAddr”
            getNamingInstance().registerInstance(PRO_SERVER_ADDR_KEY, address.getAddress().getHostAddress(), address.getPort(), getClusterName());
        }
    }
    

    5. 总结

    1. seata配置的加载
      seata配置加载类(factory模式):io.seata.config.ConfigurationFactory
      不同config.type对应的加载扩展:io.seata.config.ConfigurationProvide

    2. register.conf
      其中只有2个配置:
      a)register.type,将seata-server注册到什么地方。
      b)confi.type,seata-server的一些核心配置。例如"store.mode",seata-server如何记录transaction log。

    3. seata-server注册到什么地方
      io.seata.discovery.registry.RegistryFactory 注册类(factory模式)
      根据从register.conf中配置的不同register.type,调用相应io.seata.discovery.registry.RegistryProvider的实现类。

  • 相关阅读:
    NX二次开发-NXOPEN C#方式创建草图,添加约束,标注尺寸
    NX二次开发-UFUN C方式创建草图,添加约束,标注尺寸
    NX二次开发-NXOPEN C++方式创建草图,添加约束,标注尺寸
    AnyCAD C#开发-RenderWindow3d::ShowCoordinateAxis显示或隐藏坐标轴
    AnyCAD C#开发-RenderWindow3d::ShowWorkingGrid显示或隐藏工作平面
    AnyCAD C#开发-StepReader::Read读取STEP
    AnyCAD C#开发-BrepTools::Fillet把体上所有的边倒圆
    AnyCAD C#开发-BrepTools::MakeArc创建圆弧
    AnyCAD C#开发-BrepTools::MakeEllipseArc创建椭圆弧
    AnyCAD C#开发-BrepTools::Extrude创建拉伸
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/12312183.html
Copyright © 2020-2023  润新知