当前位置: 首页 > news >正文

2018主流网站建设语言如何安装网站模板文件

2018主流网站建设语言,如何安装网站模板文件,虚拟网站多少钱,成都网站建设 工作室一.wire简介 Wire 是一个轻巧的Golang依赖注入工具。它由Go Cloud团队开发#xff0c;通过自动生成代码的方式在编译期完成依赖注入。 依赖注入是保持软件 “低耦合、易维护” 的重要设计准则之一。 此准则被广泛应用在各种开发平台之中#xff0c;有很多与之相关的优秀工…一.wire简介 Wire 是一个轻巧的Golang依赖注入工具。它由Go Cloud团队开发通过自动生成代码的方式在编译期完成依赖注入。 依赖注入是保持软件 “低耦合、易维护” 的重要设计准则之一。 此准则被广泛应用在各种开发平台之中有很多与之相关的优秀工具。 其中最著名的当属 SpringSpring IOC 作为框架的核心功能对Spring的发展到今天统治地位起了决定性作用。 依赖注入很重要所以Golang社区中早已有人开发了相关工具 比如来自Uber 的 dig 、来自Facebook 的 inject 。他们都通过反射机制实现了运行时依赖注入。 二.快速使用 2.1安装 安装很简单运行 go get github.com/google/wire/cmd/wire 之后 wire 命令行工具 将被安装到 $GOPATH/bin 。只要确保 $GOPATH/bin 在 $PATH 中 wire 命令就可以在任何目录调用了。安装成功后运行如下命令 2.2快速入门 设计一个程序其中 Event依赖GreeterGreeter依赖Message package mainimport (fmtgithub.com/pkg/errorstime )type Message stringfunc NewMessage(phrase string) Message {return Message(phrase) }type Greeter struct {Message Message }func NewGreeter(m Message) Greeter {return Greeter{Message: m} }func (g Greeter) Greet() Message {return g.Message }type Event struct {Greeter Greeter // - adding a Greeter field }func NewEvent(g Greeter) (Event, error) {if time.Now().Unix()%2 0 {return Event{}, errors.New(could not create event: event greeter is grumpy)}return Event{Greeter: g}, nil }func (e Event) Start() {msg : e.Greeter.Greet()fmt.Println(msg) }如果运行Event需要逐个构建依赖代码如下 func main() {message : NewMessage(lisus2000)greeter : NewGreeter(message)event : NewEvent(greeter)event.Start() } 在此之前先介绍两个概念 Provider Provider 你可以把它理解成工厂函数这个函数的入参是依赖的属性返回值为新一个新的类型实例 如下所示都是 provider 函数在实际使用的时候往往是一些简单的工厂函数这个函数不会太复杂。 func NewMessage() Message {return Message(Hi there!) }func NewGreeter(m Message) Greeter {return Greeter{Message: m} } Injector 我们常常在 wire.go 文件中定义 injector injector也是一个普通函数它用来声明组件之间的依赖关系 如下代码我们把Event、Greeter、Message 的工厂函数(provider)一股脑塞入wire.Build()中代表着构建 Event依赖Greeter、Message。我们不必关心Greeter、Message之间的依赖关系wire会帮我们处理 func InitializeEvent() Event {wire.Build(NewEvent, NewGreeter, NewMessage)return Event{} } 编写wire.go文件 //go:build wireinject // build wireinjectpackage mainimport github.com/google/wirevar wireSet wire.NewSet(wire.Struct(new(Greeter), Message), NewMessage)func InitializeEvent(phrase string) (Event, error) {//我们常常在 wire.go 文件中定义 injector injector也是一个普通函数它用来声明组件之间的依赖关系//如下代码我们把Event、Greeter、Message 的工厂函数(provider)一股脑塞入wire.Build()中//代表着构建 Event依赖Greeter、Message。我们不必关心Greeter、Message之间的依赖关系wire会帮我们处理panic(wire.Build(NewEvent, wireSet))//return Event{}, nil }注使用wire生成代码时要在代码上加以下 可以在wire.go第一行加入 //build wireinject 与//go:build wireinject等效注释确保了这个文件在我们正常编译的时候不会被引用 在带有wire.go目录下运行wire命令就会生成wire_gen.go文件如下图所示 完整的main.go文件如下 package mainimport (fmtgithub.com/pkg/errorstime )type Message stringfunc NewMessage(phrase string) Message {return Message(phrase) }type Greeter struct {Message Message }func NewGreeter(m Message) Greeter {return Greeter{Message: m} }func (g Greeter) Greet() Message {return g.Message }type Event struct {Greeter Greeter // - adding a Greeter field }func NewEvent(g Greeter) (Event, error) {if time.Now().Unix()%2 0 {return Event{}, errors.New(could not create event: event greeter is grumpy)}return Event{Greeter: g}, nil }func (e Event) Start() {msg : e.Greeter.Greet()fmt.Println(msg) }func main() {event, _ : InitializeEvent(hello)event.Start() }wire的进阶详见https://blog.csdn.net/weixin_50071922/article/details/133278161 三.基于wire构建商品微服务 3.1编写商品微服务提供者 func NewGoodsAppWire(logOpts *log.Options, registrar registry.Registrar, serverOpts *options.ServerOptions,rpcServer *rpcserver.Server) (*gapp.App, error) {//初始化loglog.Init(logOpts)defer log.Flush()return gapp.New(gapp.WithName(serverOpts.Name),gapp.WithRPCServer(rpcServer),gapp.WithRegistrar(registrar),), nil }func NewRegistrar(registry *options.RegistryOptions) registry.Registrar {c : api.DefaultConfig()c.Address registry.Addressc.Scheme registry.Schemeclient, err : api.NewClient(c)if err ! nil {panic(err)}return consul.New(client, consul.WithHealthCheck(true)) }func NewGoodsRPCServerWire(telemetry *options.TelemetryOptions,serverOpts *options.ServerOptions, gserver gpb.GoodsServer) (*rpcserver.Server, error) {// 初始化 open-telemetry 的 exportertrace.InitAgent(trace.Options{Name: telemetry.Name,Endpoint: telemetry.Endpoint,Sampler: telemetry.Sampler,Batcher: telemetry.Batcher,})// 这里会根据 endpoint 为单元注册 trace 服务的实例rpcAddr : fmt.Sprintf(%s:%d, serverOpts.Host, serverOpts.Port)var opts []rpcserver.ServerOptionopts append(opts, rpcserver.WithAddress(rpcAddr))if serverOpts.EnableLimit {opts append(opts, rpcserver.WithUnaryInterceptor(grpc.NewUnaryServerInterceptor()))}grpcServer : rpcserver.NewServer(opts...)gpb.RegisterGoodsServer(grpcServer.Server, gserver)return grpcServer, nil }func NewGoodsServerWire(srv v1.ServiceFactory) proto.GoodsServer {return goodsServer{srv: srv,} }func NewGoodsServiceWire(data v1.DataFactory, dataSearch v12.SearchFactory) ServiceFactory {return service{data: data,dataSearch: dataSearch,} }func GetDBFactoryOr(mysqlOpts *options.MySQLOptions) (v1.DataFactory, error) {if mysqlOpts nil dbFactory nil {return nil, errors.WithCode(code.ErrConnectDB, failed to get mysql store factory)}var err erroronce.Do(func() {dsn : fmt.Sprintf(%s:%stcp(%s:%s)/%s?charsetutf8mb4parseTimeTruelocLocal,mysqlOpts.Username,mysqlOpts.Password,mysqlOpts.Host,mysqlOpts.Port,mysqlOpts.Database)//希望大家自己可以去封装loggernewLogger : logger.New(log.New(os.Stdout, \r\n, log.LstdFlags), // io writer日志输出的目标前缀和日志包含的内容——译者注logger.Config{SlowThreshold: time.Second, // 慢 SQL 阈值LogLevel: logger.LogLevel(mysqlOpts.LogLevel), // 日志级别IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound记录未找到错误Colorful: false, // 禁用彩色打印},)db, err : gorm.Open(mysql.Open(dsn), gorm.Config{Logger: newLogger,})if err ! nil {return}sqlDB, _ : db.DB()dbFactory mysqlFactory{db: db,}//允许连接多少个mysqlsqlDB.SetMaxOpenConns(mysqlOpts.MaxOpenConnections)//允许最大的空闲的连接数sqlDB.SetMaxIdleConns(mysqlOpts.MaxIdleConnections)//重用连接的最大时长sqlDB.SetConnMaxLifetime(mysqlOpts.MaxConnectionLifetime)})if dbFactory nil || err ! nil {return nil, errors.WithCode(code.ErrConnectDB, failed to get mysql store factory)}return dbFactory, nil }func GetSearchFactoryOr(opts *options.EsOptions) (v12.SearchFactory, error) {if opts nil searchFactory nil {return nil, errors.New(failed to get es client)}once.Do(func() {esOpt : db.EsOptions{Host: opts.Host,Port: opts.Port,}esClient, err : db.NewEsClient(esOpt)if err ! nil {return}searchFactory dataSearch{esClient: esClient,}})if searchFactory nil {return nil, errors.New(failed to get es client)}return searchFactory, nil }3.2编写wire.go文件 //go:build wireinject // build wireinjectpackage srvimport (github.com/google/wirev1 mxshop/app/goods/srv/internal/controller/v1mxshop/app/goods/srv/internal/data/v1/data_search/v1/esmxshop/app/goods/srv/internal/data/v1/dbv12 mxshop/app/goods/srv/internal/service/v1mxshop/app/pkg/optionsgapp mxshop/gmicro/appmxshop/pkg/log )func initApp(*log.Options, *options.ServerOptions, *options.RegistryOptions,*options.TelemetryOptions, *options.MySQLOptions, *options.EsOptions) (*gapp.App, error) {wire.Build(NewGoodsAppWire,NewRegistrar,NewGoodsRPCServerWire,v1.NewGoodsServerWire,v12.NewGoodsServiceWire,db.GetDBFactoryOr,es.GetSearchFactoryOr,)return gapp.App{}, nil }3.3生成wire_gen.go文件 生成后的文件如下 // Code generated by Wire. DO NOT EDIT.//go:generate go run github.com/google/wire/cmd/wire //go:build !wireinject // build !wireinjectpackage srvimport (v1_2 mxshop/app/goods/srv/internal/controller/v1mxshop/app/goods/srv/internal/data/v1/data_search/v1/esmxshop/app/goods/srv/internal/data/v1/dbmxshop/app/goods/srv/internal/service/v1mxshop/app/pkg/optionsmxshop/gmicro/appmxshop/pkg/log )// Injectors from wire.go:func initApp(logOptions *log.Options, serverOptions *options.ServerOptions, registryOptions *options.RegistryOptions, telemetryOptions *options.TelemetryOptions, mySQLOptions *options.MySQLOptions, esOptions *options.EsOptions) (*app.App, error) {registrar : NewRegistrar(registryOptions)dataFactory, err : db.GetDBFactoryOr(mySQLOptions)if err ! nil {return nil, err}searchFactory, err : es.GetSearchFactoryOr(esOptions)if err ! nil {return nil, err}serviceFactory : v1.NewGoodsServiceWire(dataFactory, searchFactory)goodsServer : v1_2.NewGoodsServerWire(serviceFactory)server, err : NewGoodsRPCServerWire(telemetryOptions, serverOptions, goodsServer)if err ! nil {return nil, err}appApp, err : NewGoodsAppWire(logOptions, registrar, serverOptions, server)if err ! nil {return nil, err}return appApp, nil }在如下方法替换接口 运行main.go文件如下显示正常启动
http://wiki.neutronadmin.com/news/295187/

