require (
gitee.com/banyanhouse/distill-infra v0.0.8
github.com/kataras/iris v11.1.1+incompatible
)
package main
import (
_ "gitee.com/banyanhouse/distill-base"
conf "gitee.com/banyanhouse/distill-infra/config"
"log"
"os"
//_ "gitee.com/Hu-Lyndon/distill-resk"
infra "gitee.com/banyanhouse/distill-infra"
"gitee.com/banyanhouse/distill-infra/utils"
)
var (
Version string = "0.0.1"
//h bool
//v bool
configFilePath string
//modelFilePath string
//wwwDir string
//swaggerDir string
//port int
)
func main() {
// Получение пути к файлу конфигурации, необходимого для запуска программы
if configFilePath == "" {
configFilePath = utils.GetCurrentPath("./config/") + "/config.toml"
}
extensionMap := make(map[string]interface{})
extensionMap["gatewayConfig"] = configFilePath
// Чтение конфигурационного файла config.toml и сохранение его в объекте appConfig
appConfig := &conf.TomlConfig{}
//utils.ConfigFromFile(configFilePath, config)
configFiles := []string{configFilePath, utils.GetCurrentPath("../config/") + "/config.toml"}
utils.ConfigFromSlice(configFiles, appConfig)
// Запуск фреймворка
app := infra.New(appConfig)
app.Start()
// Ранее использовался неблокирующий стартер, но теперь, когда есть Iris, он не нужен
//c := make(chan int)
//<- c
}
func ErrHandler(err error) {
if err != nil {
log.Fatal(err.Error())
os.Exit(-1)
}
}
# Конфигурация приложения
[app]
httpPort = 18185
name = "hello_world"
enabled = true
time = "10s"
testing = false
# Конфигурация логов
[log]
enableLineLog = true
dir = "/logs"
testDir = "/logs/test"
fileName = "hello_world"
# Максимальное время хранения файлов
maxAge = "24h"
# Интервал между ротацией логов
rotationTime = "1h"
level = "debug"
# Конфигурация регистрационного центра
[ext.registry.etcd]
Urls = ["192.168.100.1:23791", "192.168.100.1:23792", "192.168.100.1:23793"]
# Конфигурация Iris
[ext.gateway]
addr = "192.168.100.1:9091"
loglevel = "debug"
[ext.gateway.irisconfig]
DisablePathCorrection = false
EnablePathEscape = false
FireMethodNotAllowed = false
DisableBodyConsumptionOnUnmarshal = false
TimeFormat = "Mon, 01 Jan 2006 15:04:05 GMT"
Charset = "UTF-8"
# Пользовательская конфигурация
[ext.gateway.other]
Port = 8088
IgnoreURLs = ["/", "/home", "/user/login", "/user/registe", "/login_pwd", "/micro/http"]
JWTTimeout = 3600 #second
LogLevel = "debug"
Secret = "xxx-Secret"
package distill_micro_http
import (
"fmt"
_ "gitee.com/banyanhouse/distill-base/apis/web"
infra "gitee.com/banyanhouse/distill-infra"
api "gitee.com/banyanhouse/distill-infra/api"
"gitee.com/banyanhouse/distill-infra/base"
hook "gitee.com/banyanhouse/distill-infra/hook"
log "gitee.com/banyanhouse/distill-infra/log"
register "gitee.com/banyanhouse/distill-infra/register"
validator "gitee.com/banyanhouse/distill-infra/validator"
web "gitee.com/banyanhouse/distill-infra/web"
)
// В boot.go файла фреймворка distill-infra описывается базовая структура всего фреймворка. Все основные компоненты запускаются в порядке, определённом в app.go.
// Сначала загружаются и запускаются все Starter с помощью Init(), затем все Starter запускаются с помощью Setup(), и наконец, все Starter запускаются с помощью Start().
// Последним Starter является HookStarter, который используется для мониторинга сигналов завершения работы терминала и остановки всех Starter с помощью Stop() для освобождения ресурсов.
func init() {
fmt.Println("start app...")
// Используется для чтения файла конфигурации toml
infra.Register(&base.TomlPropsStarter{})
// Здесь запускается Logger, который также имеет функции ротации логов
infra.Register(&log.LoggerStarter{}) // Если необходимо выводить логи в файл, можно включить здесь инициализацию файлового лога
// Здесь данные могут быть проверены перед обработкой
infra.Register(&validator.ValidatorStarter{})
// По умолчанию интегрирован с Iris
infra.Register(&web.IrisServerStarter{})
// После запуска веб-фреймворка можно зарегистрировать собственные Handler
infra.Register(&api.WebApiStarter{})
// Интегрирован с go-micro, фактически Iris и другие веб-фреймфорки отправляются на регистрацию и запуск в go-micro
infra.Register(®ister.Etcd3Starter{})
// Здесь создаётся goroutine для завершения программы и освобождения ресурсов
infra.Register(&hook.HookStarter{})
fmt.Println("load end ...")
}
package web
import (
"gitee.com/banyanhouse/distill-infra/api"
"gitee.com/banyanhouse/distill-infra/web"
"github.com/kataras/iris/context"
)
``` **Здесь удобно использовать глобальный реестр приложений app.go, чтобы привязать обработчик к фреймворку веб-регистратора.**
func init() { api.SetupApi(new(ProdsHandler)) }
**Создаём структуру для привязки обработчика:**
type ProdsHandler struct { }
**Здесь можно посмотреть мои комментарии в app.go:**
// Здесь можно просмотреть мои комментарии в app.go func (c *ProdsHandler) Init() { }
**Вот как мы вручную создаём обработчик:**
func (c *ProdsHandler) Setup() { groupRouter := web.IrisMainParty().Party("/micro/http") groupRouter.Get("/hello", func(context context.Context) { r := web.Res{ Code: web.ResCodeOk, Message: "hello world api", } context.JSON(&r) }) }
## В этой среде Docker Desktop на локальном компьютере запускаем кластер etcd
Для повышения производительности машины и удобства разработки мы отказались от использования VMware и используем Docker для создания соответствующей среды разработки.
```yaml
version: '2'
services:
etcd0:
image: quay.io/coreos/etcd:v3.4.7
ports:
- 23791:2379
volumes:
- etcd0:/etcd_data
command:
- /usr/local/bin/etcd
- -name
- etcd0
- --data-dir
- /etcd_data
- -advertise-client-urls
- http://etcd0:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd0:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
etcd1:
image: quay.io/coreos/etcd:v3.4.7
ports:
- 23792:2379
volumes:
- etcd1:/etcd_data
command:
- /usr/local/bin/etcd
- -name
- etcd1
- --data-dir
- /etcd_data
- -advertise-client-urls
- http://etcd1:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd1:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
etcd2:
image: quay.io/coreos/etcd:v3.4.7
ports:
- 23793:2379
volumes:
- etcd2:/etcd_data
command:
- /usr/local/bin/etcd
- -name
- etcd2
- --data-dir
- /etcd_data
- -advertise-client-urls
- http://etcd2:2379
- -listen-client-urls
- http://0.0.0.0:2379
- -initial-advertise-peer-urls
- http://etcd2:2380
- -listen-peer-urls
- http://0.0.0.0:2380
- -initial-cluster
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
volumes:
etcd0:
etcd1:
etcd2:
Теперь вы можете запустить основной метод для доступа к недавно написанному API.
Сначала создадим файл Dockerfile, который будет использоваться для компиляции нашего кода и создания образа и контейнера.
# Compile stage
# Эта стадия предназначена для использования контейнера go для компиляции нашего кода
FROM golang:1.13.8 AS build-env
# Вышеупомянутое изображение используется в качестве основы для добавления нашего кода в каталог
ADD . /distill-base
# Переход в рабочий каталог
WORKDIR /distill-base
# Установка параметров
ENV GOOS linux
ENV GOARCH amd64
ENV CGO_ENABLED=0
ENV GOFLAGS "-ldflags=-w -ldflags=-s"
ENV GO111MODULE=on
# Чтобы избежать повторной загрузки зависимостей во время компиляции, мы активировали vendor
ENV GOPROXY=https://yz271544:UbFWoA20KLRShpM@goproxy.io,direct
# Здесь происходит фактическая компиляция
RUN go build -o /brun brun/main.go
# Final stage
# Ниже приводится фактический процесс создания нового образа из скомпилированной программы. Мы выбрали debian для минимизации размера образа, но вы можете выбрать другой дистрибутив в зависимости от ваших предпочтений.
FROM debian:buster
#FROM centos:centos8
# Открытие порта
EXPOSE 18185
# Настройка рабочего каталога
WORKDIR /
# Для удобства отладки мы устанавливаем следующие команды, которые позволяют нам использовать основные команды Linux после подключения к контейнеру
#RUN dnf -y install coreutils --allowerasing
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
&& localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
RUN apt-get install -y coreutils
# Копирование конфигурации из компиляционного контейнера
COPY --from=build-env /distill-base/config /config
# Копирование скомпилированного приложения из контейнера компиляции
COPY --from=build-env /brun /
# Назначение разрешений
RUN chmod +x /brun
# Определение команды запуска
CMD ["/brun"]
Если вы также используете Goland, вы можете настроить конфигурацию запуска Docker следующим образом:
Нажмите Edit Configurations...
Нажмите + -> Docker -> Dockerfile
Введите параметры конфигурации, как показано на рисунке ниже.
Запустите конфигурацию. В лог-вкладке мы можем увидеть выходные данные программы. Что интересного можно обнаружить, если посмотреть в другие вкладки?
Потому что мы установили пакет coreutils, то во вкладке Files мы можем просматривать структуру каталогов в контейнере.
http://localhost:18185/micro/http/hello
{
code: "0",
message: "hello world api",
data: null
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )