Java for Beginner
758 subscribers
743 photos
212 videos
12 files
1.23K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
gRPC в продакшене

1. Аутентификация и авторизация

gRPC изначально построен на HTTP/2, а значит поддерживает все стандартные механизмы шифрования и аутентификации, включая TLS/SSL.
На уровне протокола клиент и сервер могут обмениваться метаданными (headers), которые используются для передачи токенов, ключей или сессионных идентификаторов.


Аутентификация (authentication)

Аутентификация — это подтверждение личности клиента.

В gRPC это реализуется через метаданные (Metadata), которые добавляются к каждому запросу:
// Пример Java-клиента с авторизационным токеном
ManagedChannel channel = ManagedChannelBuilder
.forAddress("localhost", 50051)
.useTransportSecurity()
.build();

CarServiceGrpc.CarServiceBlockingStub stub = CarServiceGrpc
.newBlockingStub(channel)
.withCallCredentials(new CallCredentials() {
@Override
public void applyRequestMetadata(
RequestInfo requestInfo, Executor executor, MetadataApplier applier) {
Metadata headers = new Metadata();
Metadata.Key<String> AUTHORIZATION =
Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER);
headers.put(AUTHORIZATION, "Bearer my-secret-token");
applier.apply(headers);
}
});


На стороне сервера этот токен можно проверить с помощью interceptor (см. ниже).

В корпоративных системах часто используются:
JWT (JSON Web Token) — стандартный формат токена.
mTLS (Mutual TLS) — двустороннее TLS-шифрование, где аутентифицируются обе стороны.
OAuth 2.0 — для интеграции с внешними провайдерами (Google, Auth0 и т.п.).


Авторизация (authorization)

После того как клиент прошёл аутентификацию, нужно проверить, имеет ли он право выполнять определённые действия.
Обычно авторизация реализуется на уровне interceptor’ов или бизнес-логики, где проверяются роли и права пользователя.



2. Interceptors — middleware для gRPC

Interceptors в gRPC выполняют ту же роль, что фильтры в Spring или middleware в Express.js.


Это промежуточные обработчики, которые могут:
логировать запросы и ответы;
измерять метрики;
проверять токены безопасности;
модифицировать контекст вызова;
перехватывать ошибки.


Пример серверного interceptor’а
public class AuthInterceptor implements ServerInterceptor {
@Override
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
ServerCall<ReqT, RespT> call,
Metadata headers,
ServerCallHandler<ReqT, RespT> next) {

String token = headers.get(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER));
if (token == null || !token.equals("Bearer my-secret-token")) {
call.close(Status.UNAUTHENTICATED.withDescription("Invalid token"), headers);
return new ServerCall.Listener<>() {}; // пустой listener
}

return next.startCall(call, headers);
}
}


Регистрируется interceptor при инициализации сервера:
Server server = ServerBuilder
.forPort(50051)
.addService(ServerInterceptors.intercept(new CarServiceImpl(), new AuthInterceptor()))
.build()
.start();


Interceptors можно комбинировать — например, один для логирования, другой для метрик, третий для авторизации.
Это делает gRPC гибким и расширяемым.



#Java #middle #gRPC #proto
👍2
3. gRPC Gateway — REST-прокси для совместимости

Хотя gRPC эффективен, не все клиенты умеют с ним работать напрямую (например, браузеры без gRPC-Web).
Чтобы не дублировать API, используется gRPC Gateway — это HTTP-прокси, который преобразует REST-запросы в gRPC-вызовы.


Как это работает
Клиент делает обычный HTTP-запрос (GET, POST, PUT).
Gateway принимает запрос и преобразует его в бинарный gRPC-вызов.
Сервер gRPC обрабатывает его и возвращает ответ.
Gateway обратно конвертирует ответ в JSON.


Файл .proto содержит специальные аннотации:
import "google/api/annotations.proto";

service CarService {
rpc GetCar(GetCarRequest) returns (CarResponse) {
option (google.api.http) = {
get: "/v1/cars/{id}"
};
}
}


Так создаётся REST-эндпоинт /v1/cars/{id}, который вызывает gRPC-метод GetCar.

gRPC Gateway позволяет сохранять одну кодовую базу и одну схему, но обслуживать и gRPC-, и REST-клиентов одновременно.



4. Балансировка нагрузки и мониторинг


gRPC поддерживает client-side load balancing, когда клиент сам выбирает, к какому серверу подключаться, используя список адресов.
Это особенно важно для микросервисов, где количество экземпляров сервиса динамически меняется.


Поддерживаются различные политики: round-robin, pick-first, weighted.
В Kubernetes это можно комбинировать с сервис-дискавери (через DNS или Consul).
ManagedChannel channel = ManagedChannelBuilder
.forTarget("dns:///my-grpc-service.default.svc.cluster.local")
.defaultLoadBalancingPolicy("round_robin")
.usePlaintext()
.build();