相关文章:

  • 南通的网站建设广告推广赚钱
  • 青岛胶东建设国际机场网站专业网络推广平台
  • 做笔记网站网站中常用的英文字体
  • 深圳网站建设服务器玉石电商网站建设方案
  • 邢台建站mvc做的网站如何发布访问
  • 温州网站优化关键词网站建设捌金手指花总四
  • 网站后台不显示可以做网站二维码吗
  • 保定网站建设团队ppt排版布局
  • 论文网站建设格式郴州网红店
  • 学会网站建设总结seo优化方法
  • 域名备案和网站备案推广软文代发
  • 微网站案例饿了吗网站做的比较好的地方
  • cookie做网站访问量大学生作业代做网站
  • 网站加入地图360收录提交申请
  • 那些小网站是哪里人做的重视企业网站
  • 广西备案工信部网站织梦网站图片不显示图片
  • 软件开发流程图种类衡水网站优化
  • 公司没网站怎么做dsp百度网站排名搜行者seo
  • 怎样才能在百度搜索到自己的网站建设网站费用
  • 查答案的网站制作模板html5国内网站
  • 大良营销网站建设方案成都建设高端网站
  • 网站地图做计划任务校园公共设施设计ppt
  • wordpress迁移站点网络推广竞价是什么
  • 郴州网站制作公司招聘seo人员工作内容
  • 网站发布与推广方案大网站建设
  • 达人室内设计网站深圳微信分销网站公司
  • 重庆建网站培训机构企业官方网站模板下载
  • 塘厦镇网站建设公司图案设计
  • 图片站手机网站怎么做免费建站平台哪个好
  • 简单做网站阿里logo设计网站