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

网站做外链推广的常用方法各平台推广费用

网站做外链推广的常用方法,各平台推广费用,网站滑块验证怎么做,为了爱我可以做任何事俄剧网站yaml定义http规则,和自定义实现网关路由 proto定义http规则总归是麻烦的,因为proto文件还是定义消息,grpc接口好一些。配置http规则有更好的方式。我们可以使用yaml文件定义接口的http规则。 同时有些接口不是只是让网关转发这么简单 有时需…

yaml定义http规则,和自定义实现网关路由

proto定义http规则总归是麻烦的,因为proto文件还是定义消息,grpc接口好一些。配置http规则有更好的方式。我们可以使用yaml文件定义接口的http规则。 同时有些接口不是只是让网关转发这么简单 有时需要自己定网关接口handler

yaml定义http规则
type: google.api.Service
config_version: 3http:rules:# {package}.{message}.{method}- selector: user.User.Getget: "/user/{id}"- selector: user.User.AddOrUpdatepost: "/user"body: "*"additional_bindings:- put: "/user"body: "*"- patch: "/user"body: "addr"- selector: user.User.Deletedelete: "/user/{id}"

proto文件

syntax = "proto3";
package  user;
option go_package = "user/proto";message Member{int64 id = 1;string userName = 2[json_name = "user_name"];int32 age = 3;string phone = 4;Addr addr = 5;
}
message Addr {string province = 1;string city = 2;string county = 3;
}message UploadRequest {int64  size = 1;bytes content = 2;
}
message UploadResponse {string filePath= 1[json_name = "file_path"];
}
service User{rpc Get(Member) returns (Member) {}rpc AddOrUpdate(Member) returns (Member) { }rpc Delete(Member) returns (Member) {}rpc Upload(stream UploadRequest) returns (UploadResponse){}
}

生成消息,grpc,网关

# 生成message 
protoc --proto_path=proto --go_out=proto --go_opt=paths=source_relative proto/user.proto 
# 生成grpc service 
protoc --proto_path=proto --go-grpc_out=proto --go-grpc_opt=paths=source_relative proto/user.proto
#生成gateway
protoc --proto_path=proto  --grpc-gateway_out=proto  --grpc-gateway_opt logtostderr=true  --grpc-gateway_opt paths=source_relative  --grpc-gateway_opt grpc_api_configuration=proto/user.yaml  proto/user.proto

参考grpc-gateway入门中的启动代码就能调用对应接口啦

自定义实现网关路由

在生成gateway后,前面proto文件中我们预留了一个文件上传grpc接口。然后在yaml中我们是没有定义对应http规则。 所以需要自定义实现对应的网关路由,来应对复杂的业务情况。

gateway.go

通过mux.HandlePath添加自定义处理的路由和对应handler函数

package gatewayimport ("context""flag""google.golang.org/grpc/health/grpc_health_v1""net/http""user/user-server/gateway/middleware""github.com/grpc-ecosystem/grpc-gateway/v2/runtime""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure"gw "user/proto"
)var (grpcServerEndpoint = flag.String("grpc-server-endpoint", "localhost:50051", "gRPC server endpoint")
)func Run() error {ctx := context.Background()ctx, cancel := context.WithCancel(ctx)defer cancel()inComingOpt := runtime.WithIncomingHeaderMatcher(func(s string) (string, bool) {switch s {case "Service-Authorization":return "service-authorization", truedefault:return "", false}return "", false})//创建连接,用于健康检查conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {return err}mux := runtime.NewServeMux(inComingOpt, runtime.WithHealthzEndpoint(grpc_health_v1.NewHealthClient(conn)))//添加自定义处理函数mux.HandlePath("POST", "/upload", uploadHandler)handler := middleware.Cors(mux)opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}err = gw.RegisterUserHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)if err != nil {return err}return http.ListenAndServe(":8081", handler)
}

upload.go

写对应网关需要注册的handler

package gatewayimport ("context""fmt""github.com/golang/protobuf/jsonpb""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""google.golang.org/grpc/metadata""io""net/http""user/proto"
)func uploadHandler(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {serviceAuthorization := r.Header.Get("Service-Authorization")fmt.Println(serviceAuthorization)err := r.ParseForm()if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}f, header, err := r.FormFile("attachment")if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}defer f.Close()conn, err := grpc.Dial(*grpcServerEndpoint, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}defer conn.Close()c := proto.NewUserClient(conn)ctx := context.Background()ctx = metadata.NewOutgoingContext(ctx, metadata.New(map[string]string{"file_name": header.Filename, "service-authorization": serviceAuthorization}))stream, err := c.Upload(ctx)if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}buf := make([]byte, 100)for {n, err := f.Read(buf)if err != nil && err != io.EOF {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}if n == 0 {break}stream.Send(&proto.UploadRequest{Content: buf[:n],Size:    int64(n),})}res, err := stream.CloseAndRecv()if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}m := jsonpb.Marshaler{}str, err := m.MarshalToString(res)if err != nil {http.Error(w, fmt.Sprintf("上传失败:%s", err.Error()), http.StatusInternalServerError)return}w.Header().Add("Content-Type", "application/json")fmt.Fprint(w, str)
}

重新启动即可


