资深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
}
这个代码示例展示了:
- 清晰架构分层(用例层、基础设施层、传输层)
- gRPC服务实现
- Kafka事件集成
- Prometheus指标收集
- 适合Kubernetes部署的Docker构建
- 服务间调用的超时控制
技术栈完全匹配职位要求,代码结构体现了微服务架构的最佳实践。

