Go微服务架构实战 下篇:1. gRPC + Opentracing + Zipkin实现分布式链路追踪系统

【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin) 1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了。架构更复杂、应用更多,要从中快速诊断出问题、找到性能瓶颈,并不是一件容易的事。因此,也随着诞生了一系列面向DevOps的诊断与分析系统,主要是以下三个系统: 集中式日志系统(Logging) 集中式度量系统(Metrics) 分布式追踪系统(Tracing) 三者相互交织重叠如下: 技术栈上的成熟框架有,... 阅读详情

Go微服务架构实战-【公粽号:堆栈future】

原文
Go微服务架构实战目录

1. 微服务架构上篇

1. grpc技术介绍

2. grpc+protobuf+网关实战

3. etcd技术介绍

4. 基于etcd的服务发现与注册

5. 基于etcd的分布式锁实战

2. 微服务架构中篇

1. k8s架构介绍

2. 基于k8s的容器化部署

3. 基于k8s的Deployment工作负载

4. 基于k8s的ingress实战

5. 基于ingress和service实现灰度发布

6. 常见的服务治理策略

3. 微服务架构下篇

分布式链路追踪实战

干货:


什么是APM

什么是Opentracing

什么是SpanID

什么是TraceID

基于zipkin构建链路追踪


1. 什么是APM

APM(Application Performance Management,即应用性能管理,在分布式领域也称为分布式跟踪管理)对企业的应用系统进行实时监控,它是用于实现对应用程序性能管理和故障管理的系统化的解决方案。

APM核心功能:

  • 服务调用跟踪

  • 应用系统存活检测

  • 监控告警

开源APM管理工具:

  • ZipKin

  • PinPoint

  • SkyWalking

  • Prometheus

我们这篇文章主要是讲解APM的核心功能之一:服务调用跟踪,用到的工具是ZipKin,本来想用Prometheus搭建一个监控平台,想来想去比较简单,大家直接在本地就可以搭建单机版的监控平台。

2. 什么是Opentracing

OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实现。

不过OpenTracing并不是标准。因为CNCF不是官方标准机构,但是它的目标是致力为分布式追踪创建更标准的API和工具。

3. 什么是TraceID

一个trace代表了一个事务或者流程在(分布式)系统中的执行过程,而这个过程会有唯一ID去标识,这个唯一ID就是Trace ID,通俗解释就是一个API请求的完整调用流程。

4. 什么是SpanID

一个span代表在分布式系统中完成的单个工作单元,这个工作单元有唯一ID去标识,这个唯一ID就是Span ID。也包含其他span的“引用”,这允许将多个spans组合成一个完整的Trace。

通俗解释就是在Trace这样一个完整调用的流程中,Span扮演的角色就是每次执行的一次IO或者非IO操作。所以你通过Trace找到整个链路,然后从链路中找到确定的Span,这样就可以准确定位一次问题或者性能查询。

5. 其他名称解释

Span tags(跨度标签)可以理解为用户自定义的Span注释。便于查询、过滤和理解跟踪数据。

Span logs(跨度日志)可以记录Span内特定时间或事件的日志信息。主要用于捕获特定Span的日志信息以及应用程序本身的其他调试或信息输出。

SpanContext 代表跨越进程边界,传递到子级Span的状态。常在追踪示意图中创建上下文时使用。

6. 案例

图片

图中可以看到以下内容:

  • 执行时间的上下文

  • 服务间的层次关系

  • 服务间串行或并行调用链

结合以上信息,在实际场景中我们可以通过整个系统的调用链的上下文、性能等指标信息,一下子就能够发现系统的痛点在哪儿。

7. 什么是ZipKin

Zipkin是分布式追踪系统。它的作用是收集解决微服务架构中的延迟问题所需的时序数据。它管理这些数据的收集和查找。

Zipkin的设计基于Google Dapper论文。

8. 基于ZipKin构建链路追踪

