更多个人笔记:(仅供参考,非盈利)
gitee: https
文章目录
基本概念
特点:
- 单一职责:一个服务用来解决一个业务问题
- 面向服务:一个服务封装并对外提供服务,也可以调用别的服务
微服务治理
- 微服务如何发现别的微服务:服务注册中心
- 客户端或外部服务调用的处理:通过统一的网关进行验证授权
- 此外还有熔断限流保证高可用,负载均衡,分布式事务等等方法概念
grpc和简单demo
grpc是什么:跨平台高性能的rpc框架,多语言互通,可以比如GO创建一个服务端然后PHP/android服务端调用
proto文件: (programmer.proto)
Go
syntax = "proto3";
package proto; //通过 package 区分不同的命名空间
//proto.ProgramRequest和other.ProgramRequest是不同的命名空间下的相同消息名
option go_package = "./protooo"; //指定 Go 包路径(生成对应文件夹)
service Program{
rpc Getinfo(ProgramRequest) returns(ProgramResponse){} //定义服务端处理函数
}
message ProgramRequest{
string name = 1; //[修饰符]类型 字段名=标识号
}
message ProgramResponse{ //定义服务端响应数据格式
int32 uid = 1;
string username = 2;
string job = 3;
repeated string hobbies = 4; //repeated是修饰符,表示为可变数组
}
当前文件夹终端下执行protoc --go_out=. --go-grpc_out=. ./programmer.proto
前面的会根据option 的包路径放置,最后的是指定proto文件
会生成对应的两个pb.go 文件 (知道和protobuf有关就行,脚手架)
server部分代码 (go run server.go
)
GO
package main
import (
"context"
"fmt"
"log"
"net"
pb "practice/proto" //这里practice是我自己的go mod的名字
"google.golang.org/grpc"
)
type ProgramServer struct {
pb.UnimplementedProgramServer //向前兼容性保护,如果添加了新的方法
//这里是嵌入的结构体
}
func (s *ProgramServer) Getinfo(ctx context.Context, req *pb.ProgramRequest) (*pb.ProgramResponse, error) {
// 模拟业务逻辑
if req.Name == "张三" {
return &pb.ProgramResponse{
Uid: 1001,
Username: req.Name,
Job: "软件工程师",
Hobbies: []string{"编程", "读书", "运动"},
}, nil
}else{
return &pb.ProgramResponse{
Uid: -1,
Username: req.Name,
Job: "嘿嘿嘿,不知道",
Hobbies: []string{"没有东西"},
}, nil
}
}
func main() {
// 监听端口
lis, err := net.Listen("tcp", ":50051")
if err != nil {
log.Fatal("监听失败:", err)
}
// 创建 gRPC 服务器
s := grpc.NewServer()
// 注册服务
pb.RegisterProgramServer(s, &ProgramServer{})
fmt.Println("gRPC 服务器启动在 :50051")
if err := s.Serve(lis); err != nil {
log.Fatal("服务失败: ", err)
}
}
- 导入(pb)生成好的代码中的对应的结构体和返回变量名
- 写方法
- 监听窗口并创建RPC服务器,注册服务
客户端代码 (go run client.go)
GO
package main
import (
"context"
"log"
"time"
pb "practice/proto" //这里practice是我自己的go mod的名字
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
func main() {
// 连接服务器
conn, err := grpc.NewClient("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
log.Fatalf("连接失败: %v", err)
}
defer conn.Close()
// 创建客户端
client := pb.NewProgramClient(conn)
// 设置超时上下文,context 是必需的,用于调控grpc的生命周期
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 调用远程方法
resp, err := client.Getinfo(ctx, &pb.ProgramRequest{Name: "张三"})
if err != nil {
log.Fatal("调用失败", err)
}
log.Printf("响应: %+v", resp)
}
- 也是导入pb包
- 连接服务器并创建客户端
- 设置上下文传递
- 调用远程方法
这就是一个简答了解微服务的demo