trpc.group/trpc-go/trpc-go@v1.0.3/docs/user_guide/framework_conf.zh_CN.md (about)

     1  [English](framework_conf.md) | 中文
     2  
     3  # tRPC-Go 框架配置
     4  
     5  ## 前言
     6  
     7  tRPC-Go 框架配置是由框架定义的,供框架初始化使用的配置文件。tRPC 框架核心采用了插件化架构,将所有核心功能组件化,通过基于接口编程思想,将所有组件功能串联起来,而每个组件都是通过配置和插件 SDK 关联。tRPC 框架默认提供 `trpc_go.yaml` 框架配置文件,将所有基础组件的配置统一收拢到框架配置文件中,并在服务启动时传给组件。这样各自组件不用独立管理各自的配置。
     8  
     9  通过本文的介绍,希望帮助用户了解以下内容:
    10  - 框架配置的组成部分
    11  - 如何获取配置参数的含义,取值范围,默认值
    12  - 如何生成和管理配置文件
    13  - 如何使用框架配置,是否可以动态配置
    14  
    15  ## 使用方式
    16  
    17  首先 tRPC-Go 框架不支持框架配置的动态更新,用户在修改完框架配置后,需要**重新启动服务**才会生效。如何设置框架配置有以下三种方式。
    18  
    19  ### 使用配置文件
    20  
    21  **推荐**:使用框架配置文件,`trpc.NewServer()` 在启动时,会先解析框架配置文件,自动初始化所有配置好的插件,并启动服务。建议其他初始化逻辑都放在 `trpc.NewServer()` 之后,以确保框架功能已经初始化完成。tRPC-Go 的默认框架配置文件名称是`trpc_go.yaml`,默认路径为当前程序启动的工作路径,可通过 `-conf` 命令行参数指定配置路径。
    22  
    23  ```go
    24  // 使用框架配置文件方式,初始化 tRPC 服务程序
    25  func NewServer(opt ...server.Option) *server.Server
    26  ```
    27  
    28  ### 构建配置数据
    29  
    30  **不推荐**:此方式不需要框架配置文件,但用户需要自行组装启动参数 `*trpc.Config`。使用这种方式的缺点是配置更改灵活性差,任何配置的修改都需要更改代码,不能实现配置和程序代码的解耦。
    31  
    32  ```go
    33  // 用户构建 cfg 框架配置数据,初始化 tRPC 服务程序
    34  func NewServerWithConfig(cfg *Config, opt ...server.Option) *server.Server
    35  ```
    36  
    37  ### Option 修改配置
    38  
    39  这两种方式都提供了 `Option` 参数来更改局部参数。`Option` 配置的优先级高于框架配置文件配置和 `Config` 配置数据。使用 `Option` 修改框架配置示例如下:
    40  
    41  ``` go
    42  import (
    43    trpc "trpc.group/trpc-go/trpc-go"
    44      server "trpc.group/trpc-go/trpc-go/server"
    45  )
    46  func main() {
    47      s := trpc.NewServer(server.WithEnvName("test"), server.WithAddress("127.0.0.1:8001"))
    48      //...
    49  }
    50  ```
    51  
    52  > 在本文后面章节,我们只会讨论框架配置文件模式。
    53  
    54  
    55  ## 配置设计
    56  
    57  ### 总体结构
    58  
    59  框架配置文件设计主要分为四大部分:
    60  
    61  | 分组 | 描述 |
    62  | ------ | ------ |
    63  | global | 全局配置定义了环境相关等通用配置 |
    64  | server | 服务端配置定义了程序作为服务端的通用配置,包括 应用名,程序名,配置路径,拦截器列表,Naming Service 列表等 |
    65  | client | 客户端配置定义了程序作为客户端时的通用配置,包括拦截器列表,要访问的 Naming Service 列表配置等。推荐客户端配置优先使用配置中心,然后才是框架配置文件中的 client 配置 |
    66  | plugins | 插件配置收集了所有使用插件的配置,由于 plugins 使用 map 是无序管理,在启动时框架会随机逐个把插件配置传给 sdk,启动插件。插件配置格式由插件自行决定 |
    67  
    68  ### 配置详情
    69  
    70  ``` yaml
    71  # 以下配置中,如未特殊说明:String 类型默认为 "";Integer 类型默认为 0;Boolean 类型默认为 false;[String] 类型默认为 []。
    72  # 全局配置
    73  global:
    74    # 必填,通常使用 Production 或 Development
    75    namespace: String
    76    # 选填,环境名称
    77    env_name: String
    78    # 选填,容器名
    79    container_name: String
    80    # 选填,当未配置服务端 IP 时,使用该字段作为默认 IP
    81    local_ip: String(ipv4 or ipv6)
    82    # 选填,是否开启 set 功能,用于服务发现,默认为 N(注意,它的类型是 String,不是 Boolean)
    83    enable_set: String(Y, N)
    84    # 选填,set 分组的名字
    85    full_set_name: String([set 名].[set 地区].[set 组名])
    86    # 选填,网络收包缓冲区大小(单位 B)。<=0 表示禁用,不填使用默认值 4096
    87    read_buffer_size: Integer
    88  # 服务端配置
    89  server:
    90    # 必填,服务所属的应用名
    91    app: String
    92    # 必填,服务所属的服务名
    93    server: String
    94    # 选填,可执行文件的路径
    95    bin_path: String
    96    # 选填,数据文件的路径
    97    data_path: String
    98    # 选填,配置文件的路径
    99    conf_path: String
   100    # 选填,网络类型,当 service 未配置 network 时,以该字段为准,默认为 tcp
   101    network: String(tcp, tcp4, tcp6, udp, udp4, udp6)
   102    # 选填,协议类型,当 service 未配置 protocol 时,以该字段为准,默认为 trpc
   103    protocol: String(trpc, grpc, http, etc.)
   104    # 选填,所有 service 共享的拦截器配置
   105    filter: [String]
   106    # 必填,service 列表
   107    service:
   108      - # 选填,是否禁止继承上游的超时时间,用于关闭全链路超时机制,默认为 false
   109        disable_request_timeout: Boolean
   110        # 选填,service 监听的 IP 地址,如果为空,则会尝试获取网卡 IP,如果仍为空,则使用 global.local_ip
   111        # 如果需要监听所有地址的话,请使用 "0.0.0.0" (ipv4) 或 "::" (ipv6)
   112        ip: String(ipv4 or ipv6)
   113        # 必填,服务名,用于服务发现
   114        name: String
   115        # 选填,该 service 绑定的网卡,只有 ip 为空时,才会生效
   116        nic: String
   117        # 选填,该 service 绑定的端口,address 为空时,port 必填
   118        port: Integer
   119        # 选填,service 监听的地址,为空时使用 ip:port,非空时,忽略 ip:port
   120        address: String
   121        # 选填,网络类型,为空时,使用 server.network
   122        network: String(tcp, tcp4, tcp6, udp, udp4, udp6)
   123        # 选填,协议类型,为空时,使用 server.protocol
   124        protocol: String(trpc, grpc, http, etc.)
   125        # 选填,service 处理请求的超时时间 单位 毫秒
   126        timeout: Integer
   127        # 选填,长连接空闲时间,单位 毫秒
   128        idletime: Integer
   129        # 选填,使用哪个注册中心 polaris
   130        registry: String
   131        # 选填,拦截器列表,优先级低于 server.filter
   132        filter: [String]
   133        # 选填,服务端需要提供的 TLS 私钥,当 tls_key 和 tls_cert 都非空时,才会开启 tls 服务
   134        tls_key: String
   135        # 选填,服务端需要提供的 TLS 公钥,当 tls_key 和 tls_cert 都非空时,才会开启 tls 服务
   136        tls_cert: String
   137        # 选填,如果开启反向认证,需要提供 client 的 CA 证书
   138        ca_cert: String
   139        # 选填,服务端是否开启异步处理,默认为 true
   140        server_async: Boolean
   141        # 选填,服务在异步处理模式下,最大协程数限制,不设置或者 <=0,使用默认值:1<<31 - 1。异步模式生效,同步模式不生效
   142        max_routines: Integer
   143        # 选填,启用服务器批量发包 (writev 系统调用), 默认为 false
   144        writev: Boolean
   145    # 选填,服务常用的管理功能
   146    admin:
   147      # 选填,admin 绑定的 IP,默认为 localhost
   148      ip: String
   149      # 选填,网卡名,ip 字段为空时,会尝试从网卡获取 IP
   150      nic: String
   151      # 选填,admin 绑定的端口,如果为 0,即默认值,admin 功能不会开启
   152      port: Integer
   153      # 选填,读超时时间,单位为 ms,默认为 3000ms
   154      read_timeout: Integer
   155      # 选填,写超时时间,单位为 ms,默认为 3000ms
   156      write_timeout: Integer
   157      # 选填,是否开启 TLS,目前不支持,设置为 true 会直接报错
   158      enable_tls: Boolean
   159  # 客户端配置
   160  client:
   161    # 选填,为空时,使用 global.namespace
   162    namespace: String
   163    # 选填,网络类型,当 service 未配置 network 时,以该字段为准
   164    network: String(tcp, tcp4, tcp6, udp, udp4, udp6)
   165    # 选填,协议类型,当 service 未配置 protocol 时,以该字段为准
   166    protocol: String(trpc, grpc, http, etc.)
   167    # 选填,所有 service 共享的拦截器配置
   168    filter: [String]
   169    # 选填,客户端超时时间,当 service 未配置 timeout,以该字段为准 单位 毫秒
   170    timeout: Integer
   171    # 选填,服务发现策略,当 service 未配置 discovery 时,以该字段为准
   172    discovery: String
   173    # 选填,负载均衡策略,当 service 未配置 loadbalance 时,以该字段为准
   174    loadbalance: String
   175    # 选填,熔断策略,当 service 未配置 circuitbreaker 时,以该字段为准
   176    circuitbreaker: String
   177    # 必填,被调服务列表
   178    service:
   179      - # 被调服务名
   180        # 如果使用 pb,callee 必须与 pb 中定义的服务名保持一致
   181        # callee 和 name 至少填写一个,为空时,使用 name 字段
   182        callee: String
   183        # 被调服务名,常用于服务发现
   184        # name 和 callee 至少填写一个,为空时,使用 callee 字段
   185        name: String
   186        # 选填,环境名,用于服务路由
   187        env_name: String
   188        # 选填,set 名,用于服务路由
   189        set_name: String
   190        # 选填,是否禁用服务路由,默认为 false
   191        disable_servicerouter: Boolean
   192        # 选填,为空时,使用 client.namespace
   193        namespace: String
   194        # 选填,目标服务,非空时,selector 将以 target 中的信息为准
   195        target: String(type:endpoint[,endpoint...])
   196        # 选填,被调服务密码
   197        password: String
   198        # 选填,服务发现策略
   199        discovery: String
   200        # 选填,负载均衡策略
   201        loadbalance: String
   202        # 选填,熔断策略
   203        circuitbreaker: String
   204        # 选填,网络类型,为空时,使用 client.network
   205        network: String(tcp, tcp4, tcp6, udp, udp4, udp6)
   206        # 选填,超时时间,为空时,使用 client.timeout 单位 毫秒
   207        timeout: Integer
   208        # 选填,协议类型,为空时,使用 client.protocol
   209        protocol: String(trpc, grpc, http, etc.)
   210        # 选填,序列化协议,默认为 -1,即不设置
   211        serialization: Integer(0=pb, 1=JCE, 2=json, 3=flat_buffer, 4=bytes_flow)
   212        # 选填,压缩协议,默认为 0,即不压缩
   213        compression: Integer(0=no_compression, 1=gzip, 2=snappy, 3=zlib)
   214        # 选填,client 私钥,必须与 tls_cert 配合使用
   215        tls_key: String
   216        # 选填,client 公钥,必须与 tls_key 配合使用
   217        tls_cert: String
   218        # 选填,服务端 CA 证书路径,为 none 时,跳过对服务端的认证
   219        ca_cert: String
   220        # 选填,校验 TLS 时的服务名
   221        tls_server_name: String
   222        # 选填,拦截器列表,优先级低于 client.filter
   223        filter: [String]
   224  # 插件配置
   225  plugins:
   226    # 插件类型
   227    ${type}:
   228      # 插件名
   229      ${name}:
   230        # 插件详细配置,具体请参考各个插件的说明
   231        Object
   232  ```
   233  
   234  ## 创建配置
   235  
   236  我们已经介绍了程序的启动是通过读取框架配置文件来初始化框架的。那么如何生成框架配置文件呢?本节会介绍以下三种常见方式。
   237  
   238  ### 通过工具创建配置
   239  
   240  框架配置文件可以通过 [trpc-cmdline](https://github.com/trpc-group/trpc-cmdline) 工具生成。配置文件中会自动添加 PB 文件中定义的服务。
   241  
   242  ```shell
   243  # 通过 PB 文件生成桩代码和框架配置文件 "trpc_go.yaml"
   244  trpc create -p helloworld.proto
   245  ```
   246  
   247  需要强调的是,通过工具生成的配置仅为模板配置,用户需要按照自身需求来修改配置内容。
   248  
   249  ### 通过运营平台创建
   250  
   251  对于大型复杂系统来说,最好的实践方式是通过服务运营平台来统一管理框架配置文件,由平台统一生成框架配置文件,并下发到程序要运行的机器。
   252  
   253  ### 环境变量替换配置
   254  
   255  tRPC-Go 也提供了 golang template 模板的方式生成框架配置:支持通过读取环境变量来自动替换框架配置占位符。通过工具或者运营平台创建配置文件模板,然后用环境变量替换配置文件中的环境变量占位符。
   256  
   257  对于环境变量方式的使用,首先要在配置文件中对可变参数使用 `${var}` 来表示,如:
   258  
   259  ```yaml
   260  server:
   261    app: ${app}
   262    server: ${server}
   263    service: 
   264      - name: trpc.test.helloworld.Greeter
   265        ip: ${ip}
   266        port: ${port}
   267  ```
   268  
   269  框架启动时会先读取出配置文件 `trpc_go.yaml`  的文本内容,当识别到占位符时,框架自动到环境变量读取相对应的值,有则替换对应值,没有则替换成空值。
   270  
   271  如上面的配置内容所示,环境变量需要预先设置好以下数据:
   272  
   273  ```shell
   274  export app=test
   275  export server=helloworld
   276  export ip=1.1.1.1
   277  export port=8888
   278  ```
   279  
   280  由于框架配置会解析 `$` 符号,所以用户配置时,除了占位符以外,不要包含 `$` 字符,比如 redis/mysql 等密码不要包含 `$`.
   281  
   282  
   283  ## 示例
   284  
   285  [https://github.com/trpc-group/trpc-go/blob/main/testdata/trpc_go.yaml](https://github.com/trpc-group/trpc-go/blob/main/testdata/trpc_go.yaml)