1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/banyanhouse-distill-base

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Создание первого REST-сервиса, взаимодействующего с регистрационным центром

В файле go.mod импортируется фреймворк distill-infra версии v0.0.8

require (
    gitee.com/banyanhouse/distill-infra v0.0.8
    github.com/kataras/iris v11.1.1+incompatible
)

Создаётся каталог brun и файл main.go в проекте

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)
    }
}

Создаётся каталог config и файл config.toml в проекте

# Конфигурация приложения
[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"

Создаётся файл app.go для глобального управления и регистрации

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(&register.Etcd3Starter{})
    // Здесь создаётся goroutine для завершения программы и освобождения ресурсов
    infra.Register(&hook.HookStarter{})
    fmt.Println("load end ...")
}

Создаётся каталог apis/web и файл hello_handler.go

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 следующим образом:

  1. Нажмите Edit Configurations...

  2. Нажмите + -> Docker -> Dockerfile

  3. Введите параметры конфигурации, как показано на рисунке ниже.

  4. Запустите конфигурацию. В лог-вкладке мы можем увидеть выходные данные программы. Что интересного можно обнаружить, если посмотреть в другие вкладки?

Потому что мы установили пакет coreutils, то во вкладке Files мы можем просматривать структуру каталогов в контейнере.

http://localhost:18185/micro/http/hello

{
    code: "0",
    message: "hello world api",
    data: null
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/banyanhouse-distill-base.git
git@api.gitlife.ru:oschina-mirror/banyanhouse-distill-base.git
oschina-mirror
banyanhouse-distill-base
banyanhouse-distill-base
master