события летят не постбеком из кейтаро, мы ищем апихой конкретные события (напр., события из конкретной страны, или от конкретного приложения), но по своей сути - да, прокся
Читать полностью…я, с вашего позволения, тогда чуть в задачу погружу, потому что делаю, по сути для себя, но хочется сделать мастерски (читай, продакшн-реди))
у меня три сервиса:
1. Keitaro достаёт данные из одноимённого сервиса
2. Meta шлёт события в Conversion API
3. Affise - в сторону Affise
хочется дать два отдельных роута для отправки событий в разные места:
UPD: т.е. запрос в Keitaro всегда одинаковый
- в случае мидлваря, я смогу в нём по содержанию тела запроса понимать, куда мы отправляем запрос и оставить внешний один путь;
- в случае простого способа - я просто дам два отдельных пути под разные запросы;
как-то так я себе это сейчас представляю. это корректно?
ну я в целом правильно понимаю, что этот подход имеет смысл использовать именно для мидлварь, а предыдущий уместнее для задачи роутинга в нужные контроллеры?
Читать полностью…Это классический подход с миделваре, аля шаблон проектирования, ты можешь накрутить несколько таких миделварь, для каждой задачи, к примеру
* для проброса контейнера
* для авторизации
* для логирования запроса
* для перехвата паник
итп
Ну и можно это немного аккуратнее сделать, сейчас покажу какк
либо еще вариант вот так:
package mainЧитать полностью…
import (
"fmt"
"net/http"
)
type someService struct {
}
type handler struct {
s *someService
}
func (h *handler) handler(w http.ResponseWriter, r *http.Request) {
fmt.Println(w, h.s, r)
}
func main() {
mux := http.NewServeMux()
h := &handler{
s: &someService{},
}
mux.HandleFunc("/someHandler", h.handler)
}
не обязательно. Один из вариантов, можно сделать так:
package mainЧитать полностью…
import (
"fmt"
"net/http"
)
type someServiceContainer struct {
}
func main() {
mux := http.NewServeMux()
c := &someServiceContainer{}
mux.HandleFunc("/someHandler", func(w http.ResponseWriter, r *http.Request) {
handler(w, c, r)
})
}
func handler(w http.ResponseWriter, c *someServiceContainer, r *http.Request) {
fmt.Println(w, c, r)
}
#go #golang #middle #україна
We are looking for Middle+/Senior Golang Developer for outstaff project.
Requirements:
• Expertise in Go 3,5+ years
• Experience with cloud-based deployment
• Experience with blockchain
Part-time, long-term.
Interview process:
1. test-task
2. technical call
Details: @paul_fost
я сделал на 1 скриншоте имена с заглавной чтобы их можно использовать вне файла и в main их использую
Читать полностью…то есть в свой проект ты импортируешь модули через go.mod а в пакетах своего проекта импортируешь другие пакеты через import
Читать полностью…А вот пакет это уже по сути просто папка которая объединяет гошные фалы и является как бы черным ящиком для внешних пакетов
Читать полностью…угу, как то так, ну и назвать лучше как то по другому =) но так оно же хотя бы работает. То есть при импорте у тебя в начале идет название модуля (либо твоего что бы внутренние пакеты использовать, либо внешнего который у тебя будет прописан в go.mod) а дальше названия пакетов которые должны соответствовать названиям папок в которых они лежат
Читать полностью…Поцоны. Есть вопросик: есть у кого опыт перехода между разными яп и платформами? Аля мидл .net -> мидл go. как там по сохранению зп и прочего?
Читать полностью…мне кажется тут зависит от задачи, если тебе нужно просто несколько обработчиков простых создать, то первый выглядит более простым и уместным, если тебе надо будет навесить кучу логики, как я выше писал, с авторизацией, перехватом паники, логированием, и кучей всего другого, то вариант с мидлварей будет более уместен, так же так же можешь в миделварю вынести еще и парсинг и валидацию запросов, формирование ответа, проверку ошибок и кучу всего еще что тебе нужно, что бы не копипастить это из одного обработчика в другой
Читать полностью…Вот к примеру
package mainЧитать полностью…
import (
"fmt"
"net/http"
)
type someServiceContainer struct {
}
func main() {
mux := http.NewServeMux()
c := &someServiceContainer{}
mux.HandleFunc("/someHandler", middleware(handler, c))
}
func middleware(f func(http.ResponseWriter, *someServiceContainer, *http.Request), c *someServiceContainer) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
f(w, c, r)
}
}
func handler(w http.ResponseWriter, c *someServiceContainer, r *http.Request) {
fmt.Println(w, c, r)
}
ну вот, так пока и работает, но это мне выглядит как какое-то кривое решение. у меня нет аргументов))
пришёл узнать за, условно, правильный подход.
могу сделать вывод, что так в среднем и решается эта задача?
Ребятки, нужна помощь. Всегда пользовался Gin, сейчас пытаюсь сделать простой вебсервер встроенными средствами и впал в ступор.
Я в main создаю структуры сервисов
Создаю сервер в духе:
mux := http.NewServeMux()
mux.HandleFunc("/capi", CapiConverstion)
log.Fatal(http.ListenAndServe(":8080", mux))
#вакансия #vacancy #fulltime #middle #senior
Привет, это команда Тинькофф. Мы ищем Golang-разработчика уровня Middle и Senior 💡
Формат работы: в офисе или удаленно — по договоренности/РФ
ЗП: оклад от 150.000 до 400. 000 ₽ (выше тоже возможен, зависит от результата пройденных секций)
Вы будете:
· Заниматься разработкой инфраструктурного сервиса для сбора распределенных трейсов
· Разрабатывать подходы к обеспечению надежности системы сбора трейсов, определение SLO/SLI
· Участвовать во внедрении распределенного трейсинга, в том числе в создании каталога согласованных библиотек инструментализации под техрадар Tinkoff
Мы ждем:
· Опыт промышленной разработки на Go не меньше 3 лет (будет плюсом опыт на Java/Kotlin/C++
· Понимание принципов архитектуры многокомпонентных систем и умение применять эти знания на практике (балансировка нагрузки, обеспечение отказоустойчивости)
· Знание экосистемы CloudNative: K8s, Prometheus, Jaeger
· Опыт работы с Cassandra, Elasticsearch, ClickHouse, Kafka, в том числе умение посайзить инфраструктуру
Мы предлагаем:
· Работу в офисе или удаленно — по договоренности
· Платформу обучения и развития «Тинькофф Апгрейд». Курсы, тренинги, вебинары и базы знаний. Поддержка менторов и наставников, помощь в поиске точек роста и карьерном развитии
· Заботу о здоровье. Оформим полис ДМС со стоматологией и страховку от несчастных случаев. Предложим льготное страхование вашим близким
· Линейку льготных тарифов на продукты Тинькофф
· Частичную компенсацию затрат на спорт
· Сервисы для поддержки сотрудника по психологическим, юридическим и финансовым вопросам
· Три дополнительных дня отпуска в год
· Достойную зарплату — обсудим ее на собеседовании
Присылайте резюме и вопросы мне в Телеграм @takamaka2023 или на почту e.s.krasnova@tinkoff.ru
Я бы посмотрел в сторону https://pkg.go.dev/embed, и router.StaticFS
https://gin-gonic.com/docs/examples/serving-static-files/
Импортируемая единица, в данном контексте имеется в виду то что ты импортируешь в go.mod а в проекте ты уже импортируешь пакеты
Читать полностью…модуль это типа импортируемая единица, которая может содержать в себе 1 или несколько пакетов. То есть всегда в модуле есть пакет который имеет тоже название что и модуль (или пакет main если модуль является самостоятельным проектом со своей точкой входа), но так же может в себе содержать под пакеты. Твой проект это всегда один модуль, который содержит основном пакет и подпакеты
Читать полностью…Кстати вот тебе в помощь, https://github.com/golang-standards/project-layout/blob/master/README_ru.md должно быть полезно
Читать полностью…нет, если ты создаешь модуль students а в нем пакет students то импорт у тебя должен быть "students/students"
Читать полностью…нужен хелп, как с сервака на gin правильно сделать SPA приложение вместе с реактом?
раздать статику и все запросы на index.html