Для продакшена жизненно важно собирать метрики.
gRPC интегрируется с Prometheus, OpenTelemetry, Zipkin, Jaeger для трассировки и мониторинга.


Через interceptors можно логировать время ответа, коды ошибок и нагрузку:
long start = System.nanoTime();
RespT response = next.startCall(call, headers);
long duration = System.nanoTime() - start;
metrics.recordLatency(duration);


Трассировка (tracing) позволяет увидеть цепочку вызовов между микросервисами — от клиента до базы данных.


5. Совместимость версий и эволюция схем


Когда сервисы растут, .proto-файлы меняются.
Важно, чтобы новые версии клиента и сервера могли работать вместе без сбоев.
Для этого protobuf предоставляет правила совместимости.


Основные правила миграции

Не менять номера полей.
Каждое поле в message имеет уникальный номер, и именно он используется при сериализации.
Изменить имя поля можно, номер — нельзя.

Резервировать удалённые поля.
Если поле больше не используется, его нужно “зарезервировать”:

message Car {
reserved 4, 6 to 8;
reserved "old_model", "legacy_color";
}


Это защищает от случайного переиспользования номеров или имён.

Добавлять новые поля безопасно.
Клиенты старых версий просто игнорируют незнакомые поля, сохраняя обратную совместимость.

Не менять тип данных существующих полей.
Например, int32 нельзя заменить на string.

Версионирование API

Часто версии отражаются в пакетах или namespace:
package car.v1;
service CarService { ... }

package car.v2;
service CarService { ... }


Так можно постепенно внедрять новые контракты без нарушения старых клиентов.


6. Как всё выглядит в продакшене

Реальная система на gRPC обычно включает:
Сервер с набором interceptor’ов (логирование, метрики, безопасность).
TLS-сертификаты и JWT-аутентификацию.
Балансировку через Kubernetes или сервис-дискавери.
Мониторинг и трассировку через OpenTelemetry.
gRPC Gateway для REST-клиентов.
CI/CD-пайплайн, генерирующий код по .proto и публикующий артефакты для разных языков.



#Java #middle #gRPC #proto
👍2
Что выведет код?

import java.util.concurrent.ConcurrentHashMap;

public class Task071125 {
public static void main(String[] args) throws InterruptedException {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("count", 0);

Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
map.computeIfPresent("count", (k, v) -> v + 1);
}
});

Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
map.put("count", map.get("count") + 1);
}
});

t1.start();
t2.start();
t1.join();
t2.join();

System.out.println(map.get("count"));
}
}


#Tasks
👍3
Вопрос с собеседований

Что делает паттерн Strategy? 🤓


Ответ:

Strategy
определяет семейство алгоритмов и позволяет подменять их во время выполнения.

Вместо множества if-else выбирается реализация через интерфейс.

Например, разные алгоритмы сортировки или расчёта скидок можно инкапсулировать в отдельные классы.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
История IT-технологий сегодня — 08 ноября


ℹ️ Кто родился в этот день

Билл Джой (полное имя Уильям Нельсон Джой, William Nelson Joy, 8 ноября 1954 года, Детройт) — американский инженер-программист, со-основатель Sun Microsystems, один из ключевых авторов Unix/BSD, создатель редактора vi; пример сильного влияния на ОС и инфраструктуру ИТ.

Джек Сен-Клер Ки́лби (англ. Jack St. Clair Kilby, 8 ноября 1923 года, Джефферсон-Сити — 20 июня 2005, Даллас) — американский учёный. Лауреат Нобелевской премии по физике 2000 года за изобретение интегральной схемы в 1958 году в период работы в Texas Instruments (TI). Также он — изобретатель карманного калькулятора и термопринтера (1967).


🌐 Знаковые события

1895 — в процессе экспериментов с электричеством Вильгельм Рентген открыл излучение, названное им X-лучами. Впоследствии в честь учёного оно получило название рентгеновского.


#Biography #Birth_Date #Events #08Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Оглавление.

Раздел 1: Знакомство с Java

Глава 1. Введение в Java
Введение в Java
Области применения Java
Как установить JDK

Глава 2. Настройка среды разработки
Основы работы с терминалом в Java
Обзор платформ для разработки на Java

Глава 3. Первая программа
Первая программа на Java
🔥3
Оглавление.

Раздел 4: Управляющие конструкции

Глава 1. Условные операторы
if / else в Java
Switch/case в Java

Глава 2. Циклы
while / do-while в Java
for, foreach
Break, continue, метки (label) в Java
👍1
👍1
Оглавление.

Раздел 6. Коллекции


Глава 1. Введение в коллекции
Обзор Java Collections Framework. Интерфейсы Collection и Map. Иерархия коллекций. Отличия коллекций от массивов
Основные характеристики коллекций: время доступа (Big O), хранение уникальных элементов, упорядоченность и сортировка
(Практика): Начать проект «Библиотека»

Глава 2. List — списки

