部署Schema Registry

本章将使用Docker来部署Confluent Schema Registry,

启动Schema Registry容器

如果上一节的zoonavigator容器正在运行,需要将其先停止掉:
docker stop zoonavigator

我们将继续使用AKHQ一节中的docker-compose.yaml文件。

编辑docker-compose.yaml的大概第69行的SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS字段,将其替换为msk集群的broker连接地址,并增加ports字段,将docker内部的8085端口映射:

  schema-registry:
    image: confluentinc/cp-schema-registry
    depends_on:
      - kafka
    environment:
      SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: 'b-2.mskdemo.mxqzz7.c4.kafka.ap-southeast-1.amazonaws.com:9092,b-1.mskdemo.mxqzz7.c4.kafka.ap-southeast-1.amazonaws.com:9092,b-3.mskdemo.mxqzz7.c4.kafka.ap-southeast-1.amazonaws.com:9092'
      SCHEMA_REGISTRY_HOST_NAME: 'schema-registry'
      SCHEMA_REGISTRY_LISTENERS: 'http://0.0.0.0:8085'
      SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: 'INFO'
    ports:
      - 8085:8085

image-20211230000258852

然后保存

重新更新docker-compose并运行:

docker-compose up --force-recreate --build -d

image-20211229235732155

等大概一分钟后所有镜像会创建完毕,并初始化完成。

访问schema registry

访问本机的8085端口,会看到有json结果返回:

image-20211230000515503

此时访问AKHQ的Schema Registry页面,会看到Create a Subject选项:

image-20211229232331742

创建Schema:

image-20211229233116918

Schema的文本如下:

{
    "type":"record",
    "name":"MyRecord",
    "namespace":"com.mycompany",
    "fields": [
          { "name": "id", "type": "string"},
          { "name": "first_name", "type": "string", "default": ""},
          { "name": "last_name", "type": "string", "default":""}
        ]
}

创建完成后,可以在Schema Registry的页面看到所有Subject:

image-20211229233138688

附:Record属性说明

上一步中,我们创建了一个Record,其中有很多json字段,说明如下:

  • name(必填):record的名字
  • namespace:名称空间(可选),相当于java中的包名
  • doc:这个类别的文件说明(可选)
  • aliases:record类别的别名(可选)
  • fields(必填):每个字段需要以下属性:
    • name(必填):栏位名字
    • doc:字段说明文件(可选)
    • type(必填):类别属性
    • default:预设值(可选)
    • order:排序(可选),只有3个值ascending(预设),descending或ignore
    • aliases:别名(可选)

例如,一个record例子:

{
        "type": "record",
        "namespace": "com.aaa",
        "name": "Employee",
        "fields": [
          { "name": "id", "type": "string"},
          { "name": "first_name", "type": "string", "default": ""},
          { "name": "last_name", "type": "string", "default":""}
        ]
   }