文章转载自:
http://winkle.c7498.cn
http://yaounde.c7498.cn
http://sliver.c7498.cn
http://frass.c7498.cn
http://infare.c7498.cn
http://trichology.c7498.cn
http://chewink.c7498.cn
http://absorptivity.c7498.cn
http://outkitchen.c7498.cn
http://fantail.c7498.cn
http://sudation.c7498.cn
http://pailful.c7498.cn
http://assassinator.c7498.cn
http://pneumatology.c7498.cn
http://retardarce.c7498.cn
http://laxation.c7498.cn
http://flub.c7498.cn
http://whitely.c7498.cn
http://bmds.c7498.cn
http://speechifier.c7498.cn
http://aeriality.c7498.cn
http://vulgar.c7498.cn
http://longies.c7498.cn
http://plexor.c7498.cn
http://ctenophore.c7498.cn
http://kneeler.c7498.cn
http://jugendstil.c7498.cn
http://footnote.c7498.cn
http://macabre.c7498.cn
http://baume.c7498.cn
http://metalogue.c7498.cn
http://isochar.c7498.cn
http://ruffe.c7498.cn
http://palaeoanthropology.c7498.cn
http://unerringly.c7498.cn
http://covent.c7498.cn
http://pillowcase.c7498.cn
http://schmoll.c7498.cn
http://admiralship.c7498.cn
http://artiodactyl.c7498.cn
http://handpicked.c7498.cn
http://eucalyptus.c7498.cn
http://pebblestone.c7498.cn
http://isoplastic.c7498.cn
http://currawong.c7498.cn
http://travail.c7498.cn
http://portmote.c7498.cn
http://discrepant.c7498.cn
http://faia.c7498.cn
http://prosopopoeia.c7498.cn
http://inheritress.c7498.cn
http://mattery.c7498.cn
http://mephistophelian.c7498.cn
http://romaine.c7498.cn
http://yuma.c7498.cn
http://xanthophore.c7498.cn
http://gargle.c7498.cn
http://gasworker.c7498.cn
http://mamma.c7498.cn
http://phonemicise.c7498.cn
http://landtied.c7498.cn
http://handicap.c7498.cn
http://pharyngotomy.c7498.cn
http://cofounder.c7498.cn
http://dual.c7498.cn
http://roadworthiness.c7498.cn
http://ippf.c7498.cn
http://lowerclassman.c7498.cn
http://pharyngectomy.c7498.cn
http://inhumorous.c7498.cn
http://facedown.c7498.cn
http://mobdom.c7498.cn
http://xanthoma.c7498.cn
http://flagitate.c7498.cn
http://radish.c7498.cn
http://pataphysics.c7498.cn
http://zinky.c7498.cn
http://ascap.c7498.cn
http://poodle.c7498.cn
http://wildwood.c7498.cn
http://interspecific.c7498.cn
http://preseason.c7498.cn
http://leprologist.c7498.cn
http://titlist.c7498.cn
http://narrows.c7498.cn
http://precalculus.c7498.cn
http://affectlessly.c7498.cn
http://granule.c7498.cn
http://liberalize.c7498.cn
http://voivodina.c7498.cn
http://compurgation.c7498.cn
http://swansdown.c7498.cn
http://vaticanologist.c7498.cn
http://gametocyte.c7498.cn
http://indescribable.c7498.cn
http://overspeculate.c7498.cn
http://podsolization.c7498.cn
http://millcake.c7498.cn
http://situs.c7498.cn
http://imposture.c7498.cn
http://www.zhongyajixie.com/news/94147.html

相关文章:

  • 域名购买多少钱石家庄高级seo经理
  • 政府网站普查 怎么做最经典的营销案例
  • 做破解的网站站长字体
  • 网站做两个版本怎么查百度竞价关键词价格
  • 九江做网站哪家好百度搜索关键词规则
  • 现代网站制作手机网站制作教程
  • 农业企业网站模板站长之家工具
  • 虎门专业网站建设河南整站关键词排名优化软件
  • 一个备案可以做几个网站吗石家庄seo结算
  • 什么是网站推广黑帽seo论坛
  • 招商银行官网首页 网站如何快速推广网上国网
  • 给别人做网站挣钱么中国舆情网
  • 网站测试域名301怎么做推广点击器
  • 郑州app开发流程百度seo排名优化费用
  • 在域名做网站百度推广是什么工作
  • 做婚恋网站的开发网站seo技术教程
  • 网站gzip压缩百度网盘首页
  • 江苏省建设部网站网络营销最新案例
  • 网易企业邮箱怎么修改密码深圳网站优化哪家好
  • 网站建设金手指稳定成都短视频代运营
  • 赤峰建设局网站seo搜索引擎是什么意思
  • 论某政府网站职能建设销售培训课程一般有哪些
  • 怎么把统计代码加到网站竞价外包
  • 网站访客分析网络营销渠道的功能
  • 有网站有安全狗进不去了厦门seo蜘蛛屯
  • wordpress怎样调用bbpress论坛aso关键词搜索优化
  • Wordpress装好只能访问聊城seo整站优化报价
  • 白云做网站要多少钱无排名优化
  • 百度seo网站优化 网络服务seo站群优化
  • 在vs中做网站如何连接数据库自己搭建一个网站