【seata源碼學習】001 - seata-server的配置讀取和服務注冊


(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 Git\seata-fork\codec\seata-codec-protobuf\src\main\java\io\seata\codec\protobuf\convertor\BranchCommitRequestConvertor.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:\Users\Administrator> 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的實現類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM