Игорь Градов
Игорь Градов
5 мин
ai

Java Gemini API через прокси: как обойти блокировку Google из России

Google заблокировала доступ к Gemini API из ряда регионов, но Java-разработчик нашёл рабочий обход и выложил готовый паттерн прокси, который пригодится всем, кто строит ИИ-продукты из России.

Java Gemini API через прокси: как обойти блокировку Google из России
Почему это важно

Gemini предлагает контекстное окно в 1 миллион токенов (токен, это минимальная единица текста, которую обрабатывает модель), но из заблокированных регионов запросы до серверов Google просто не доходят. Готовый Java-прокси снимает эту проблему и работает не только с Gemini, но и с OpenAI и Anthropic.

Зачем понадобился прокси и откуда взялось решение

Разработчик формата BDoc (Book Document, открытая альтернатива закрытым издательским форматам IDML, INDD и Scribus SLA) столкнулся с конкретной задачей: для работы с длинными документами нужна нейросеть с большим контекстным окном. Gemini с окном в миллион токенов подходил лучше всех, но Google заблокировала ряд регионов, и запросы оттуда не проходят.

Решение: написать на Java лёгкий прокси-сервер (ai-proxy), который разворачивается на разрешённом хостинге и прозрачно пробрасывает запросы к провайдерам ИИ. Один домен, одна точка входа, а дальше прокси сам направляет трафик к нужному сервису.

Что понадобится

  • Java 17+ и сборщик Maven или Gradle
  • Spring Boot с модулем WebFlux (реактивный веб-фреймворк)
  • API-ключи от нужных провайдеров: Gemini, OpenAI или Anthropic
  • VPS или облачный сервер вне заблокированного региона (подойдёт любой европейский или азиатский хостинг)
  • Примерно 1,5 часа на первую настройку, если вы знакомы со Spring Boot

Как устроен прокси: от наивной версии к рабочей?

Автор прошёл две итерации, и разница между ними принципиальна для безопасности.

Версия 1: ключи зашиты на сервере. Первый вариант использовал Spring WebFlux и WebClient. Роутинг строился по первому сегменту пути: /gemini/..., /openai/..., /anthropic/.... Конфигурация хранила ключи прямо на сервере:

app:
  providers:
    gemini:
      base-url: https://generativelanguage.googleapis.com
      auth:
        type: query
        parameter: key
        value: ${GEMINI_API_KEY}
    openai:
      base-url: https://api.openai.com
      auth:
        type: bearer
        value: ${OPENAI_API_KEY:}
    anthropic:
      base-url: https://api.anthropic.com
      auth:
        type: header
        header: x-api-key
        value: ${ANTHROPIC_API_KEY:}

Прокси сам подставлял ключ в зависимости от типа авторизации: query-параметр для Gemini, заголовок Bearer для OpenAI, заголовок x-api-key для Anthropic.

Работало, но с двумя проблемами:

  • Прокси хранил все секреты централизованно. Если через него ходят несколько клиентов с разными правами, разделить доступ нельзя без правки кода.
  • Каждый новый тип авторизации требовал изменений в Java-коде: новый элемент enum, новая ветка switch, пересборка Docker-образа, повторный деплой.

Версия 2: прокси не знает ключей. Клиент сам подставляет нужный заголовок авторизации, а прокси прозрачно пробрасывает всё как есть. Это и безопаснее, и проще в поддержке.

Пошаговая инструкция

  1. Создайте Spring Boot проект с зависимостью spring-boot-starter-webflux.

  2. Настройте маршрутизацию. Первый сегмент пути (/gemini/, /openai/, /anthropic/) определяет, на какой базовый URL уходит запрос. Сервис UrlBuilderService собирает итоговый URI.

  3. Реализуйте сервис проксирования. Центральный класс ProxyService принимает входящий запрос и пробрасывает его к провайдеру:

public Mono<ServerResponse> forward(ProxyRequest request) {
    URI uri = urlBuilderService.build(request);
    WebClient.RequestBodySpec requestBodySpec =
        webClient.method(request.method()).uri(uri);
    copyHeaders(request.headers(), requestBodySpec);

    WebClient.RequestHeadersSpec<?> clientRequest =
        hasBody(request.method())
            ? requestBodySpec.body(request.body(), DataBuffer.class)
            : requestBodySpec;

    return clientRequest.retrieve()
        .onStatus(status -> true, err -> Mono.empty())
        .toEntityFlux(DataBuffer.class)
        .flatMap(entity -> {
            HttpHeaders filtered = filterHeaders(entity.getHeaders());
            Flux<DataBuffer> body = entity.getBody() != null
                ? entity.getBody() : Flux.empty();
            return ServerResponse.status(entity.getStatusCode())
                .headers(h -> h.addAll(filtered))
                .body(BodyInserters.fromPublisher(body, DataBuffer.class));
        });
}
  1. Фильтруйте служебные заголовки. При копировании заголовков из входящего запроса исключайте Host, Content-Length и Accept-Encoding. Из ответа провайдера удаляйте Content-Length, Transfer-Encoding и Content-Encoding, чтобы не сломать потоковую передачу.

  2. Разверните на VPS вне заблокированного региона. Соберите Docker-образ, запустите на сервере, направьте свой домен на этот сервер.

  3. В клиенте укажите адрес прокси вместо прямого URL провайдера. Ключ авторизации клиент подставляет сам, прокси его не хранит и не видит.