首先在基于之前的项目之中,把server.go修改一下,让其支持分布式链路追踪。server.go:

const (
 SERVICE_NAME              = "simple_zipkin_server"
 ZIPKIN_HTTP_ENDPOINT      = "http://127.0.0.1:9411/api/v2/spans" //上报到ZipKin中的链路
 ZIPKIN_RECORDER_HOST_PORT = "0.0.0.0"
)

func main() {
 ...

 //链路日志输出到哪
 reporter := httpreporter.NewReporter(ZIPKIN_HTTP_ENDPOINT)
 defer reporter.Close()

 //记录服务名称和端口
 endpoint, err := zipkin.NewEndpoint(SERVICE_NAME, ZIPKIN_RECORDER_HOST_PORT)
 if err != nil {
  log.Fatalf("zipkin.NewEndpoint err: %v", err)
 }

 tracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint))
 if err != nil {
  log.Fatalf("zipkin.NewTracer err: %v", err)
 }

 //接入opentracing
 t := zipkinot.Wrap(tracer)
 opentracing.SetGlobalTracer(t)

 logrus.Infof("starting hello service at: %s", *port)
  
 //初始化grpc server,并注册中间件
 s := grpc.NewServer(
  // otgrpc.LogPayloads 是否记录 入参和出参
  // otgrpc.SpanDecorator 装饰器,回调函数
  // otgrpc.IncludingSpans 是否记录
  grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(otgrpc.OpenTracingServerInterceptor(t,
   otgrpc.LogPayloads(),
   // IncludingSpans是请求前回调
   otgrpc.IncludingSpans(func(parentSpanCtx opentracing.SpanContext, method string, req, resp interface{}) bool {
    log.Printf("method: %s", method)
    log.Printf("req: %+v", req)
    log.Printf("resp: %+v", resp)
    return true
   }),
   // SpanDecorator是请求后回调
   otgrpc.SpanDecorator(func(span opentracing.Span, method string, req, resp interface{}, grpcError error) {
    log.Printf("method: %s", method)
    log.Printf("req: %+v", req)
    log.Printf("resp: %+v", resp)
    log.Printf("grpcError: %+v", grpcError)
   }),
  ))),
  )
    
 //注册服务
 pb.RegisterGreeterServer(s, &server{})
 fmt.Println("ddd")
 s.Serve(lis)
}

至此我们的grpc服务就有了链路追踪功能,接下来我们演示下,启动server.go:k8s-grpc-demo go run cmd/svr/svr.go -port 50004

然后启动客户端:k8s-grpc-demo go run cmd/cli/cli.go

我们可以看下server.go的日志:图片我们发现日志完美记录到ZipKin中,接下来我们看下ZipKin地址:图片当我们点击RUN QUERY的时候可以看到如下:图片当我们点击某一个Trace的时候,就进入这个Trace的整个调用链路详情中:

图片

这样我就基于gRPC + Opentracing + Zipkin的分布式链路追踪系统就搭建完成了,大家下去可以自己尝试下。

9. 小结

各位读者朋友们,我们的Go微服务架构实战【上中下】系列课程到这里就基本上结束了,写作过程中虽然很累,很艰辛,但是这个系列能在有限的业余时间坚持创作完实属不易,希望在之后的业余时间当中能继续为大家带来更棒的系列课程,欢迎大家点赞、关注和分享。

最后再次感谢大家对本系列课程的大力支持,由于个人能力有限,难免哪里写的有问题欢迎大家指出,也欢迎各位能在百忙之中抽出时间学习,最后和各位分享一句话:简单的东西不一定是最好的,但最好的东西一定是简单的。

公粽号:堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

几款符合 OpenTracing 规范的分布式链路追踪组件介绍与选型 分布式链路追踪组件是在分布式架构中很重要的组件,用于排查分布式系统所遇到的问题。市面上有多款流行的分布式链路追踪组件,包括 Zipkin、Jaeger、Pinpoint 和 Skywal... 阅读详情

