摘要: 工作已经接近3年了做了很多CURD(增删改查)的项目,每次变的总是客户,不变的是数据库。感觉自己做的是无休止的重复劳动,用某位大神的话说就是我们做的是重脑力劳动。曾经有人说过我们工作就是将程序与客户需求之间的矛盾找一个合适解决方案。就好像女士都喜欢穿高跟鞋来show出自己的美,脚能容忍鞋跟的高度就是8CM,但是女士们希望穿12CM的鞋来show出自己的身材,这怎么办?伟大的皮鞋设计师们想出的解决方案是加厚鞋前掌,这样鞋跟可以价高,鞋的坡度又能在女士们的忍受范围之内。我们的工作也是一样,一个企业(泛指所有行业)要做大,必须要有足够的资金和过硬的技术,当它达到中等规模后必然需要使用管理软件来提升企 阅读全文
posted @ 2011-07-27 16:05 lts8989 阅读(773) 评论(2) 推荐(2) 编辑
摘要: 该版本是对以前版本的升级,使用方法没有改变。具体使用方法参见:http://www.cnblogs.com/lts8989/archive/2010/01/28/1658763.html  这个版本的模板数增至6个,分别为BLL、Factory、IDAL、Model、SQLServerDAL、proc,严格按照petshop的分层结构生成代码。如果各位网友想修改模板,方法较以前略有不同。  修改模... 阅读全文
posted @ 2010-06-29 10:07 lts8989 阅读(1325) 评论(7) 推荐(0) 编辑
摘要: 春天是一个招聘的季节,园子里突然冒出很多面试的文章,我也来凑个热闹一、个人简介  本人09年6月毕业,但是从08年12月就在第一家公司全职工作,可以说有一年工作经验。由于上家公司是国企,而且是以采编为主的新闻性质的网站,本着先就业再择业的方针,我跳槽了。感觉在那种国企久了人会变老的。二、投简历  我没去过招聘会,一次都没去过。都是网上还投的,就是在招聘网站上搜出来与.net相关的职位,全选,申请选... 阅读全文
posted @ 2010-04-08 11:48 lts8989 阅读(3775) 评论(27) 推荐(2) 编辑

安装grpc相关服务

本文以mac系统为例安装,其他操作系统请参考官网安装。

brew install protobuf
brew install protoc-gen-go
brew install protoc-gen-go-grpc
protoc --version
libprotoc 3.17.3
protoc-gen-go --version
protoc-gen-go v1.27.1
protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.1.0

本文基于上面的软件版本进行编码,protoc的不同版本差别较大。

创建golang项目

目录结构如下。

项目目录结构

在product目录下创建ProductInfo.proto文件

syntax = "proto3";
option go_package = ".;product";

service ProductInfo {
  //添加商品
  rpc addProduct(Product) returns (ProductId);
  //获取商品
  rpc getProduct(ProductId) returns (Product);
}

message Product {
  string id = 1;
  string name = 2;
  string description = 3;
}

message ProductId {
  string value = 1;
}

文件定义了两个接口,添加商品、获取商品。定义了2个对象Product、ProductId。

生成golang语言接口定义

在product目录下执行下面命令,创建go语言的接口文件

protoc --go_out=. ProductInfo.proto
protoc --go-grpc_out=. ProductInfo.proto

执行完成后会生成ProductInfo.pb.go和ProductInfo_grpc.pb.go两个文件。这两个文件是生成的,不要修改文件内容。

创建服务端文件

在product/server文件夹下创建main.go文件

package main

import (
	"context"
	"github.com/gofrs/uuid"
	"gomicro-quickstart/product"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"log"
	"net"
)

type server struct {
	productMap map[string]*product.Product
	product.UnimplementedProductInfoServer
}

//添加商品
func (s *server) AddProduct(ctx context.Context, req *product.Product) (resp *product.ProductId, err error) {
	resp = &product.ProductId{}
	out, err := uuid.NewV4()
	if err != nil {
		return resp, status.Errorf(codes.Internal, "err while generate the uuid ", err)
	}

	req.Id = out.String()
	if s.productMap == nil {
		s.productMap = make(map[string]*product.Product)
	}

	s.productMap[req.Id] = req
	resp.Value = req.Id
	log.Println("AddProduct req.Id:" + req.Id)
	return
}

//获取商品
func (s *server) GetProduct(ctx context.Context, req *product.ProductId) (resp *product.Product, err error) {
	if s.productMap == nil {
		s.productMap = make(map[string]*product.Product)
	}

	resp = s.productMap[req.Value]
	log.Println("GetProduct ProductName:" + resp.GetName())

	return
}

const (
	address = "localhost:50051"
)

func main() {
	listener, err := net.Listen("tcp", address)
	if err != nil {
		log.Println("net listen err ", err)
		return
	}

	s := grpc.NewServer()
	product.RegisterProductInfoServer(s, &server{})
	log.Println("start gRPC listen on port " + address)
	if err := s.Serve(listener); err != nil {
		log.Println("failed to serve...", err)
		return
	}
}

服务端实现了grpc定义的添加商品、获取商品两个接口,并使用50051端口提供服务。

创建客户端文件

在product/client文件夹下创建main.go文件

package main

import (
   "context"
   "gomicro-quickstart/product"
   "google.golang.org/grpc"
   "log"
)

const (
   address = "localhost:50051"
)

func main() {
   conn, err := grpc.Dial(address, grpc.WithInsecure())
   if err != nil {
      log.Println("did not connect.", err)
      return
   }
   defer conn.Close()

   client := product.NewProductInfoClient(conn)
   ctx := context.Background()

   id := AddProduct(ctx, client)
   GetProduct(ctx, client, id)
}

