快速了解Go+微服务(概念和一个例子)

更多个人笔记:(仅供参考,非盈利)

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

相关推荐
码途漫谈1 小时前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
小码哥_常1 小时前
解锁AI编程密码:程序员常用的10个AI提示词
后端
酿情师2 小时前
yihan:一款面向连续网页学习的智能侧边栏插件
学习·学习方法·工具·学习工具
九转成圣2 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
SmartRadio2 小时前
ESP32-S3 双模式切换实现:兼顾手机_路由器连接与WiFi长距离通信
开发语言·网络·智能手机·esp32·长距离wifi
laowangpython2 小时前
Rust 入门:GitHub 热门内存安全编程语言
开发语言·其他·rust·github
我叫汪枫2 小时前
在后台管理系统中,如何递归和选择保留的思路来过滤菜单
开发语言·javascript·node.js·ecmascript
_.Switch2 小时前
东方财富股票数据JS逆向:secids字段和AES加密实战
开发语言·前端·javascript·网络·爬虫·python·ecmascript
软件技术NINI2 小时前
webkit简介及工作流程
开发语言·前端·javascript·udp·ecmascript·webkit·yarn
Brendan_0012 小时前
JavaScript的Stomp.over
开发语言·javascript·ecmascript