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

网站的制作2 网站内部链接优化

网站的制作,2 网站内部链接优化,品牌官方网站建设,企业网站建设可分为什么层次一.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://www.zqtcl.cn/news/340843/

相关文章:

  • 做外汇网站代理公关团队
  • wordpress登录页面创建seo网站平台
  • 兰州seo整站优化服务商企业网站seo优化方案
  • 高校网站建设管理制度Wordpress动图主题
  • 手机ui设计网站自己做传奇网站
  • 长春网站建设吉网传媒实力牜网站pv是什么意思
  • 西安网站建设培训班无锡seo报价
  • 网站设计的技能高端品牌网站建设公司哪家好
  • 专门做二手书网站或app陕西交通建设集团官方网站
  • 微信商城怎么开徐州网站推广优化
  • 服装店网站建设规划书山西网站的公司
  • 龙岩做网站改版一般多久wordpress后台登入
  • 网站建设税收编码怎么联系企业的网站建设
  • 色块布局网站首页模板各种网站解决方案
  • 电商建站工具手机编辑网页的软件有哪些
  • 网站腾讯备案吗wordpress英文主题怎么用
  • 网站内容建设的建议wordpress主题enfold
  • 哪里做网站优化石家庄学校网站建设
  • 诸暨北京有哪些网站制作公司wordpress菜单外链
  • 免费建网站的步骤wordpress分享可见内容
  • 成都网站建设公司服务商自己做网站还有出路吗
  • 汉南城乡建设局网站网站建设新手教程
  • 网站用途及栏目说明软件外包公司开发流程
  • 公司做网站做淘宝好还是自建网站好
  • 成功网站案例有哪些淮安市交通建设局网站
  • 购买虚拟机建网站网站开发合同变更
  • 备案的网站做跳转不影响备案把购彩网站建设
  • 2w网站建设模式百度应用市场
  • vps主机访问网站湖南建站网站
  • 滨州正规网站建设公司用r语言 做网站点击热力图