Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
e8846f9
<feat>(kafka): 包装了sarama包的生产消费者
luohuixi Jun 28, 2025
a54c179
<fix>: 修改了一下生产者接口,同步和异步分成两个
luohuixi Jun 30, 2025
c2e5642
feat: 新增tracer部分
luohuixi Jul 26, 2025
8c4726e
fix:tracer
luohuixi Jul 29, 2025
6d6dfdb
feat: 新增tracer的test文件
luohuixi Aug 1, 2025
ce7052d
feat: 新增tradcer的test文件
luohuixi Aug 4, 2025
469d290
<feat>: 新增sql部分和curd模板,curd的一点点点点点功能
luohuixi Aug 17, 2025
3f67138
<feat>: 新增自动curd部分
luohuixi Aug 22, 2025
4f8530f
<feat>: 新增无缓冲模板,新增不可覆盖选项; <fix>: _gen.go增加了不推荐修改的提示
luohuixi Aug 25, 2025
011844a
<feat>: 新增curd的test文件
luohuixi Aug 27, 2025
8e28ee9
<feat>: 新增curd的使用example
luohuixi Aug 27, 2025
1a9cde5
<fix>: 一些小修改
luohuixi Sep 1, 2025
d8ed001
<fix>: 处理一下冲突
luohuixi Sep 1, 2025
3e6ab16
<fix>: (template)由于logger包改了,故修改了模板中logger包的使用方法
luohuixi Sep 1, 2025
472c067
<fix>: 改了一下curd_test文件
luohuixi Sep 1, 2025
d6bf6e8
<fix>: 修改了curd的example适配新logger包
luohuixi Sep 1, 2025
9566583
<fix>: (timeout.go) 回退了timeout包的版本
luohuixi Sep 1, 2025
06016d0
<feat>: 新增new命令生成项目示例模板
luohuixi Sep 13, 2025
2d00e3c
<feat>: 新增生成test部分;<fix>: 修改了new的_test部分
luohuixi Sep 22, 2025
8d7e27c
<feat>: 新增生成test部分;<fix>: 修改了new的_test部分
luohuixi Sep 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions example/curd/curd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package main

import (
"context"
"fmt"
"github.com/muxi-Infra/muxi-micro/pkg/logger"
"github.com/muxi-Infra/muxi-micro/pkg/logger/zapx"
"github.com/muxi-Infra/muxi-micro/tool/curd/example"
"log"
"time"
)

func main() {
DBdsn := "your db dsn"
redisAddr := "your redis addr"
redisPassword := "your redis password"
redisDB := 0
// 缓存持续时间
ttlForCache := 5 * time.Second
// 异步设置缓存时间
ttlForSet := 5 * time.Second
// 日志记录 redis 错误
l := zapx.NewDefaultZapLogger(logger.EnvTest, true, "./logs")
instance, err := example.NewUserModels(
DBdsn,
redisAddr,
redisPassword,
redisDB,
ttlForCache,
ttlForSet,
l,
)
if err != nil {
log.Fatal(err)
}
//user := example.User{
// Id: 7,
// Username: "example3",
// Password: "123456",
// Mobile: "example111",
//}
//_ = instance.Create(context.Background(), &user)
//_ = instance.Update(context.Background(), &user)
//_ = instance.Delete(context.Background(), 7)
//value, err := instance.FindOne(context.Background(), 3)
value, err := instance.FindByMobile(context.Background(), "123456")
if err != nil {
log.Fatal(err)
}
fmt.Println(value)
}
116 changes: 116 additions & 0 deletions example/kafka/kafka.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package main

import (
"context"
"log"
"time"

"github.com/IBM/sarama"
"github.com/muxi-Infra/muxi-micro/pkg/kafka"
)

// 同步生产者示例
func SyncProducer() {
p := kafka.NewSyncConfig([]string{"localhost:9092"})
//可自行改配置如:(可选)
//p.GetConfig().Producer.RequiredAcks = sarama.WaitForAll

err := p.CreateProducer()
if err != nil {
log.Fatal(err)
}

partition, offset, err := p.SendMessage("study2", "testkey8", "testvalue8")
if err != nil {
log.Fatal(err)
}
log.Printf("partition: %d, offset: %d\n", partition, offset)

err = p.Close()
if err != nil {
log.Fatal(err)
}
}

