JPA 的 id 生成策略
JPA 有一个@GeneratedValue注解,有一个strategy attribute,如 @GeneratedValue(strategy = GenerationType.IDENTITY)。 常见的可选策略主要有IDENTITY和SEQUENCE。 GenerationType.IDENTITY 要求底层有一个 integer 或者 bigint 类型的自增列( auto-incremented column)。自增列的赋值必须在插入操作之后发生,因为这个原因,Hibernate 无法进行各种优化(特别是 JDBC 的 batch 处理,一次 flush 操作会产生很多条insert 语句,分别执行)。如果事务回滚,自增列的值就会被丢弃。数据库在这个自增操作上有个高度优化的轻量级锁机制,性能非常棒。 MySQL 支持这种 id 生成策略, 使用 MySQL 应该尽量使用这个策略,即使它无法优化。 JPA 用它生成 id,会一条一条地插入新的 entity。 GenerationType.SEQUENCE 数据库有一个所谓的 sequence 对象,可以通过 selec...
Convention over Configuration over Programming
什么是 Convention over Configuration over Programming 在软件工程中,有一条重要的设计哲学层级: Convention over Configuration over Programming 约定优于配置,配置优于编程。 这条原则的核心思想是:能用约定解决的问题,就不要引入配置;能用配置解决的问题,就不要写代码。 它反映了软件设计中对复杂度管理的追求——越是高层次的抽象,使用成本越低,出错概率也越小。 三个层次的含义 Programming(编程) 编程是最灵活但成本最高的方式。开发者需要编写具体的代码逻辑来实现功能。每一行代码都是潜在的 bug 来源,都需要测试、维护和 review。编程适合处理那些真正需要定制化逻辑的场景。 Configuration(配置) 配置是介于约定和编程之间的中间层。通过外部化的配置文件(如 XML、YAML、properties 等),开发者可以在不修改代码的情况下改变程序行为。配置降低了修改成本,但引入了配置管理的复杂度——配置项越多,理解和维护系统的难度就越大。 Convention(约定) ...
重拾TCP/IP协议簇
TCP/IP 协议簇是互联网的基石,是每个工程师都应该掌握的知识。这篇文章将系统地回顾 TCP/IP 协议簇的核心内容。 OSI 模型与 TCP/IP 模型 OSI 模型将网络通信分为七层,而 TCP/IP 模型则将其简化为四层。虽然 OSI 模型是理论标准,但实际应用中 TCP/IP 模型更为广泛。 OSI 七层模型与 TCP/IP 四层模型对应关系 graph TB subgraph OSI七层模型 A[7. 应用层<br/>Application Layer] B[6. 表示层<br/>Presentation Layer] C[5. 会话层<br/>Session Layer] D[4. 传输层<br/>Transport Layer] E[3. 网络层<br/>Network Layer] F[2. 数据链路层<br/>Data Link Layer] G[1. 物理层<br...
Fabric 文档拾遗
基本名词解释 ledger 账本上一系列由事务驱动的状态迁移的记录。状态迁移是链码调用(调用即事务)的结果。这些记录是不可修改顺序的,因此也上抗篡改的。 每个channel有一个账本,但恐怕不只一个账本。 理论上账本是由产生它的链码的命名空间隔离开来的,不能直接被其他链码访问到。 chain 由包含一系列 transaction 的 block 通过hash-link(由散列值作为前驱指针的一种连接方式)组成的数据结构。 state database 记录各种 key 的 latest value。可以被认为上chain的indexed view,可以随时被从链上重建出来。 所以 Fabric 自己就有双层数据结构。 读写集语义 读集和写集搞不好是同一个事务里的数据结构(待查)。 12345678910111213<TxReadWriteSet> <NsReadWriteSet name="chaincode1"> <read-set> <read key="K1", versio...
Fabric 中的 peer
每个 peer 可以拥有若干个 chaincode,也可以拥有若干个 ledger,但并不是一开始就拥有的,而是逐渐被创建出来的。chaincode 一定会定义一个 asset,也就生成了 ledger。一个peer 可以拥有 ledger 而无 chaincode,可见也并不是必然由 chaincode 生成 ledger。比如同一个组织里面多个 peer,只有一个安装了 chaincode(只有这个 peer 可以当作 endorser),其它的peer一样可以拿到 ledger。 peer 的流程架构图大致上是: 为了预防有 peer 的数据不一致,有可能需要 client application 向多个 peer 进行查询。 channel 可以认为是一系列 peers 的逻辑组合,orderer 可以被认为是跨channel的。同一个 channel 的 peers 共享完全一样的账本。 不同的组织完全可以基于同样的账本copy,产生不同的 application。 Fabric 有 identity,identity 有 principal。 transactio...
Hyperledger Fabric 各个容器内环境
peer 容器 /opt/gopath/src/github.com/hyperledger/fabric/peer 虽然是WORKING_DIR,什么都没有。这个目录是/bin/bash永远的进入路径,不管在哪个目录退出,重新进入还是会进入这个路径。 /etc/hyperledger/fabric 12345678910# 原生的三个配置文件。所以修改peer的行为要通过环境变量来修改,让docker用COMMAND启动peer进程的时候吸收这几个配置文件和环境变量core.yaml# 这两个文件似乎不关peer的事情configtx.yamlorderer.yaml# 这两个文件夹要被外部的数据卷映射修改过来,实际上只能依赖于外部# 这个文件夹本质上还是 core.yaml 默认的 mspConfigPath 的值msptls /var/hyperledger/production 这个文件夹存放unix系统里面的动态程序数据。 123456# 它下面有打包好的CIP(chaincode install package)格式的链码 chaincodes/mycc.1.0。ch...
一个滚动重启的状态保存问题
很多时候滚动重启,都会导致状态丢失。比较好的设计方法是把服务本身设计成无状态的,然后在上游的服务上做好 failover,然后增加 standby server,让 sticky 数据 transmit 到 standby 机器上,让 request 失败以后可以自己由上游重传到 standby server。然后就可以滚动重启了。 这大部分场景下还要考虑幂等的问题。 这就看得出热配置热替换的重要性了。在大多数情况下,除了发布新的 feature 升级以外,都应该尽量用热配置来避免重启。
重读 Martin Fowler 的微服务论文原文
背景 Martin Fowler 和 James Lewis 于 2014 年发表的 “Microservices: a definition of this new architectural term” 是微服务架构领域最具影响力的文章之一。这篇文章并非提出微服务的概念(Netflix、Amazon 等公司早已在实践),而是对这一架构风格进行了系统性的定义和特征总结。 文章的核心论点是:微服务架构是一种将应用程序构建为 一组小型服务 的方法,每个服务运行在自己的进程中,通过轻量级机制(通常是 HTTP RESTful API)进行通信。 微服务也是面向服务的(Service-Oriented),但与传统 SOA 有本质区别。传统 SOA 倾向于将集成复杂度集中在 ESB(Enterprise Service Bus)中,试图用一个庞然大物来隐藏分布式系统的复杂性;而微服务则主张将智能放在端点(endpoint),保持通信管道的简单。 以下是对原文九个核心特征的重读和展开。 组件化(Componentization)与服务(Services) Fowler 在文中区分了两种组件...
Hyperledger Fabric MSP 相关问题
Fabric要求所有的 paticipant 有相关的 identity。identity是由x509证书认证的(大致上也就是各种signcert),每个 identity 有自己的 principal,包含了大量的 property,包括但不仅限于组织名。 PKI 生成 identity,而 MSP 表达治理组织的规则,包括哪些 identity 属于哪些组织,且参与网络中。 PKI PKI 是一种标准,一般由四个元素组成: Digital Certificates Public and Private Keys Certificate Authorities Certificate Revocation Lists 数字证书 一个持有一个组织的系列属性的数字文件。常见的数字证书是X509标准的,很像一个国家发放的身份证(有名称,省份,国家,还有组织的名字)。 For example, John Doe of Accounting division in FOO Corporation in Detroit, Michigan might have a digital c...
Hyperledger Fabric 的配置文件解读
Crypto Generator x.509 相关的文件主要包含两个东西:证书和 signing keys。 cryptogen 使用的配置文件是crypto-config.yaml。 x.509 的根证书是ca-cert。它把 peers 和 orderers 绑定到一个 Org 里面。在这个网络里,每个组织都有签发自己的证书的能力,可以用这个 ca 来签发其他证书给节点和 client。 签发交易用的是私钥(keystore),验证交易用的是公钥(signcerts)。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293# Copyright IBM Corp. All Rights Reserved.## SPDX-License-Identifier: Apache-2.0...















