kratos源码分析系列(4)
接着按目录分析源码:
5,encoding
支持的格式有form、json、proto、xml、yaml,使用的包有
https://github.com/go-playground/form、google.golang.org/protobuf/encoding/protojson,实现了encoding/encoding.go的codec接口
type Codec interface {
// Marshal returns the wire format of v.
Marshal(v interface{}) ([]byte, error)
// Unmarshal parses the wire format into v.
Unmarshal(data []byte, v interface{}) error
// Name returns the name of the Codec implementation. The returned string
// will be used as part of content type in transmission. The result must be
// static; the result cannot change between calls.
Name() string
}
可以根据需要注册编解码方式
func RegisterCodec(codec Codec) {
6,errors 使用了errors/errors.proto自定义proto可选项
extend google.protobuf.EnumOptions {
int32 default_code = 1108;
}
extend google.protobuf.EnumValueOptions {
int32 code = 1109;
}
并提供了相应的包裹和解包裹方法errors/wrap.go
func As(err error, target interface{}) bool { return stderrors.As(err, target) }
func Unwrap(err error) error {
return stderrors.Unwrap(err)
}
func Is(err, target error) bool { return stderrors.Is(err, target) }
6,internal
提供了一系列内部需要的工具方法,比如context
func Merge(parent1, parent2 context.Context) (context.Context, context.CancelFunc) {
func (mc *mergeCtx) Err() error {
endpoint
func ParseEndpoint(endpoints []string, scheme string) (string, error) {
func Scheme(scheme string, isSecure bool) string {
group
func (g *Group) Get(key string) interface{} {
func (g *Group) Reset(new func() interface{}) {
func (g *Group) Clear() {
host
func ExtractHostPort(addr string) (host string, port uint64, err error) {
func Port(lis net.Listener) (int, bool) {
func Extract(hostPort string, lis net.Listener) (string, error) {
httputil
func ContentSubtype(contentType string) string {
func ContentType(subtype string) string {
matcher
func (m *matcher) Add(selector string, ms ...middleware.Middleware) {
func (m *matcher) Match(operation string) []middleware.Middleware {
testdata
7,log
定义了写日志时候的过滤,指定日志输出方式等辅助方法
filter
func FilterFunc(f func(level Level, keyvals ...interface{}) bool) FilterOption {
func (f *Filter) Log(level Level, keyvals ...interface{}) error {
if level < f.level {
return nil
}
global
func init() {
global.SetLogger(DefaultLogger)
}
helper_writter
func (ww *writerWrapper) Write(p []byte) (int, error) {
ww.helper.Log(ww.level, ww.helper.msgKey, string(p))
return 0, nil
}
helper
func (h *Helper) WithContext(ctx context.Context) *Helper {
level
func ParseLevel(s string) Level {
log
func (c *logger) Log(level Level, keyvals ...interface{}) error {
std
func (l *stdLogger) Log(level Level, keyvals ...interface{}) error {
value
func Caller(depth int) Valuer {
Logger统一了日志的接入方式,Helper接口统一的日志库的调用方式。Kratos的日志库主要有如下特性:
Logger用于对接各种日志库或日志平台,可以用现成的或者自己实现
Helper是在您的项目代码中实际需要调用的,用于在业务代码里打日志
Filter用于对输出日志进行过滤或魔改(通常用于日志脱敏)
Valuer用于绑定一些全局的固定值或动态值(比如时间戳、traceID或者实例id之类的东西)到输出日志中
8,metadata
解决了http和grpc之间header的传递问题
func FromServerContext(ctx context.Context) (Metadata, bool) {
func AppendToClientContext(ctx context.Context, kv ...string) context.Context {
_, file, line, _ := runtime.Caller(depth)
默认格式规范
x-md-global-xxx,全局传递,例如 mirror/color/criticality
x-md-local-xxx,局部传递,例如 caller
也可以在 middleware/metadata 定制自己的 key prefix,配置固定的元信息传递
9,metrics
type Counter interface {
With(lvs ...string) Counter
Inc()
Add(delta float64)
}
// Gauge is metrics gauge.
type Gauge interface {
With(lvs ...string) Gauge
Set(value float64)
Add(delta float64)
Sub(delta float64)
}
// Observer is metrics observer.
type Observer interface {
With(lvs ...string) Observer
Observe(float64)
}
相关文章
- 【说站】多接口带头像挂件制作短视频去水印微信小程序源码
- 【说站】微信小程序手机动态壁纸头像小程序(带流量主)源码
- 【说站】Tudoucms校园跑腿同学小程序源码
- React源码分析7-state计算流程和优先级
- SpringBoot运行源码分析:Spring应用上下文创建
- 【深入浅出Java原理及实战】「源码分析系列」深入分析反射功能基础使用和原理
- React源码分析--commit
- Python实现的图书分析大屏展示系统(附源码)
- 跳跃列表源码实现
- MySQL源码分析之SQL函数执行
- 【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )
- 【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )
- 【Android 热修复】热修复原理 ( Dex 文件拷贝后续操作 | 外部存储空间权限申请 | 执行效果验证 | 源码资源 )
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
- 【Linux 内核】实时调度类 ⑥ ( 实时调度类核心函数源码分析 | 插入进程到执行队列 | 从执行队列中选择优先级最高的进程 )
- 【Linux 内核 内存管理】物理内存组织结构 ④ ( 内存区域 zone 简介 | zone 结构体源码分析 | zone 结构体源码 )
- 【Linux 内核 内存管理】物理内存组织结构 ⑤ ( 内存区域 zone 类型简介 | 内存区域类型zone_type 枚举源码分析 | zone_type 枚举源码 )
- Spark源码分析之SparkContext详解大数据
- java.util.HashSet, java.util.LinkedHashMap, java.util.IdentityHashMap 源码阅读 (JDK 1.8.0_111)详解编程语言
- 分析Redis源码剖析:深入理解内存数据库(redis源码)
- 分析Linux木马源码剖析:权限的考验(linux木马源码)
- Redis源码分析如何配置自定义参数(源码里redis如何配置)
- XLC编译Redis源码一次挑战成功(xlc编译redis源码)
- 分析Redis网络模型对源码的深入分析(redis网络模型源码)
- jQuery源码分析笔记