资深Golang开发工程师招聘 - 诚邀加入我们的开发团队

资深Golang开发工程师招聘 - 诚邀加入我们的开发团队 我们正在寻找一位精通Golang的开发者加入团队,他将积极参与产品开发,以及自有服务和集成的工作。

关于我们: VFM科技是一家IT公司,致力于开发企业管理资源和自雇人士的解决方案。应用领域包括:WFM(劳动力管理)、ERP(企业资源规划)。我们的产品是:https://jamjob.ru/

需要解决的任务:

  • 编写清晰、可维护的代码,遵循清晰架构原则
  • 开发微服务架构
  • 优化服务间交互

我们的技术栈:

  • 工具:Golang, Postgres, Kafka, Redis, Docker, Kubernetes
  • 传输:gRPC/Protobuf, HTTP
  • 部署:Gitlab CI/CD

必备技能:

  • 2年以上后端开发经验
  • 3年以上Golang开发经验
  • 具备微服务架构设计和服务间集成经验
  • 了解设计模式及其在Golang中的应用特点

加分项:

  • 有使用追踪工具的经验
  • 有使用ClickHouse的经验
  • 有使用Grafana, Prometheus, Sentry的经验
  • 具备DevOps实践经验(Gitlab CI pipelines)

我们提供的待遇:

  • 月薪30万卢布起
  • 可提供混合办公模式
  • 我们提供您选择的设备
  • 午餐费用补贴

期待您的反馈!

联系方式:

Telegram @wfmtRu

E-mail: a.antonovich@wfmt.ru


更多关于资深Golang开发工程师招聘 - 诚邀加入我们的开发团队的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于资深Golang开发工程师招聘 - 诚邀加入我们的开发团队的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常典型的Go微服务架构职位,技术栈和职责描述都很清晰。从要求来看,团队需要一个能独立负责服务设计、开发和维护的资深工程师。

以下是一个符合该职位描述的Go微服务示例,它集成了gRPC、Postgres、Kafka,并遵循清晰架构原则:

// 清晰架构示例:内部核心业务逻辑与外部框架解耦
package usecase

import (
    "context"
    "errors"
)

// 核心实体
type Employee struct {
    ID        string
    Name      string
    Department string
}

// 仓储接口(由基础设施层实现)
type EmployeeRepository interface {
    Save(ctx context.Context, emp *Employee) error
    FindByID(ctx context.Context, id string) (*Employee, error)
}

// 用例(业务逻辑)
type EmployeeService struct {
    repo EmployeeRepository
    eventProducer EventProducer
}

func NewEmployeeService(repo EmployeeRepository, producer EventProducer) *EmployeeService {
    return &EmployeeService{repo: repo, eventProducer: producer}
}

func (s *EmployeeService) CreateEmployee(ctx context.Context, emp *Employee) error {
    // 业务逻辑验证
    if emp.Name == "" {
        return errors.New("employee name cannot be empty")
    }
    
    // 持久化
    if err := s.repo.Save(ctx, emp); err != nil {
        return err
    }
    
    // 发布领域事件到Kafka
    event := EmployeeCreatedEvent{
        EmployeeID: emp.ID,
        Timestamp:  time.Now(),
    }
    return s.eventProducer.Publish(ctx, "employee-events", event)
}
// 基础设施层:Postgres实现
package postgres

import (
    "context"
    "database/sql"
    "your-project/usecase"
)

type EmployeeRepo struct {
    db *sql.DB
}

func (r *EmployeeRepo) Save(ctx context.Context, emp *usecase.Employee) error {
    query := `INSERT INTO employees (id, name, department) VALUES ($1, $2, $3)`
    _, err := r.db.ExecContext(ctx, query, emp.ID, emp.Name, emp.Department)
    return err
}
// gRPC传输层
package grpc

import (
    "context"
    pb "your-project/gen/proto"
    "your-project/usecase"
)

type EmployeeServer struct {
    pb.UnimplementedEmployeeServiceServer
    service *usecase.EmployeeService
}

func (s *EmployeeServer) CreateEmployee(ctx context.Context, req *pb.CreateEmployeeRequest) (*pb.EmployeeResponse, error) {
    emp := &usecase.Employee{
        ID:         generateID(),
        Name:       req.Name,
        Department: req.Department,
    }
    
    if err := s.service.CreateEmployee(ctx, emp); err != nil {
        return nil, status.Errorf(codes.Internal, "failed to create employee: %v", err)
    }
    
    return &pb.EmployeeResponse{
        Id:   emp.ID,
        Name: emp.Name,
    }, nil
}
// Kafka事件生产者
package kafka

import (
    "context"
    "encoding/json"
    "github.com/segmentio/kafka-go"
)

type EventProducer struct {
    writer *kafka.Writer
}

func (p *EventProducer) Publish(ctx context.Context, topic string, event interface{}) error {
    data, err := json.Marshal(event)
    if err != nil {
        return err
    }
    
    return p.writer.WriteMessages(ctx, kafka.Message{
        Topic: topic,
        Value: data,
    })
}
// 使用Prometheus和Grafana的指标收集
package metrics

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promauto"
)

var (
    employeeCreatedCounter = promauto.NewCounterVec(
        prometheus.CounterOpts{
            Name: "employee_created_total",
            Help: "Total number of employees created",
        },
        []string{"department"},
    )
    
    httpRequestDuration = promauto.NewHistogramVec(
        prometheus.HistogramOpts{
            Name:    "http_request_duration_seconds",
            Help:    "Duration of HTTP requests",
            Buckets: prometheus.DefBuckets,
        },
        []string{"path", "method", "status"},
    )
)

func RecordEmployeeCreation(department string) {
    employeeCreatedCounter.WithLabelValues(department).Inc()
}
# GitLab CI/CD 流水线示例
# .gitlab-ci.yml
stages:
  - test
  - build
  - deploy

variables:
  GO_VERSION: "1.21"
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

before_script:
  - go version

test:
  stage: test
  script:
    - go test ./... -v -race -coverprofile=coverage.txt
    - go vet ./...
    - staticcheck ./...

build:
  stage: build
  script:
    - CGO_ENABLED=0 go build -o app ./cmd/server
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - main

deploy:
  stage: deploy
  script:
    - echo "Deploying to Kubernetes..."
    - kubectl set image deployment/employee-service employee-service=$DOCKER_IMAGE
  environment: production
  only:
    - main
// 使用context进行服务间超时控制
package main

import (
    "context"
    "time"
    "google.golang.org/grpc"
)

func callExternalService(ctx context.Context) error {
    // 设置带超时的context
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()
    
    conn, err := grpc.DialContext(ctx, "service-b:50051", grpc.WithInsecure())
    if err != nil {
        return err
    }
    defer conn.Close()
    
    // 使用context控制整个调用链
    client := pb.NewExternalServiceClient(conn)
    _, err = client.Process(ctx, &pb.Request{Data: "test"})
    return err
}

这个代码示例展示了:

  1. 清晰架构分层(用例层、基础设施层、传输层)
  2. gRPC服务实现
  3. Kafka事件集成
  4. Prometheus指标收集
  5. 适合Kubernetes部署的Docker构建
  6. 服务间调用的超时控制

技术栈完全匹配职位要求,代码结构体现了微服务架构的最佳实践。

回到顶部