Глава 3. Set — множества
Интерфейс Set. Особенности множеств
Реализации: HashSet, LinkedHashSet, TreeSet
Методы add, remove, contains
Практика: В «Библиотеке» создать коллекцию Set для хранения уникальных имён авторов. Добавлять автора при добавлении книги, проверять уникальность

Глава 4. Queue и Deque
Интерфейс Queue. Очередь как структура FIFO. Методы offer, poll, peek
Реализации: PriorityQueue, LinkedList как очередь. Применение: обработка задач, хранение заявок
Интерфейс Deque. Двусторонняя очередь (FIFO и LIFO). Реализации: ArrayDeque, LinkedList
Практика: проект «Библиотека»

Глава 5. Map — отображения (словари)
Интерфейс Map. Хранение пар «ключ–значение»
Реализации: HashMap, LinkedHashMap, TreeMap и остальные

Глава 6. Итераторы

Глава 7. Сравнение объектов

Глава 8. Дополнительные аспекты коллекций
👍1
История IT-технологий сегодня — 09 ноября


ℹ️ Кто родился в этот день

Курт Койцер (родился 9 ноября 1955 года) — американский исследователь в области автоматизации проектирования и аппаратных средств (VLSI, EDA), автор большого числа работ по ускорению обучения нейросетей на аппаратуре; профессор и инженер с заметным вкладом в индустрию.


🌐 Знаковые события

1979 — вследствие ошибки американского компьютера системы NORAD (Командование воздушно-космической обороны Северной Америки), сообщившего о советском ядерном нападении, в США объявлена ядерная тревога. В течение десяти минут мир находился на краю ядерной войны. Позднее было установлено, что причиной инцидента стала компьютерная лента, предназначенная для отработки действий при ракетном нападении, которая была ошибочно загружена в компьютер, находящийся на боевом дежурстве.

2005 — европейский зонд «Венера-экспресс» стартовал к Венере.



#Biography #Birth_Date #Events #09Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Проблема удалёнки — не в том, что ты дома.
А в том, что никто тебя не видит
.

Наши родители не знали такого слова - удаленка или удаленная работа.

Все спокойно (или не очень) добирались с утра на заводы, стройки, в кабинеты.

С развитием интернета и коронавирусом, мы вкусили этот запретный плод.

И особенно сладким он кажется тем, кто уже пол жизни ходил каждый день на работу, а потом вкатился в IT.


Свобода, которая превращается в распущенность 🏝

Представь себе рабочий день на заводе. Встать в 5-6 утра, собраться, добежать и опоздать на маршрутку и потом час-два добираться до работы...

Целый день вкалывать и потом так же назад... Выпить бутылку пива, поспать и по новой...

Грустно?

А потом ты начал работать удаленно.
Контроль минимальный.
Пару созвонов через мессенджеры в день, с выключенной камерой? Ерунда.

Сидишь в трусах в своем излюбленном кресле и кайфуешь. Бутылка пива с утра? А давайте две!

Нравится?

А ведь в этом ловушка для слабовольных.


Никто тебя не контролирует - кроме тебя 😉

Вот в чём фокус:
В офисе и цехе есть начальник. Он видит, слышит, дышит тебе в спину. Это - внешняя дисциплина.

На удалёнке начальник всё ещё есть, но ты вне поля его зрения.
Тебе поставлена задача - выполняй ее как знаешь. И тут уже нужна дисциплина внутренняя.

Когда по сути ты сам себе начальник, надсмотрщик и собеседник - эта пустота быстро заполняется чем-то:
едой, сериалами, соцсетями или алкоголем.

А кто-то просто забивает на работу
😏


Свобода требует характера 💪

Вот некоторые удивляются почему многие крупные IT - компании требуют работы в офисе или хотя-бы на гибриде.

Проблема в том, что подавляющее большинство IT - специалистов молодые люди до 30 лет и у многих из них еще слабо сформированы моральные и волевые устои.


Они легко могут забить болт, позволить себе «по пивку» в обед, или просто проспать дейли.

А в офисе такого просто не случится... Ведь все на виду.


Что в итоге 😉

Удалёнка - это лакмусовая бумажка твоего самоконтроля.

Если ты можешь держать себя в тонусе, работать, развиваться, не спиваться и не деградировать -
значит, ты не просто программист.

Ты человек, который способен быть свободным и который уверенно идет к цели.

Ведь свобода - это не “делать, что хочешь”.

Это умение отдохнуть и сделать, что надо, даже когда никто не смотрит.
Это умение держать себя в руках, когда можно не держать.
Это умение сопротивляться соблазнам, даже если за это ничего не будет.




Понравилась статья - поделись с другом, позови его на канал и будет тебе моя благодарность
🤝

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Обновлено и немного переделано оглавление! 👏

Добавлен план изучения Java который будет дополняться далее.

Если интересна информация ранее опубликованная на канале - пользуйтесь! 😎
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Сложная загадка на интеллект!

Почему?

https://t.me/Java_for_beginner_dev

#Mems
👍1