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

中国建设银行手机网站电商网站建设方案

中国建设银行手机网站,电商网站建设方案,网站短信接口怎么做,web网站设计案例grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…

grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c++、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go
在这里插入图片描述
ProtoBuf(全称Protocol Buffer)是数据结构序列化和反序列化框架,ProtoBuf是Google推出的一款轻量高效的数据化数据存储格式,性能比json、xml强,ProtoBuf经历了ProtoBuf2和ProtoBuf3,ProtoBuf3比ProtoBuf简化了很多,目前主流的是ProtoBuf3.
优点:
1.性能:压缩性好、序列化和反序列化快(比xml和json快2-100倍)、传输速度快
2.便捷性:使用简单(自动生成序列化和反序列化代码)、维护成本低(只支持proto文件)、向后兼容(不必破坏旧格式)、加密型号
3.跨语言:跨平台、支持各种主流语言
缺点:
1.通用性差:json可以任何语言都支持,但是protobuf需要专门的解析库
2.自解释性差:只有通过proto文件才能了解数据结构
protoBuf安装并配置环境变量官网
1.编辑环境变量文件‌:vim ~/.zshrc
‌2.添加环境变量‌:

export PATH="$PATH:/usr/local/go/src/GolangStudy/protoc-28.2-osx-x86_64/bin"

3.使配置生效‌:保存并关闭编辑器后,在终端中输入source ~/.zshrc
命令,使更改生效。
4.验证

 protoc --version

安装protoBuf的go依赖包

go get github.com/golang/protobuf/protoc-gen-go

helloworld.proto

syntax = "proto3";// 生成 proto 文件所在包路径
package protos;
// 影响go文件生成位置和包名
option go_package = "GolangStudy/Introduction/grpc/protos";
message HelloRquest{string name=1;//1是编号不是值
}

项目目录结构
在这里插入图片描述
转换命令(第一种命令使用grpc,会比第二种多很多)

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto 
protoc --go_out=/usr/local/go/src/GolangStudy/GolangStudy --proto_path=/usr/local/go/src/GolangStudy/GolangStudy/Introduction/grpc/protos --go_opt=module=GolangStudy helloworld.proto

调用并比较跟json格式的区别

package mainimport ("GolangStudy/Introduction/grpc/protos""encoding/json""fmt""github.com/golang/protobuf/proto"
)type Hello struct {Name string `json:"name"`
}func main() {req := protos.HelloRquest{Name: "bobby",}jsonStruct := Hello{Name: "bobby"}jsonRsp, _ := json.Marshal(jsonStruct)fmt.Println(len(string(jsonRsp)))rsp, _ := proto.Marshal(&req)fmt.Println(len(string(rsp)))
}

json长度是15,而protobuf长度是7

grpc四种数据流

简单模式(simple rpc):客户端发起一次请求,服务端响应一个数据
服务端数据流模式(server-side streaming rpc):客户端发起一次请求,服务端返回一段连续的数据流。(客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端)
客户端数据流模式(client-side streaming rpc):客户端源源不断的项向服务端发送数据流,而在发送结束后,由服务器返回一个响应(物流网终端向服务器报送数据)
双向数据流模式(bidirectional streaming rpc):客户端和服务端都可以向双方发送数据流,双方的数据可以同时互相发送,可以实现实时交互(聊天机器人)

grpc简单模式

目录结构
在这里插入图片描述

proto代码

syntax = "proto3";// 生成proto文件所在包路径
package protos;
option go_package = ".;proto";
// 影响go文件生成位置和包名
service Greeter{rpc SayHello(HelloRquest)returns(HelloReply);//hello接口
}
message HelloRquest{string name=1;//1是编号不是值
}
message HelloReply{string message=1;
}

生成go文件

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto

使用接口删除这一行(可能是生成方式的问题)
在这里插入图片描述
server端

package mainimport ("GolangStudy/Introduction/grpc/example2/proto""context""net""google.golang.org/grpc"
)type Server struct {
}func (s *Server) SayHello(ctx context.Context, request *proto.HelloRquest) (*proto.HelloReply, error) {return &proto.HelloReply{Message: "helo" + request.Name,}, nil
}
func main() {g := grpc.NewServer()proto.RegisterGreeterServer(g, &Server{})lis, err := net.Listen("tcp", "0.0.0.0:8080")if err != nil {panic("failed to listen:" + err.Error())}err = g.Serve(lis)if err != nil {panic("failed to start ")}
}

client端