相关推荐

go-zero的全链路追踪与超时

目前分布式链路追踪系统基本都是根据谷歌的《Dapper大规模分布式系统的跟踪系统》这篇论文发展而来,主流的有zipkin,pinpoint,skywalking,cat,jaeger等。 论文链接:https://storage.googleapis.com/pub-tools-public-publication-data/pdf/36356.pdf go-zero框架全链路追踪思路 一.httpServer实现TracingHandler func TracingHandler(next ht

qq_16059847的博客 4432

【链路追踪】Jaeger基于go的「Gin」「gRPC」进行链路追踪

【链路追踪】jaeger - 基于go的gin和grpc进行追踪

Jzin的博客 3352

在优快云学Golang工程组件(微服务工具集go-kit)

KrakenD提供了很多特性,包括请求路由、反向代理、缓存、限流、日志记录等,并且可以轻松集成OAuth2认证等第三方服务。API网关是一个位于客户端和后端服务之间的中间层,它负责处理所有的请求和响应,并且提供了一些通用的功能(如身份验证、访问控制、路由、监控等)。在分布式系统中,服务发现和负载均衡是非常重要的技术手段,可以帮助我们实现高可用、高性能的服务架构。在分布式系统中,请求链路追踪是非常重要的技术手段,可以帮助我们快速定位问题、优化性能。在Golang中,我们可以使用一些库来实现这些功能。

YKM_2580的博客 283

分布式链路追踪Jaeger在Golang中的使用

导读】本文介绍了Tracing系统Jeager在go项目中的集成实践。 一个完整的微服务体系至少需要包括: CI / CD 也就是自动化部署服务发现统一的PRC协议监控追踪(Tracing) 要配置上面这些东西可谓说超级复杂, 所以我建议读者 如果可以直接使用istio 它强大到包含了微服务开发需要考虑的所有东西, 上图中的”Observe”就包括了这篇文章所说的”链路追踪(Tracing)”. 但软件行业没有银弹, 强大的工具自然需要强大的人员去管理, 在进阶为大佬之前, 还是得研究一些传统的方案以便成

a...Z 2833

zipkin-go:Zipkin示踪剂库

Zipkin图书馆去 Zipkin Go是由OpenZipkin社区支持的Zipkin的官方Go Tracer实施。 包装组织 zipkin-go的构建考虑到了OpenZipkin社区甚至第3方之间的互操作性,该库由多个软件包组成。 可以在此存储库的根文件夹中找到主要的跟踪实现。 不被视为核心实现或被认为是其他人的受益人的可重用部分放在此存储库中自己的程序包中。 模型 该库实现了模型包中可用的Zipkin V2 Span模型。 它包含一个与Zipkin V2 API兼容的Go数据模型,并且可以自动清理,解析和(反)序列化Zipkin V2官方收集器所使用的所需JSON表示形式。 传播 传播包和B3子包包含用于在参与跟踪的服务之间传播SpanContext(跨度标识符和采样标志)的逻辑。 目前,HTTP和GRPC支持Zipkin B3传播。 中间件 中间件子包包含官方支持的中间件处理程序

ansys workbench 静力结构分析 高阶教程

ansys workbench 静力结构分析 高阶教程 目录ansys workbench 静力结构分析 高阶教程新建工程模型导入设置材料模型简化: 主要内容: 材料设置、模型简化、网格细化、约束分析、接触设置、求解设置、报错处理、结果分析 基础教程: ansys workbench 静力结构分析 基础操作流程(入门) ansys版本: 19.0(16.0及以上均可) 参考资料: 推荐教学视频《有限元分析 张晔》(超详细 ???? )、ansys workbench 超级学习手册(查阅用) 说明:一些基

weixin_43434624的博客 5万+

opentracing: jaeger在grpc中的简单实现

参考项目:https://github.com/grpc-ecosystem/grpc-opentracing 之前用函数调用实现了简单jaeger-demo(https://blog.csdn.net/liyunlong41/article/details/87932953),函数之间利用context传递span信息。现在开始在grpc请求中实现简单的grpc-jaeger-demo,spa...