// 添加一个测试的商品
func AddProduct(ctx context.Context, client product.ProductInfoClient) (id string) {
   aMac := &product.Product{Name: "Mac Book Pro 2019", Description: "From Apple Inc."}
   productId, err := client.AddProduct(ctx, aMac)
   if err != nil {
      log.Println("add product fail.", err)
      return
   }
   log.Println("add product success, id = ", productId.Value)
   return productId.Value
}

// 获取一个商品
func GetProduct(ctx context.Context, client product.ProductInfoClient, id string) {
   p, err := client.GetProduct(ctx, &product.ProductId{Value: id})
   if err != nil {
      log.Println("get product err.", err)
      return
   }
   log.Printf("get prodcut success : %+v\n", p)
}

客户端调用添加商品接口后调用获取商品接口。

运行程序

先运行服务端程序

在项目根目录执行

go run product/server/main.go

image-20210929154504708

再运行客户端程序

在项目根目录执行

go run product/client/main.go

image-20210929155100744此时服务端也会有相应的打印输出

image-20210929155151548

本文代码

https://github.com/lts8989/gomicro-quickstart

参考

https://segmentfault.com/a/1190000039717888

https://www.cnblogs.com/hongjijun/p/13724738.html

posted @ 2021-09-29 16:00 lts8989 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 会写sql语句就可以了,为什么要了解MySQL索引的原理? curd我都会,为什么要了解undolog和redolog? 我又不需要修改MySQL源码,为什么要了解MySQL的锁? 酸奶爸爸曾经也思考过上述问题,MySQL常用功能我都会,为什么面试官要问索引原理、undolog等技术细节呢?直到后来 阅读全文
posted @ 2021-09-03 18:13 lts8989 阅读(72) 评论(0) 推荐(0) 编辑
摘要: 本文标题党,酸奶爸爸是反对这种观点的,特此声明。 一开始拥护啥(因为什么)让你把代码写的这么复杂? 新产品需要快速上线 产品经理:竞对出了新产品,我们也要马上跟进,新立的项目,我不管你们技术怎么实现,总之老板就是要尽快上线。 程序猿:尽快是多快呢,这都快下班了。 产品经理:今晚加班,明早上线。 于是 阅读全文
posted @ 2021-02-13 22:49 lts8989 阅读(1478) 评论(2) 推荐(4) 编辑
摘要: 我出生在一个省会城市。初中是择校的。大家听说过“择校”这个词吗?就是上初中应该按照户口所在地就近入学。我的对口初中不是很好,父母就花钱为我择校。择校费是每年6千,三年初中一万八(请参考1999年的物价水平)。由于人数上正常升学和我们这种择校的人数基本相等,所以在师生中就有了一种声音:那些正常升学的学 阅读全文
posted @ 2020-07-29 18:34 lts8989 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 流程图画的好,下班回家早。流程图还是需求变更的利器。产品经理要改需求,只要看看流程图上改了哪些矩形,就知道这次变更需要改哪些页面;流程图上改了哪些线,就知道这次要改哪些按钮的代码逻辑。 阅读全文
posted @ 2019-10-21 17:27 lts8989 阅读(1988) 评论(6) 推荐(4) 编辑
摘要: 候选人:我一天工资500+,请假面试至少要半天,面试没有被录用,白白损失200+的工资,总不能一点收获都没有吧。 面试官:我一天工资1k+,面试至少要一小时,候选人不符合要求,这一个小时公司因为我少收入了200+,总不能一点收益都没有吧。 面试之前 as候选人,从接到面试邀请的时候,最好在电话里先了 阅读全文
posted @ 2019-08-24 16:20 lts8989 阅读(3115) 评论(7) 推荐(11) 编辑
摘要: 旧语言与新语言重叠的功能,这些是时间积淀的经典,需要夯实;新语言的新特性需要格外关注,无论是找工作还是装13都用得到。 阅读全文
posted @ 2019-07-24 17:23 lts8989 阅读(1538) 评论(0) 推荐(0) 编辑
摘要: 最近Python和GO语言很火,想学但是没有动力,怎么办? 阅读全文
posted @ 2019-07-18 20:21 lts8989 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 本文不区分语言,只为记录一次有收获的面试。 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch。面试官:什么是预料不到的情况呢?程序员:比如我要计算a除以b,但是b是变量,如果b等于0程序就会出错,所以我会将程序代码放在try中。面试官:还有其他情况 阅读全文
posted @ 2016-05-08 22:56 lts8989 阅读(3197) 评论(0) 推荐(0) 编辑
摘要: 最近在园子里看到好多关于过劳死的评论,我在这里推荐一些方法,介绍一些工具。程序员在公司无非就是重复劳动,用控件堆砌界面,对数据库增删改查。如果我们能把这些重复劳动尽可能多的让机器去工作,那么可以节省我们不少的劳动时间。1. 开发阶段,使用代码生成器。开发阶段的工作大多数就是对数据库的增删改查,我们可以用代码生成器生成大多数的简单逻辑的数据库操作。我相信80%的代码量都是简单逻辑的,软件中的复杂逻辑的代码量只占20%。所以使用代码生成器生成好代码,粘贴到我们的程序中简单测试即可开发出大多数的代码了。国内的代码生成器推荐动软代码生成器,国外的产品推荐mygeneration和CodeSmit... 阅读全文
posted @ 2013-05-21 22:52 lts8989 阅读(3126) 评论(20) 推荐(8) 编辑
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示