Anonymous Quiz
93%
Массивы имеют фиксированный размер, а слайсы могут изменять размер
3%
Слайсы могут содержать элементы разных типов, а массивы - только одного типа
1%
Массивы могут быть переданы по ссылке, а слайсы - только по значению
2%
Слайсы хранятся в памяти на стеке, а массивы - в куче
👍1
Весь код находится в одном проекте, что упрощает понимание, разработку и отладку. Разработчики могут легко работать с общей кодовой базой.
Приложение разворачивается как единое целое, что упрощает процесс развертывания. Нет необходимости координировать развертывание множества сервисов.
Взаимодействие между компонентами происходит внутри одного процесса, что устраняет сетевые задержки и обеспечивает более быструю работу.
Все компоненты приложения имеют доступ к одной базе данных, что упрощает управление транзакциями и консистентностью данных.
Поскольку приложение развертывается как единое целое, инфраструктурные расходы на управление сетью, оркестрацию и мониторинг меньше по сравнению с микросервисной архитектурой.
Масштабировать приложение приходится целиком, что может быть неэффективно. Если только одна часть приложения испытывает высокую нагрузку, всю систему нужно масштабировать, что приводит к избыточным затратам.
По мере роста приложения кодовая база становится более сложной, что затрудняет поддержку и внесение изменений. Даже небольшие изменения могут потребовать повторного тестирования и развертывания всего приложения.
Все компоненты должны использовать одну и ту же технологическую платформу, что ограничивает возможность выбора лучших инструментов и фреймворков для разных частей приложения.
Развертывание монолитного приложения может занять больше времени, особенно если оно стало большим и сложным. Это замедляет процесс выпуска обновлений.
Высокая степень связанности компонентов может привести к проблемам, когда сбой в одном компоненте может повлиять на всю систему.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Anonymous Quiz
90%
С помощью статической типизации и строгой проверки типов на этапе компиляции
7%
С помощью динамической типизации и проверок во время выполнения
2%
С помощью использования только встроенных типов данных
1%
С помощью глобальной блокировки
👍1
Легко масштабировать отдельные компоненты системы независимо друг от друга. Например, если один микросервис испытывает высокую нагрузку, его можно масштабировать, не затрагивая другие части системы.
Каждый микросервис может разрабатываться, тестироваться и развертываться независимо от других, что сокращает время разработки и улучшает скорость выпуска обновлений.
Разработчики могут использовать разные технологии, языки программирования и фреймворки для разных микросервисов, выбирая наиболее подходящие инструменты для каждой конкретной задачи.
Проблемы в одном микросервисе не приводят к сбою всего приложения. Это повышает устойчивость системы в целом, так как сбои ограничены контекстом конкретного микросервиса.
Маленькие независимые команды могут работать над отдельными микросервисами, что повышает продуктивность и ускоряет разработку новых функций.
Система делится на более мелкие и управляемые части, что облегчает понимание кода и упрощает поддержку.
Управление множеством микросервисов требует эффективной оркестрации и мониторинга. Это приводит к необходимости использования сложных инструментов и дополнительных затрат на администрирование.
Взаимодействие между микросервисами происходит через сеть, что может привести к увеличению задержек и необходимости управления сетевой нагрузкой.
Разработка и тестирование распределённой системы сложнее, чем монолита. Требуется учитывать межсервисное взаимодействие, консистентность данных и возможные сбои в сети.
Разделение данных между микросервисами может привести к дублированию данных и усложнению управления транзакциями, особенно если нужна консистентность данных между сервисами.
Поддержание совместимости между различными микросервисами и обеспечение их корректного взаимодействия требует дополнительного контроля и тестирования.
Управление конфигурацией для множества микросервисов становится сложнее, так как каждая служба может иметь свои собственные настройки и зависимости.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Anonymous Quiz
2%
Интерфейсы увеличивают производительность программы
96%
Интерфейсы позволяют реализовать полиморфизм и упрощают тестирование
0%
Интерфейсы предотвращают утечки памяти
1%
Интерфейсы автоматически синхронизируют горутины
Передача слайсов в разные горутины в Go может быть как безопасной, так и небезопасной в зависимости от контекста использования. Давайте рассмотрим, почему это так, и какие подходы позволяют обеспечить безопасность.
Слайсы в Go являются ссылочными типами, что означает, что они содержат указатель на массив в памяти, длину и емкость. Если несколько горутин одновременно модифицируют один и тот же слайс или его элементы, это может привести к состояниям гонки, некорректным данным и другим непредсказуемым результатам.
Если слайс передается в горутины только для чтения, это безопасно. Одновременное чтение данных не вызывает конфликтов. В этом примере горутины только читают значения из слайса, что безопасно.
package main
import (
"fmt"
"sync"
)
func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
for _, v := range slice {
wg.Add(1)
go func(val int) {
defer wg.Done()
fmt.Println(val)
}(v)
}
wg.Wait()
}
Если каждая горутина должна иметь независимую копию данных, можно передать копию слайса. Это устраняет возможность конфликтов при записи.
package main
import (
"fmt"
"sync"
)
func main() {
originalSlice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
for _, v := range originalSlice {
wg.Add(1)
go func(val int) {
defer wg.Done()
newSlice := make([]int, len(originalSlice))
copy(newSlice, originalSlice)
newSlice[0] = val
fmt.Println(newSlice)
}(v)
}
wg.Wait()
}
Если горутины должны одновременно читать и модифицировать слайс, необходимо использовать механизмы синхронизации, такие как мьютексы или каналы, чтобы обеспечить безопасный доступ к данным.
package main
import (
"fmt"
"sync"
)
func main() {
slice := []int{1, 2, 3, 4, 5}
var wg sync.WaitGroup
var mu sync.Mutex
for i := range slice {
wg.Add(1)
go func(index int) {
defer wg.Done()
mu.Lock()
slice[index] *= 2
mu.Unlock()
}(i)
}
wg.Wait()
fmt.Println(slice)
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Anonymous Quiz
95%
С помощью мьютексов и каналов
2%
С помощью глобальных переменных
1%
С помощью таймеров
2%
С помощью блокировок на уровне пакетов
РПС (RPC, Remote Procedure Call) — это технология, которая позволяет программе вызывать функции (процедуры) на удалённых машинах, как если бы они были локальными. В контексте программирования на Go, РПС используется для организации взаимодействия между разными частями распределённых систем.
В современных приложениях часто необходимо взаимодействовать с различными сервисами, которые могут находиться на разных серверах. РПС позволяет реализовать это взаимодействие простым и прозрачным способом.
В архитектуре микросервисов разные части системы выполняются как независимые сервисы. РПС обеспечивает эффективное и удобное взаимодействие между этими сервисами.
РПС позволяет распределить нагрузку между несколькими серверами, что повышает производительность и масштабируемость системы.
net/rpc
, а также сторонние библиотеки, такие как gRPC, которые обеспечивают более широкие возможности и поддержку разных протоколов.// Сервисная часть
package main
import (
"net"
"net/rpc"
)
// Определяем структуру и методы, которые будут доступны через RPC
type Arith int
func (t *Arith) Multiply(args *Args, reply *int) error {
*reply = args.A * args.B
return nil
}
type Args struct {
A, B int
}
func main() {
arith := new(Arith)
rpc.Register(arith)
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("Listen error: ", err)
}
rpc.Accept(listener)
}
Multiply
для умножения двух чисел, и клиентскую часть, которая вызывает этот метод на удалённом сервере.// Клиентская часть
package main
import (
"fmt"
"log"
"net/rpc"
)
type Args struct {
A, B int
}
func main() {
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("Dialing error: ", err)
}
args := Args{2, 3}
var reply int
err = client.Call("Arith.Multiply", &args, &reply)
if err != nil {
log.Fatal("Arith error: ", err)
}
fmt.Printf("Result: %d\n", reply)
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Anonymous Quiz
2%
Пакеты увеличивают размер исполняемого файла
2%
Пакеты автоматически увеличивают производительность программы
3%
Пакеты устраняют необходимость в компиляции
93%
Пакеты помогают организовать код и повторно использовать его
😁3❤1
HTTPS (HyperText Transfer Protocol Secure) — это расширение протокола HTTP, которое обеспечивает безопасную передачу данных между веб-браузером пользователя и сервером. HTTPS использует протоколы шифрования, такие как TLS (Transport Layer Security) или его предшественник SSL (Secure Sockets Layer), чтобы защитить передаваемые данные от перехвата и манипуляций.
Защита данных от перехвата посторонними лицами. Данные, передаваемые между клиентом и сервером, шифруются с помощью симметричного шифрования, а ключи для этого шифрования обмениваются с использованием асимметричного шифрования.
Подтверждение подлинности сервера (и иногда клиента) с помощью цифровых сертификатов. Сертификаты, выданные доверенными центрами сертификации (CA), подтверждают, что сервер принадлежит законному владельцу.
Обеспечение защиты данных от изменения во время передачи. Хеш-функции и контрольные суммы используются для проверки целостности передаваемых данных.
Клиент отправляет запрос на сервер, указывая, что хочет установить защищенное соединение (например, https://example.com). Сервер отвечает, отправляя свой цифровой сертификат, который содержит публичный ключ сервера и данные о сервере.
Клиент проверяет сертификат с помощью списка доверенных центров сертификации (CA), чтобы удостовериться в подлинности сервера.
Клиент и сервер используют асимметричное шифрование для обмена сессионными ключами. Эти ключи будут использоваться для симметричного шифрования данных во время сессии.
После установки защищенного соединения все данные между клиентом и сервером передаются в зашифрованном виде с использованием сессионных ключей.
Шифрование данных защищает их от перехвата и кражи, особенно на общественных сетях и Wi-Fi.
Наличие HTTPS улучшает доверие пользователей к веб-сайту, что может повысить количество посетителей и конверсии.
Поисковые системы, такие как Google, дают предпочтение сайтам, использующим HTTPS, в своих рейтингах.
HTTPS помогает защититься от атак типа "человек посередине" (MITM), при которых злоумышленники могут перехватывать и изменять данные.
Установка и поддержка защищенного соединения требует дополнительных вычислительных ресурсов, что может немного замедлить загрузку страниц.
Приобретение и обновление сертификатов могут требовать дополнительных затрат, хотя существуют и бесплатные решения, такие как Let’s Encrypt.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
SSL (Secure Sockets Layer) — это протокол, который обеспечивает безопасность передачи данных в интернете, используя шифрование. Он был разработан для защиты данных, передаваемых между клиентом (например, веб-браузером) и сервером (например, веб-сайтом), от перехвата и манипуляций.
Защита данных от перехвата и чтения посторонними лицами путем их шифрования.
Подтверждение подлинности сервера (и иногда клиента) с помощью цифровых сертификатов, что позволяет клиенту убедиться, что он подключен к настоящему серверу.
Проверка того, что данные не были изменены во время передачи, с помощью контрольных сумм и хеш-функций.
Клиент инициирует соединение с сервером, запрашивая защищенное соединение.
Сервер отправляет свой цифровой сертификат, который содержит его публичный ключ и информацию о сервере.
Клиент проверяет сертификат, используя доверенные центры сертификации (CA), чтобы удостовериться в подлинности сервера.
Клиент и сервер используют асимметричное шифрование для обмена ключами сеанса, которые затем используются для симметричного шифрования данных в течение сессии.
Все данные, передаваемые между клиентом и сервером, шифруются с использованием симметричных ключей, обеспечивая безопасность передачи.
При посещении веб-сайта с использованием HTTPS (например, https://example.com), SSL обеспечивает шифрование и безопасность данных, передаваемых между вашим браузером и сервером.
Никогда не был выпущен публично из-за серьезных уязвимостей.
Выпущен в 1995 году, но вскоре был признан небезопасным из-за множества уязвимостей.
Выпущен в 1996 году, значительно улучшил безопасность, но со временем также был признан устаревшим из-за уязвимостей (например, POODLE-атака).
SSL был заменен протоколом TLS, который является его преемником и предлагает улучшенную безопасность. Текущие версии TLS (1.2 и 1.3) используются вместо SSL.
TLS обеспечивает более сильное шифрование, лучшее управление сессионными ключами и устранение уязвимостей, найденных в SSL.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
TLS (Transport Layer Security) — протокол безопасности, который защищает данные, передаваемые через интернет, используя шифрование. TLS является преемником SSL (Secure Sockets Layer) и обеспечивает конфиденциальность, целостность и аутентификацию данных.
Защита данных от перехвата и чтения посторонними лицами. Данные шифруются с использованием симметричного шифрования, а ключи обмениваются асимметрично.
Подтверждение подлинности сервера и клиента с помощью цифровых сертификатов, выданных доверенными центрами сертификации (CA).
Защита данных от изменения во время передачи с помощью контрольных сумм и хеш-функций.
Клиент отправляет запрос на сервер для установки защищенного соединения.
Сервер отправляет свой цифровой сертификат, который клиент проверяет с помощью CA.
Клиент и сервер обмениваются сессионными ключами, используя асимметричное шифрование, и далее используют их для симметричного шифрования данных.
Все данные передаются в зашифрованном виде.
Улучшение по сравнению с SSL 3.0, но устаревший.
Дополнительные защиты, но также устаревший.
Современные алгоритмы шифрования, улучшенная безопасность.
Современные алгоритмы шифрования и хеширования.
TLS 1.3 снижает задержки при установке соединения.
Поддерживается большинством современных браузеров и серверов.
Особенно для крупных систем.
Шифрование требует дополнительных вычислительных ресурсов.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TLS Example</title>
</head>
<body>
<h1>Welcome to Secure Site</h1>
<p>Your connection to this site is secure with HTTPS using TLS.</p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Да, между SSL (Secure Sockets Layer) и TLS (Transport Layer Security) есть отличия. TLS является улучшенной и более безопасной версией SSL.
SSL 1.0: Никогда не был выпущен публично из-за серьезных уязвимостей.
SSL 2.0: Выпущен в 1995 году, но вскоре был признан небезопасным из-за множества уязвимостей.
SSL 3.0: Выпущен в 1996 году, значительно улучшил безопасность, но со временем также был признан устаревшим из-за уязвимостей (например, POODLE-атака).
TLS 1.0: Выпущен в 1999 году как обновление SSL 3.0. Включает исправления безопасности и улучшения.
TLS 1.1: Выпущен в 2006 году с дополнительными защитами от некоторых атак.
TLS 1.2: Выпущен в 2008 году, поддерживает современные алгоритмы шифрования и хеширования.
TLS 1.3: Выпущен в 2018 году, значительно улучшена безопасность и производительность, упрощен процесс установки соединения.
SSL: Поддерживает более старые и менее безопасные алгоритмы шифрования.
TLS: Поддерживает более современные и безопасные алгоритмы шифрования. TLS 1.3 исключает поддержку устаревших алгоритмов и предлагает только современные безопасные алгоритмы.
SSL: Более сложный процесс рукопожатия, включающий несколько шагов, что делает его уязвимым для некоторых атак.
TLS: Улучшенный процесс рукопожатия, включая использование HMAC (Hash-based Message Authentication Code) для обеспечения целостности сообщения. TLS 1.3 значительно упрощает и ускоряет процесс рукопожатия.
SSL: Использует комбинацию MD5 и SHA-1 для целостности данных, что не так безопасно по современным стандартам.
TLS: Использует HMAC с SHA-256 и другими современными алгоритмами для обеспечения целостности данных.
SSL: Меньше возможностей для управления сеансами.
TLS: Включает улучшенные механизмы для управления сеансами, такие как возобновление сеансов, что позволяет экономить время и ресурсы при повторных подключениях.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Для проверки типа переменной во время выполнения используется конструкция type assertion:
value, ok := x.(T)
, где T
— предполагаемый тип, а ok
указывает, совпал ли тип. Также можно использовать type switch: switch v := x.(type) { case int: // действия для int case string: // действия для string default: // другие типы }
.Пакет
reflect
предоставляет механизмы для получения информации о типах переменных во время выполнения.package main
import (
"fmt"
"reflect"
)
func main() {
var x interface{} = 42
// Получаем тип переменной x
t := reflect.TypeOf(x)
fmt.Println("Type:", t)
}
Этот метод позволяет проверить, соответствует ли переменная конкретному типу, и извлечь значение, если это так.
package main
import "fmt"
func main() {
var x interface{} = 42
// Проверка типа и извлечение значения
if val, ok := x.(int); ok {
fmt.Println("x is an int:", val)
} else {
fmt.Println("x is not an int")
}
}
Этот метод удобен, если нужно проверить переменную на соответствие нескольким типам.
package main
import "fmt"
func main() {
var x interface{} = "Hello, World!"
switch v := x.(type) {
case int:
fmt.Println("x is an int:", v)
case string:
fmt.Println("x is a string:", v)
case bool:
fmt.Println("x is a bool:", v)
default:
fmt.Println("x is of unknown type")
}
}
reflect.TypeOf(x)
: Возвращает объект типа reflect.Type
, который содержит информацию о типе переменной x
.x.(int)
: Проверяет, является ли x
переменной типа int
, и возвращает значение и булево значение, указывающее, удалось ли утверждение типа.switch v := x.(type)
: Позволяет проверить переменную x
на соответствие нескольким типам в одном блоке switch
.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Это представляет собой сложную задачу из-за множества компонентов, взаимодействующих друг с другом в различных сетевых условиях.
Проверка корректности отдельных компонентов системы. Используйте библиотеки для написания тестов, такие как
testing
в Go. Интеграционное тестирование Моки (mocking) и заглушки (stubs) для изоляции компонентов.package main
import (
"testing"
)
func TestAdd(t *testing.T) {
result := Add(1, 2)
if result != 3 {
t.Errorf("Expected 3, got %d", result)
}
}
Проверка взаимодействия между компонентами системы.
Используйте контейнеризацию (например, Docker) для поднятия среды тестирования. Тестирование с использованием реальных баз данных, очередей сообщений и других внешних сервисов.
version: '3'
services:
app:
image: myapp:test
depends_on:
- db
db:
image: postgres:latest
environment:
POSTGRES_DB: testdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
Проверка всей системы в целом, включая все её компоненты и их взаимодействие. Сценарии end-to-end (E2E) тестирования. Тестирование пользовательского интерфейса и API. Selenium для тестирования веб-интерфейсов. Postman или REST-assured для тестирования API.
Проверка системы на устойчивость к высоким нагрузкам и определение её производительности. Нагрузочные тесты для проверки, как система справляется с увеличением числа пользователей или запросов. Тесты стресс-тестирования для выявления пределов производительности системы. Тесты стабильности для проверки системы под постоянной нагрузкой в течение длительного времени. Apache JMeter Gatling Locust
Проверка способности системы справляться с отказами отдельных компонентов или сетевых сбоев. Имитация отказов компонентов (например, остановка сервиса или отключение узла).
Инструменты для хаос-тестирования (chaos engineering). Chaos Monkey от Netflix Gremlin
Проверка системы на наличие уязвимостей и обеспечение её защиты от атак.Сканы уязвимостей. Тестирование на проникновение (penetration testing). OWASP ZAP Burp Suite
Интеграция тестирования в процесс CI/CD для автоматизации и ускорения релизов. Настройка CI/CD конвейера для автоматического выполнения тестов при каждом изменении кода. Использование инструментов, таких как Jenkins, GitLab CI/CD или CircleCI.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1