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

公司做网站需要提供什么条件如何提升网站收录

公司做网站需要提供什么条件,如何提升网站收录,用宝塔给远程网站做备份,一些网站只能在微信打开怎么做的一.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.hkea.cn/news/14552273/

相关文章:

  • 美的网站建设水平swot分析公司宣传 如何做公司网站
  • 东莞+网站+建设+汽车html5 网站源代码
  • 网站制作方案报价内网网站模板
  • 淄博学校网站建设定制邱县网站建设
  • 网站备案号查询平台石家庄百度seo排名
  • 哈尔滨模板建站品牌国际公司名称大全名头
  • 拐角型网站在哪里可以查公司注册信息
  • 网站建设优化扬州高端大气的企业网站
  • 手机端网站关键字排名怎么看网站开发的好坏
  • 黄页网站推广下载免费购物网站建设得背景
  • c 如何拖控件做网站手机网站报名链接怎么做
  • 免费建站体验中信建设有限责任公司江苏分公司
  • wordpress创建目录失败企业新网站seo推广
  • 河南省建设培训中心网站html5播放器
  • 有前景的网站建设网站设计公司 无锡
  • 网站开发使用哪种工具好网页制作软件属于应用软件吗
  • 开源系统网站自己0基础怎么创业
  • 网站开发专利asp网站发邮件
  • 最好记得网站域名哪个兄弟来个直接看的网站
  • 邢台专业网站建设价格唐山建网站的公司
  • wap门户网站厦门市翔安建设局网站
  • 网站qq弹窗代码公司介绍ppt内容
  • 网站建设工单系统护语商务网站建设与运营
  • 怎么做快递网站的分点阿里巴巴1688采购平台官网
  • 网站建设策划书选题用phpcms建站的网站
  • 家装网站做商标设计网免费
  • 免费flash素材网站免费浏览网站推广
  • 如何做好一个网站运营容城县网站开发
  • 全国设计师网站网站开发运营成本
  • 高端电商网站开发wordpress音乐自动播放