liyunlonghere 3万+

STM32F4三重ADC+DMA双缓冲实战:用CubeMX搞定同步采样,告别数据覆盖烦恼

本文详细介绍了STM32F4三重ADC与DMA双缓冲技术的实战应用,通过CubeMX配置实现同步采样,解决数据覆盖问题。内容涵盖硬件架构解析、CubeMX工程配置、双缓冲实现技巧及调试优化方法,适用于电机控制、电力监测等需要高精度多通道信号采集的场景。

weixin_30627341的博客 357

springboot3+grpc+zipkin+Micrometer配置

2. 配置类 假设有grpc服务A和B,之间相互调用,那么这两个服务都要配置如下

本作者:想花 1210

l0phtcrack 7(爆破管理员密码)使用教程

l0phtcrack7简称lc7,是爆破计算机管理员密码的软件,早期是网络安全管理员用来检测系统用户是否使用了不安全的密码,后被黑客用于用户口令破解 功能:该工具支持远程破解,理论上能破解所有密码,但对复杂度比较高的密码,破解时间很长 使用前提:1.登录了需要破解的计算机 2.知道需要破解的计算机的一个管理员的账户,密码 ** 也许你会疑惑,我都知道了一个管理员账户密码了,还要另外的管理员密码...

Xiongcanne的博客 2万+

CXSMILES细则-用于在 SMILES 字符串后存储分子的特殊特征

Chemaxon 扩展 SMILES/SMARTS 用于在 SMILES 字符串后存储分子的特殊特征。任何信息都可以存储在 SMILES 字符串后,只要它们由空格或制表符字符分隔,因为 SMILES 解析器会忽略这些信息,或者将它们作为注释使用。扩展特征以以下格式存储:Chemaxon 的扩展 SMILES/SMARTS 不包含非 ASCII 字符,它们通常以字符代码 n 的形式被转义为 &#n;。在 S-group 中,ASCII 字符“,”、“;”、“|”、“{”、“}”也以这种方式转义。此外,符号“$

ASKCOS博客 401

gRPC + Zipkin 分布式链路追踪

在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法。想看看方法的指标,却无处下手?本文将通过 gRPC + Opentracing + Zipkin...

EDDYCJY的博客 650

点云语义分割:RandLANet模型推理C++部署(2)

一、数据读取及预处理 二、模型推理 三、结果保存

zhaoguanhua的博客 3798

带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin

在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法。想看看方法的指标,却无处下手? 本文将通过 gRPC + Opentracing + Zipkin 搭建一个分布式链路追踪系统来实现查看整个系统的链路、性能等指标 ???? Opentracing 是什么 OpenTracing 通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加(或更换)追踪系统的实...

dianfu2892的博客 444

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

微服务,链路追踪,opentracing+jaeger(六)

参考文档 opentracing详解:https://pjw.io/articles/2018/05/08/opentracing-explanations/ opentracing中文文档:https://wu-sheng.gitbooks.io/opentracing-io/content/ jaeger教程:https://pjw.io/articles/2018/05/18/jaeger-tutorial/ jaeger go语言文档:https://godoc.org/github.com/ube

qq_25490573的博客 1520

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 106

nginMesh分布式追踪实战:OpenTracing+Zipkin让微服务每次请求清晰可见

**nginMesh 分布式追踪**是这款 Istio 兼容服务网格的核心可观测能力:它把 OpenTracing 与 Zipkin 直接内嵌到 NGINX Sidecar 代理中,让微服务的每一次请求都能被完整记录、全链路可见,而且业务代码零改造。 ## 为什么微服务需要分布式追踪? 一个典型的微服务应用,一次页面请求往往要穿越多个服务与数据库: [![微服务调用链路示意图,展示 ngin

gitblog_00651的博客 677

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