Как это применить

Допустим, вы из РФ работаете с Java Gemini API через клиент, который умеет подставлять ключ в query-параметр. Вместо https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=ВАШ_КЛЮЧ вы указываете https://ваш-прокси.example.com/gemini/v1beta/models/gemini-pro:generateContent?key=ВАШ_КЛЮЧ. Запрос уходит на ваш VPS в Европе, оттуда к Google, ответ возвращается потоком. Клиент не замечает разницы, задержка добавляет 50 до 150 мс в зависимости от расположения сервера.

Частые ошибки
  • Не убрали заголовок Host. Если пробросить оригинальный Host, провайдер может отклонить запрос или отдать ошибку маршрутизации.
  • Оставили Content-Length в ответе. При потоковой передаче через реактивный WebClient реальная длина тела может не совпасть с заявленной, браузер или клиент обрежет ответ.
  • Хранят ключи на прокси (версия 1). Это работает для одного пользователя, но ломается, когда через прокси ходят несколько клиентов. Переходите сразу ко второй версии с pass-through.
  • Забыли про HTTPS. Без шифрования ключи авторизации летят в открытом виде. Настройте TLS-сертификат на прокси.

Кому это пригодится прямо сейчас?

Java-разработчикам в РФ и СНГ. Если вы строите продукт на Java Gemini API и столкнулись с географической блокировкой, этот прокси решает проблему за один вечер. Код минимален: один сервис, одна маршрутизация, никакой бизнес-логики.

Авторам и контент-командам. Если ваш ИИ-инструмент для генерации текстов опирается на Gemini из-за длинного контекста, попросите разработчика поднять такой прокси. Миллион токенов, это примерно 700 000 слов: можно скормить модели целую книгу и работать с ней в одном диалоге.

Предпринимателям, которые тестируют несколько ИИ-провайдеров. Единая точка входа для Gemini, OpenAI и Anthropic упрощает переключение между моделями. Не нужно менять инфраструктуру при смене провайдера.

Мнение редакции dzen.guru

Подход с pass-through ключей мне кажется правильным не только с точки зрения безопасности. Он делает прокси «глупым» в хорошем смысле: сервер не знает ваших секретов, не требует обновления при появлении нового провайдера и не ломается от чужих изменений в API. По моим наблюдениям, большинство российских разработчиков, работающих с Gemini, до сих пор используют VPN на уровне рабочей машины. Прокси на VPS стабильнее: VPN-соединения рвутся, а сервер работает постоянно. Честная оговорка: это не обход санкций в юридическом смысле, а техническое решение сетевой проблемы. Условия использования API каждого провайдера стоит перечитать отдельно.

Попробуйте нейросети для контента без блокировок

На dzen.guru мы собрали подборку рабочих ИИ-инструментов, доступных из России, с инструкциями по настройке

Перейти к инструментам

Для тех, кто работает с Java Gemini API из России, этот прокси закрывает реальную боль: не нужно держать VPN на каждой машине, не нужно менять код клиента, не нужно хранить ключи в одном месте. Разверните, проверьте на тестовом запросе и забудьте о блокировке.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Google Cloud и Accenture запустили совместный проект по ИИ
ai

Google Cloud и Accenture запустили совместный проект по ИИ

Google Cloud и консалтинговая компания Accenture объединили инженерные ресурсы в новое подразделение Accenture Gemini Enterprise Business Group, чтобы помогать…

6 мин
ИИ-модель погоды от Google обновляет прогноз каждый час вместо шести
ai

ИИ-модель погоды от Google обновляет прогноз каждый час вместо шести

Google выпустила третью версию WeatherNext, своей ИИ-модели прогноза погоды, и главное обновление касается спутниковых данных: теперь модель строит прогноз…

4 мин
ai

Безопасность нейросетей через запреты по темам провалилась: 74% безобидных вопросов уходят в отказ

Почему это важно Исследователи показали, что блокировать целую тему (например, «политика») в языковой модели не просто грубо, а вредно: модель начинает…

6 мин