单体架构和微服务架构
单体架构
微服务架构:
protobuf
protocol buffers
准备工作:
1.下载protocol buffers
2.将下载后的bin目录放到环境变量中
3.go install github.com/golang/protobuf/protoc-gen-go@latest
安装protoc-gen-go
编写.proto文件:
//指定的当前proto语法的版本,有2和3
syntax="proto3";
//option go_package="path:name"; path 表示生成的go文件的存放地址,会自动生成目录的name表示生成的go文件所属包名
option go_package="../service";
//指定等会文件生成出来的package
package service;
//消息传输的对象
message User{
string username=1;
int32 age=22;
}
编译生产go文件:
protoc --go_out=../service .\test.proto
//protoc --go_out=./service --go-grpc_out=./service .\test.proto
序列化和反序列化操作:
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
"test/service"
)
func main() {
user := &service.User{
Username: "zyj",
Age: 22,
}
//序列化的过程
marshal, err := proto.Marshal(user)
if err != nil {
panic(err)
}
//反序列化
newUser := &service.User{}
err = proto.Unmarshal(marshal, newUser)
if err != nil {
panic(err)
}
fmt.Println(newUser.String())
}
proto文件介绍
gRPC实例
实例:
product.proto
//指定的当前proto语法的版本,有2和3
syntax="proto3";
//option go_package="path:name"; path 表示生成的go文件的存放地址,会自动生成目录的name表示生成的go文件所属包名
option go_package="../service";
//指定等会文件生成出来的package
package service;
//消息传输的对象
message ProductRequest{
int32 prod_id=1;
}
message ProductResponse{
int32 prod_stock=1;
}
service ProdService{
rpc GetProductStock(ProductRequest) returns(ProductResponse);
}
protoc --go_out=plugins=grpc:./ .\product.proto
product.go
package service
import (
"context"
"test/service"
)
var ProductService = &productService{}
type productService struct {
}
func (p *productService) GetProductStock(ctx context.Context, request *ProductRequest) (*ProductResponse, error) {
//实现具体的业务逻辑
stock := p.GetStockById(request.ProdId)
return &main.ProductResponse{ProdStock: stock}, nil
}
func (p *productService) GetStockById(id int32) int32 {
return 100
}
service.go
package main
import (
"fmt"
"google.golang.org/grpc"
"net"
service2 "test/service/service"
)
func main() {
rpcSever := grpc.NewServer()
service2.RegisterProdServiceServer(rpcSever, service2.ProductService)
listener, err := net.Listen("tcp", ":8002")
if err != nil {
panic(err)
}
err = rpcSever.Serve(listener)
if err != nil {
panic(err)
}
fmt.Println("启动gRPC成功")
}
client.go
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"test/client/service"
)
func main() {
dial, err := grpc.Dial(":8002", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
panic(err)
}
defer dial.Close()
client := service.NewProdServiceClient(dial)
request := &service.ProductRequest{
ProdId: 123,
}
stockResponse, err := client.GetProductStock(context.Background(), request)
if err != nil {
panic(err)
}
fmt.Println("查询成功!")
fmt.Println(stockResponse)
}
生成自签证书:
1.安装openssl:下载地址
2.生成私钥文件
openssl genrsa -des3 -out server.key 2048
3.创建证书请求
openssl req -new -key server.key -out server.csr
4.生成server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
5.修改openssl.cnf文件
6.生成证书私钥server.key
openssl genpkey -algorithm RSA -out server.key
7.通过私钥server.key生成证书请求文件server.csr
openssl req -new -nodes -key server.key -out server.csr -days 3650 -config ./openssl.cnf -extensions v3_req
8.生成SAN证书
openssl x509 -req -days 365 -in server.csr -out zyj.pem -CA server.crt -CAkey
server.key -CAcreateserial -extfile ./openssl.cnf -extensions v3_req