GO微服务实战第三十节 OpenTracing 规范介绍与分布式链路追踪组件选型

在上一课时,我们介绍了分布式链路追踪组件的相关背景和概念。市面上有多款流行的分布式链路追踪组件,包括 Zipkin、Jaeger、SkyWalking 和 Pinpoint 等,那它们具体的工作特性是怎样的呢?在实际工作中,我们又应该如何选型呢?下面我们就首先介绍下分布式链路追踪中的 OpenTracing 规范,然后再分析下这几款组件的相关特性,以及选型时的对比指标。

fegus的博客 1697

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

「码动四季·开源同行」go实战案例:如何在微服务中集成 Zipkin 组件?

本文介绍了在Go-kit微服务框架中集成Zipkin进行链路追踪的实践方法。文章详细演示了HTTP和gRPC两种调用方式的实现步骤:通过API网关构建、业务服务集成和结果验证三个环节,展示了如何在Go微服务中实现完整的链路追踪功能。在HTTP调用方式中,重点讲解了网关反向代理的追踪设置;在gRPC调用方式中,则详细说明了protobuf定义、服务端和客户端的追踪实现。最终通过Zipkin UI展示了完整的调用链路信息,验证了两种调用方式的追踪效果。该方案为Go微服务的性能监控和问题排查提供了有效手段。

共产主义接班人 677

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

「码动四季·开源同行」go语言:OpenTracing 规范介绍与分布式链路追踪组件选型

本文介绍了分布式链路追踪的OpenTracing规范及主流组件选型。OpenTracing作为中立的API规范,解决了不同追踪系统的兼容性问题。重点分析了四种流行组件:Zipkin简单易用但功能有限;Jaeger云原生支持强,扩展性好;国产SkyWalking性能优异,支持多语言;Pinpoint界面丰富但仅支持Java/PHP。通过对比各组件在功能、性能、语言支持等方面的差异,建议根据实际业务需求进行选择。此外还提到ServiceMesh作为非侵入式替代方案。OpenTracing规范的普及使开发者能灵活

共产主义接班人 509

带入gRPC:分布式链路追踪 gRPC-Opentracing-Zipkin

带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin 原文地址:带入gRPC:分布式链路追踪 gRPC + Opentracing + Zipkin项目地址:https://github.com/EDDYCJY/go... 前言 在实际应用中,你做了那么多 Server 端,写了 N 个 RPC 方法。想看...

weixin_34007020的博客 1259

【go-micro实践】jaeger分布式链路追踪

github完整代码地址 个人博客 安装jaeger jaeger提供一个all in one 的docker镜像,可以快速搭建实验环境 docker run -d --name jaeger -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p 5775:5775/udp -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778...

weixin_33726318的博客 1654

Go微服务全链路跟踪详解

在微服务架构中,调用链是漫长而复杂的,要了解其中的每个环节及其性能,你需要全链路跟踪。 它的原理很简单,你可以在每个请求开始时生成一个唯一的ID,并将其传递到整个调用链。 该ID称为CorrelationID,你可以用它来跟踪整个请求并获得各个调用环节的性能指标。简单来说有两个问题需要解决。第一,如何在应用程序内部传递ID; 第二,当你需要调用另一个微服务时,如何通过网络传递ID。

倚天码农的博客 7714

nginMesh可观测性内幕:自定义Mixer NGINX模块如何实现遥测上报与准入控制

nginMesh 是一个用 **NGINX** 替代 Envoy 的 **Istio 兼容服务网格**。它的**可观测性**完全依赖几个**自定义 NGINX 模块**:`ngx-istio-mixer` 负责向 Istio Mixer 做**遥测上报(report)**与**准入控制(check)**,OpenTracing/Zipkin 模块负责分布式链路追踪。本文带你拆解这套机制的内幕,看看

gitblog_01090的博客 800
上一篇: Go微服务架构实战 中篇:6. 微服务治理策略
下一篇: Go微服务架构实战[完整]
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值