// 异步生产者示例
func AsyncProducer() {
p := kafka.NewAsyncConfig([]string{"localhost:9092"})
//可自行改配置如:(可选)
p.GetConfig().Producer.Return.Successes = true

err := p.CreateProducer()
if err != nil {
log.Fatal(err)
}

//异步获取成功消息
ch := p.GetSuccess()
//或 ch:= p.GetError()
go func() {
for msg := range ch {
log.Printf("partition: %d, offset: %d, key: %s, value: %s\n", msg.Partition, msg.Offset, msg.Key, msg.Value)
}
}()

p.SendMessage("study2", "testkey5", "testvalue5")
if err != nil {
log.Fatal(err)
}

time.Sleep(time.Second * 5)

err = p.Close()
if err != nil {
log.Fatal(err)
}

}

// 消费者示例
func Consumer() {
// 先构造 handler 实现 ConsumerGroupHandler 接口
// setup, cleanup, consumeclaim 都要用户自行实现
fn := func(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for msg := range claim.Messages() {
log.Println("partition: ", msg.Partition, "offset: ", msg.Offset, "key: ", string(msg.Key), "value: ", string(msg.Value))
session.MarkMessage(msg, "")
}
return nil // 正常退出
}
handler := kafka.NewHandler(nil, nil, fn)

// 构造消费者组
c := kafka.NewConsumerConfig([]string{"localhost:9092"}, "test-group", []string{"study2"}, handler)
//可自行改配置如:(可选)
//c.GetConfig().Consumer.Offsets.Initial = sarama.OffsetOldest

err := c.CreateConsumerGroup()
if err != nil {
log.Fatal(err)
}

// 消费消息
ctx, cancel := context.WithCancel(context.Background())

// 取消消费
go func() {
time.Sleep(time.Second * 10)
cancel()
}()

err = c.Consume(ctx)
if err != nil {
log.Fatal(err)
}

err = c.Close()
if err != nil {
log.Fatal(err)
}
}

func main() {
SyncProducer()
//AsyncProducer()
Consumer()
}
146 changes: 146 additions & 0 deletions example/tracer/tracer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package main

import (
"context"
"github.com/gin-gonic/gin"
"github.com/muxi-Infra/muxi-micro/pkg/tracer"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/examples/helloworld/helloworld"
"log"
"net"
)

// 简易的 HelloWorld 实现
type server struct {
helloworld.UnimplementedGreeterServer
}

func (s *server) SayHello(_ context.Context, in *helloworld.HelloRequest) (*helloworld.HelloReply, error) {
log.Printf("Received: %v", in.GetName())
return &helloworld.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func GrpcServer() {
// Zipkin
config, err := tracer.NewZipkin(
"http://localhost:9411/api/v2/spans",
"demo_service",
"localhost:50051",
1,
)

// Jaeger
//config , err := tracer.NewJaeger(
// "http://localhost:14268/api/traces",
// "demo_service",
// 1,
// )

// SkyWalking
//config , err := tracer.NewSkyWalking(
// "localhost:11800",
// "demo_service",
// "demo_instance", //实例名
// 1
// )

if err != nil {
log.Fatal(err)
}
defer func() {
if err := config.Close(); err != nil {
log.Println(err)
}
}()

s := grpc.NewServer(
grpc.ChainUnaryInterceptor(
config.ServerInterceptor(),
),
)

helloworld.RegisterGreeterServer(s, &server{})

lis, err := net.Listen("tcp", "0.0.0.0:50051")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}

if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}

func GrpcClient() {
// 同上
config, err := tracer.NewZipkin(
"http://localhost:9411/api/v2/spans",
"demo_client",
"localhost:50051",
1,
)
if err != nil {
log.Fatal(err)
}
defer func() {
if err := config.Close(); err != nil {
log.Println(err)
}
}()

conn, err := grpc.NewClient(
"localhost:50051",
grpc.WithTransportCredentials(insecure.NewCredentials()),
grpc.WithChainUnaryInterceptor(
config.ClientInterceptor(),
),
)
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()

c := helloworld.NewGreeterClient(conn)

resp, err := c.SayHello(context.Background(), &helloworld.HelloRequest{Name: "MuXi"})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", resp.Message)
}

func GinService() {
// 同上
config, err := tracer.NewZipkin(
"http://localhost:9411/api/v2/spans",
"demo_gin",
"localhost:8081",
1,
)
if err != nil {
log.Fatal(err)
}
defer func() {
if err := config.Close(); err != nil {
log.Println(err)
}
}()

r := gin.Default()
r.Use(config.GinMiddleware(r))

r.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "hello world"})
})
r.Run("0.0.0.0:8081")
}

func main() {
// grpc服务端
//GrpcServer()
// grpc客户端
GrpcClient()
// gin
//GinService()
}
Loading