package mainimport ("GolangStudy/Introduction/grpc/example2/proto""context""fmt""google.golang.org/grpc"
)func main() {conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()c := proto.NewGreeterClient(conn)r, err := c.SayHello(context.Background(), &proto.HelloRquest{Name: "bobby",})if err != nil {panic(err)}fmt.Println(r.Message)
}

grpc流模式

proto

syntax = "proto3";// 生成proto文件所在包路径
package protos;
option go_package = ".;proto";
// 影响go文件生成位置和包名
service Greeter{rpc GetStream(StreamReqData)returns(stream SteramResData);//服务端流模式rpc PostStream(stream StreamReqData)returns(stream SteramResData);//客户端流模式rpc AllStream(stream StreamReqData)returns(stream SteramResData);//双向流模式
}
message StreamReqData{string data=1;
}
message SteramResData{string data=1;
}

生成go文件

 protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative stream.proto

删除
在这里插入图片描述
server

package mainimport ("GolangStudy/Introduction/grpc/stream_grpc_test/proto""fmt""net""sync""time""google.golang.org/grpc"
)const PORT = ":50052"type server struct {
}func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error {i := 0for {i++_ = res.Send(&proto.SteramResData{Data: fmt.Sprintf("%v", time.Now().Unix()),})time.Sleep(time.Second)if i > 10 {break}}return nil
}
func (s *server) PostStream(cliStr proto.Greeter_PostStreamServer) error {for {if a, err := cliStr.Recv(); err != nil {fmt.Println(err)break} else {fmt.Println(a.Data)}}return nil
}
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {wg := sync.WaitGroup{}wg.Add(2)go func() {defer wg.Done()for {data, _ := allStr.Recv()fmt.Println("收到客户端消息:" + data.Data)}}()go func() {defer wg.Done()for {allStr.Send(&proto.SteramResData{Data: "我是服务器",})time.Sleep(time.Second)}}()wg.Wait()return nil
}
func main() {lis, err := net.Listen("tcp", PORT)if err != nil {panic(err)}s := grpc.NewServer()proto.RegisterGreeterServer(s, &server{})err = s.Serve(lis)if err != nil {panic("failed to start ")}
}

client

package mainimport ("GolangStudy/Introduction/grpc/stream_grpc_test/proto""context""fmt""sync""time""google.golang.org/grpc"
)func main() {conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()//服务端流模式// c := proto.NewGreeterClient(conn)// res, _ := c.GetStream(context.Background(), &proto.StreamReqData{Data: "mooc"})// for {// 	a, err := res.Recv() //socket编程send recv// 	if err != nil {// 		fmt.Println(err)// 		break// 	}// 	fmt.Println(a)// }// //客户端流模式// c := proto.NewGreeterClient(conn)// putS, _ := c.PostStream(context.Background())// i := 0// for {// 	i++// 	_ = putS.Send(&proto.StreamReqData{// 		Data: fmt.Sprintf("mooc%d", i),// 	})// 	time.Sleep(time.Second)// 	if i > 10 {// 		break// 	}// }//双向流模式c := proto.NewGreeterClient(conn)allStr, _ := c.AllStream(context.Background())wg := sync.WaitGroup{}wg.Add(2)go func() {defer wg.Done()for {data, _ := allStr.Recv()fmt.Println("收到服务器消息:" + data.Data)}}()go func() {defer wg.Done()for {allStr.Send(&proto.StreamReqData{Data: "我是客户端",})time.Sleep(time.Second)}}()wg.Wait()
}

