基础服务
3 分钟阅读
简要概述
描述服务的基础信息。
配置示例
services:
root_path: grpc-kit
namespace: example
service_code: test1.v1.opsaid
api_endpoint: api.grpc-kit.com
grpc_address: 0.0.0.0:10081
http_address: 0.0.0.0:10080
数据结构
// ServicesConfig 基础服务配置,用于设定命名空间、注册的路径、监听的地址等
type ServicesConfig struct {
RootPath string `mapstructure:"root_path"`
Namespace string `mapstructure:"namespace"`
ServiceCode string `mapstructure:"service_code"`
APIEndpoint string `mapstructure:"api_endpoint"`
// Deprecated: 使用 GRPCService 代替,优先级低于 GRPCService 配置
GRPCAddress string `mapstructure:"grpc_address"`
// Deprecated: 使用 HTTPService 代替,优先级低于 HTTPService 配置
HTTPAddress string `mapstructure:"http_address"`
PublicAddress string `mapstructure:"public_address"`
GRPCService *GRPCService `mapstructure:"grpc_service"`
HTTPService *HTTPService `mapstructure:"http_service"`
Integrations struct {
GRPC struct {
Admin *bool `mapstructure:"admin"`
}
} `mapstructure:"integrations"`
SecurityKey string `mapstructure:"security_key"`
}
配置参数
| 名称 | 类型 | 说明 |
|---|---|---|
| root_path | string | 服务注册的前缀,全局统一,一般同组织代码 |
| namespace | string | 服务注册的空间,全局统一 |
| service_code | string | 服务的代码,名称唯一且必填,格式:应用短名.接口版本.产品代码 |
| api_endpoint | string | 接口网关的地址 |
| grpc_address | string | (Deprecated)服务所监听的 grpc 地址,请改用 grpc_service.address;如未设置,自动监听在 127.0.0.1 的随机端口 |
| http_address | string | (Deprecated)服务所监听的 http 地址,请改用 http_service.address;如未设置,则不开启 gateway 服务 |
| public_address | string | 服务注册,外部网络可连接的 grpc 地址(一般等同于 grpc-address) |
| grpc_service | object | gRPC 监听的详细配置(地址、tls_server/tls_auto 证书等),见下方 TLS 场景 |
| http_service | object | HTTP 监听的详细配置(地址、tls_server/tls_client 证书等),见下方 TLS 场景 |
| integrations | object | 内置集成服务开关,见下方「开启内置 admin 集成服务」 |
| security_key | string | 内置服务使用的对称加密密钥(AES),建议 32 字节(AES-256) |
应用场景
开启 http 监听
services:
service_code: test1.v1.opsaid
http_address: 127.0.0.1:8080
grpc_address: 127.0.0.1:10081
启动服务,将会在 127.0.0.1 上的 8080 监听 http 协议请求,这些请求会自动转化为 grpc 协议至 127.0.0.1 的 10081 端口。
关闭 http 监听
services:
service_code: test1.v1.opsaid
grpc_address: 127.0.0.1:10081
启动服务,将仅在 127.0.0.1:10081 端口监听 grpc 协议。
开启内置 admin 集成服务
services:
service_code: test1.v1.opsaid
integrations:
grpc:
admin: true
security_key: "0123456789abcdef0123456789abcdef"
配合已启用的关系数据 配置,启动时将:
- 在 gRPC 服务上注册内置管理服务
KnownAdmin(api.known.admin.v1); - 于同一数据库实例自动创建/迁移 lion 数据库结构(
lion_*前缀的表, 覆盖用户、角色、菜单、策略、部门、OAuth2 客户端等)。
说明:
admin为三态开关:未配置(等同false)不注册内置 admin 服务;- 该服务依赖
database.enable: true,未启用数据库时可降级;已启用数据库但连接失败会使 Init 返回错误。降级时 仅记录admin service database unavailable并跳过 lion 结构创建; security_key供内置 admin 服务做 AES 对称加密(如口令加密存储), 建议使用 32 字节随机串;未设置时框架使用固定默认密钥兜底,生产必须显式替换。
使用 TLS 加密 gRPC 或 HTTP 连接
- 本地 HTTP Server 手工配置 TLS 证书
services:
# http 服务配置
http_service:
enabled: true
address: 127.0.0.1:8080
# 手工配置服务端证书,优先级低于 tls_auto
tls_server:
cert_file: "./config/tls/http.crt"
key_file: "./config/tls/http.key"
- 本地 HTTP Server 自动配置 TLS 证书
services:
# http 服务配置
http_service:
enabled: true
address: 127.0.0.1:8080
# 通过 acme 自动申请服务端证书,优先级高于 tls_server
tls_auto:
acme:
email: "support@grpc-kit.com"
cache_dir: "./config/tls/"
domains:
- test.grpc-kit.com
- demo.grpc-kit.com
域名需解析到公网 IP 上,而且应用必须可通过该 IP 访问到。这里自动化证书通过 TLS-ALPN-01 实现。
- 本地 GRPC Service 使用单向 TLS 证书
services:
# grpc 服务配置
grpc_service:
enabled: true
address: 127.0.0.1:10081
tls_server:
cert_file: "./config/tls/grpc-server.crt"
key_file: "./config/tls/grpc-server.key"
# http 服务配置
http_service:
tls_server:
ca_file: "./config/tls/grpc-server-ca.crt"
客户端配置了 grpc 服务端的 ca 用于验证服务端连接是否合法有效性。
- 本地 GRPC Service 使用双向 mTLS 证书
services:
# grpc 服务配置
grpc_service:
enabled: true
address: 127.0.0.1:10081
# 如果配置了 mTLS 也需要在 http_service.tls_client 加上相应证书,否则 http 转 grpc 接口不可用
tls_server:
cert_file: "./config/tls/grpc-server.crt"
key_file: "./config/tls/grpc-server.key"
ca_file: "./config/tls/grpc-client-ca.crt"
# http 服务配置
http_service:
tls_server:
ca_file: "./config/tls/grpc-server-ca.crt"
cert_file: "./config/tls/grpc-client.crt"
key_file: "./config/tls/grpc-client.key"
对于使用 mTLS 两边的证书可以来不不同的 ca 签发。
通过 openssl 生成证书
- 创建 ca
cat > ca-csr.conf << EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
C = CN
CN = demo-ca
[ v3_ext ]
basicConstraints=critical,CA:true,pathlen:1
keyUsage=critical,digitalSignature,keyCertSign,cRLSign
EOF
openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr -config ca-csr.conf
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 3650 -extensions v3_ext -extfile ca-csr.conf
- 创建 http 服务证书
cat > ca-csr.conf << EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = CN
CN = http
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 127.0.0.1
IP.2 = 10.5.39.39
DNS.1 = localhost
DNS.2 = opsaid-test6-v1.default.svc
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=critical,digitalSignature,keyEncipherment
extendedKeyUsage=serverAuth
subjectAltName=@alt_names
EOF
openssl genrsa -out http.key 2048
openssl req -new -key http.key -out http.csr -config http-csr.conf
openssl x509 -req -in http.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out http.crt -days 3650 -extensions v3_ext -extfile http-csr.conf
其中 grpc 服务证书方法同 http,以上 “*-csr.conf” 文件内容根据实际情况做更改。
运行与密钥边界
生产明确设置 services.security_key,避免使用源码默认兜底。密钥变更涉及已有加密字段,应规划数据重加密。HTTP listener 的后台启动、健康检查与退出期限见启动与部署检查。