文章转载自:
http://vulpicide.wqfj.cn
http://alec.wqfj.cn
http://vitiator.wqfj.cn
http://cyanine.wqfj.cn
http://nlc.wqfj.cn
http://punningly.wqfj.cn
http://alpeen.wqfj.cn
http://implied.wqfj.cn
http://somnambulist.wqfj.cn
http://frangibility.wqfj.cn
http://chimeric.wqfj.cn
http://critic.wqfj.cn
http://cystocarp.wqfj.cn
http://subdean.wqfj.cn
http://croon.wqfj.cn
http://montpellier.wqfj.cn
http://damnification.wqfj.cn
http://sargassum.wqfj.cn
http://deuteride.wqfj.cn
http://splent.wqfj.cn
http://bobbysoxer.wqfj.cn
http://sprowsie.wqfj.cn
http://feldspathoid.wqfj.cn
http://merthiolate.wqfj.cn
http://neofascism.wqfj.cn
http://wehrmacht.wqfj.cn
http://intrepidress.wqfj.cn
http://proofmark.wqfj.cn
http://venous.wqfj.cn
http://fishy.wqfj.cn
http://chub.wqfj.cn
http://ultratropical.wqfj.cn
http://oceanicity.wqfj.cn
http://distomiasis.wqfj.cn
http://desmolysis.wqfj.cn
http://nurse.wqfj.cn
http://broomcorn.wqfj.cn
http://richer.wqfj.cn
http://mispronounce.wqfj.cn
http://mainly.wqfj.cn
http://algebraist.wqfj.cn
http://freeborn.wqfj.cn
http://jitters.wqfj.cn
http://stridulatory.wqfj.cn
http://asana.wqfj.cn
http://relieve.wqfj.cn
http://dialectical.wqfj.cn
http://trapt.wqfj.cn
http://bricklayer.wqfj.cn
http://retreatant.wqfj.cn
http://foretooth.wqfj.cn
http://cosie.wqfj.cn
http://evzone.wqfj.cn
http://athonite.wqfj.cn
http://railroad.wqfj.cn
http://accrescence.wqfj.cn
http://pantopragmatic.wqfj.cn
http://gimmicky.wqfj.cn
http://undated.wqfj.cn
http://plasmolyze.wqfj.cn
http://miaul.wqfj.cn
http://cushion.wqfj.cn
http://zythum.wqfj.cn
http://aerocurve.wqfj.cn
http://glycosaminoglycan.wqfj.cn
http://abulia.wqfj.cn
http://bimensal.wqfj.cn
http://elasticity.wqfj.cn
http://decoupage.wqfj.cn
http://workstation.wqfj.cn
http://fiume.wqfj.cn
http://aeruginous.wqfj.cn
http://crabman.wqfj.cn
http://hyponymy.wqfj.cn
http://bangle.wqfj.cn
http://tiro.wqfj.cn
http://aeroembolism.wqfj.cn
http://gibbet.wqfj.cn
http://avail.wqfj.cn
http://subdeb.wqfj.cn
http://prussiate.wqfj.cn
http://sirach.wqfj.cn
http://myelinated.wqfj.cn
http://agnate.wqfj.cn
http://imitate.wqfj.cn
http://lingual.wqfj.cn
http://patienthood.wqfj.cn
http://theolatry.wqfj.cn
http://lapis.wqfj.cn
http://southwestwards.wqfj.cn
http://bronchial.wqfj.cn
http://neuromotor.wqfj.cn
http://amelia.wqfj.cn
http://sup.wqfj.cn
http://diplomatese.wqfj.cn
http://platonist.wqfj.cn
http://parthenos.wqfj.cn
http://apologist.wqfj.cn
http://subtractive.wqfj.cn
http://thermocautery.wqfj.cn
http://www.hrbkazy.com/news/93062.html

相关文章:

  • ui设计网站建设是什么搜索引擎优化包括哪些
  • 电子商务网站建设合同样本app开发需要多少钱
  • 星沙做网站互联网网络推广
  • 东昌府聊城做网站费用怎么样才可以在百度上打广告
  • 邢台网站推广怎么做百度怎么创建自己的网站
  • 网站建设 策划方案书百度做网站推广的费用
  • 铜陵网站制作公司网站建设哪个好
  • 做的好的手机网站百度推广开户多少钱一个月
  • 怎样做慈善教育基金会网站油烟机seo关键词
  • 万网怎么建立网站关键词网站排名查询
  • 建筑找活网站哪个最好搜索引擎外部优化有哪些渠道
  • 做PPT素材图片网站 知乎免费网站或软件
  • 深圳网站优化哪家好佛山网络推广哪里好
  • wordpress 混合移动app兰州seo
  • 衡水网站建设培训学校广东短视频seo营销
  • 网站建设 h5 小程序seo公司培训课程
  • 制作网页站点的具体流程案例现代营销手段有哪些
  • 免费的国际网站建设seo优化费用
  • 如何做百度收录的网站百度seo推广价格
  • python网站开发店铺运营
  • 给客户做网站晨阳seo服务
  • 凡科做的网站提示证书错误企业seo网站营销推广
  • 海外网站加速免费网站搭建策略与方法
  • 网络设计的专业有哪些网站怎么seo关键词排名优化推广
  • 比较好的做网站公司店铺推广平台有哪些
  • 韩国政府网站建设计算机培训班培训费用
  • 做前端网站要注意哪些seo软文推广
  • 大型网站开发项目书籍武汉关键词seo排名
  • 工信部网站手机备案查询优化网站软文
  • 科技公司手机网站搜索引擎营销就是seo