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

Spring Boot

Знания меняют судьбу, программирование делает меня счастливым, и я продолжу шагать в мире открытого исходного кода в 2020 году.
Ставьте лайк и смотрите снова, формируйте привычку
дай мне звезду,Нажмите, чтобы понять пример каркаса базового решения платформы управления, основанного на интерфейсной сервисной инфраструктуре нового поколения «ApiBoot» («Vue + ElementUI»).

предисловие

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

Шаги переадресации запроса можно условно разделить на следующие этапы:

  1. Разрешение доменного имени на сервер переадресации
  2. Сервер пересылки будет пересылать на единый шлюз в соответствии с конфигурацией веса (веса) и резервного копирования (резервной копии).
  3. Если унифицированный шлюз имеет конфигурацию оттенков серого, ему необходимо фильтровать запросы на основе информации об идентификаторе или заголовке.
  4. Переадресация на конкретную бизнес-службу

Лучшее на рынке请求转发Есть много видов, таких как:Nginx,F5,Kong,Tengineи т. д., гдеTengineАлибабаNginxЧтобы резюмировать, наше содержание в этой главе основано наNginxЧтобы объяснить, давайте сначала подготовимсяnginxтестовая среда.

Подготовьте среду

Если ваша тестовая среда не установленаNginx, конкретный процесс установки я опишу двумя способами.

Установите Nginx с Brew

Что, если выOSXсистема, может использоваться напрямуюbrewИнструмент управления установлен.Этот метод относительно прост.Он автоматически загружает последнюю стабильную версию с удаленного сервера для распаковки и настройки среды.

# 安装nginx
➜  ~ brew install nginx

подожди тихо~

После завершения установки давайте сначала изменим номер порта (установочный пакет brew изменил номер порта прослушивания по умолчанию на8080, как правило, при использовании распаковки для установки порт прослушивания80).

Нам нужно найтиnginx.confРасположение этого файла:

➜  ~ sudo find / -name nginx.conf           
/usr/local/etc/nginx/nginx.conf

Найдя файл, переходимsudo vi /usr/local/etc/nginx/nginx.confкоманда для изменения номера порта по умолчанию, расположение выглядит следующим образом:

server {
        listen       80;
        server_name  localhost;
        #...
}        

Сохраните и выйдите после модификации.

Наконец, не забудьте перезагрузитьсяNginxСлужить.

➜  ~ brew services restart nginx

Разархивируйте пакет

Иди первымnginxОфициально предоставленоnginx.org/downloadадрес загрузки, чтобы выбрать вашу любимую версию, следующие1.17.7Пример версии:

Нажмите, чтобы загрузить, распаковать и установить его (обратите внимание на среду компиляции, могут отсутствовать некоторые библиотеки зависимостей, вы можете установить соответствующие зависимости локально)

# 解压nginx
tar -xvf nginx-1.17.7.tar.gz
# 进入目录
cd nginx-1.17.7
# 配置
./configure --prefix=/usr/local/nginx
# 编译
sudo make
# 安装
sudo make install
# 进入nginx执行目录
cd /usr/local/nginx/sbin
# 启动nginx
./nginx

Установка завершена, если вы посетитеhttp://127.0.0.1можно увидетьWelcome to nginx!Слова означают, что мы успешно установили.

Пример проекта

Для того, чтобы продемонстрировать безболезненное восприятие пользователями службы обновлений, сначала создадим простойSpringBootПример проекта, добавить в проект тестовый интерфейс, проектpom.xmlЗависимости следующие:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

Пример интерфейса

СоздатьTestControllerТестовый контроллер выглядит так:

/**
 * 测试控制器
 *
 * @author 恒宇少年
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {
    @Autowired
    private ServerProperties serverProperties;

    @GetMapping
    public String hello() {
        return "请求分发到了,端口号:" + serverProperties.getPort() + "的服务,接口访问成功.";
    }
}

Настроить переадресацию

Интерфейс запроса, который нам нужен для тестирования, готов, а затем нам нужно получить доступ кnginxПри пересылке запроса на протестированный нами интерфейс нам нужно использовать его при настройке переадресацииnginxДва ключевых слова , являютсяupstream,location.

  • upstream: Группа серверов, запрос конфигурации распространяется на несколько серверов в группе.
  • location: префикс пути переадресации, например: «/user/», когда мы посещаемhttp://127.0.0.1/user/1, он выполнитlocationэкспедиторский бизнес.

Процесс переадресации вверх по течению показан на следующем рисунке:

Настроить восходящий поток

существуетnginx.confдокументhttpдобавил в ретвит服务器组(вверх по течению), следующим образом:

# 负载配置
upstream test {
	server 127.0.0.1:8080 weight=1;
	server 127.0.0.1:9090 weight=2;
	server 127.0.0.1:9000 backup;
}

Настроить местоположение

Группа серверов была настроена выше, нам нужно назвать ееtestГруппа серверов настроена как прокси вlocation,существуетlocationизserverдобавить один следующийlocation,Следующим образом:

# 配置"/lb/"路径的请求全部转发到本地8080端口
location /lb/ {
	proxy_pass http://test/;
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	proxy_connect_timeout       50;
	proxy_read_timeout          50;
	proxy_send_timeout          50;
}

Перезапустите Nginx

я используюbrewустановленnginx, Команда перезапуска выглядит следующим образом:

brew services restart nginx

Что, если вы安装包Способ установки:

# 进入安装包目录
cd /usr/local/nginx/sbin
# 重载
./nginx -s reload

Конфигурация веса

существуетnginxСуществует понятие веса, которое управляет трафиком запросов в соответствии с размером значения веса, чем больше значение веса, тем больше распределение трафика.testИнтерпретация весов конфигураций в группах серверов:

  • server 127.0.0.1:8080 weight 1;Соотношение веса1/3, каждые 3 запроса будут перенаправляться на этот сервер один раз.
  • server 127.0.0.1:9090 weight 2;Соотношение веса2/3, каждые 3 запроса будут перенаправляться на этот сервер 2 раза.

Альтернативная конфигурация

когда мыupstreamвнутриserverХвост добавилbackupКогда это означает, что этот сервер является резервным сервером, он будет включен только тогда, когда другие серверы не работают.Мы фактически используем это при обновлении.

запустить тест

Для удобства демонстрации мы будем непосредственно тестировать проект в этой главе.packageПосле упаковки пройти--server.portчтобы указать номер рабочего порта для имитации сценария нескольких серверов.

# 启动127.0.0.1:8080服务器
java -jar target/use-nginx-loadbalance-upgrade-service-0.0.1-SNAPSHOT.jar --server.port=8080
# 启动127.0.0.1:9090服务器
java -jar target/use-nginx-loadbalance-upgrade-service-0.0.1-SNAPSHOT.jar --server.port=9090
# 启动127.0.0.1:9000备用服务器
java -jar target/use-nginx-loadbalance-upgrade-service-0.0.1-SNAPSHOT.jar --server.port=9000

Примечание. Используйте несколько окон терминала для запуска службы.

существуетnginx.conf>serverСредняя конфигурацияlocationУсловие переадресации/lb/префикс пути, поэтому мы получаем доступhttp://127.0.0.1/lb/test(из-заnginxНомер порта прослушивания80Так сквозьnginxВам не нужно указывать номер порта при доступе к переадресации) будет переадресован наtestна сервере в группе серверов.

Контрольная точка: пересылка веса

curl http://localhost/lb/test
端口号:8080,接口访问成功.                                                                                                        

curl http://localhost/lb/test
端口号:9090,接口访问成功.

curl http://localhost/lb/test                                                                                                       
端口号:9090,接口访问成功.

curl http://localhost/lb/test                                                                                                      
端口号:8080,接口访问成功. 

По результатам визита,8080Услуга номера порта запрашивается каждые 3 раза1次,а также9090запрашивается каждые 3 раза2次, то есть именно тот вес, который соответствует нашей конфигурации (weight), тест пройден.

Контрольная точка: режим ожидания вступает в силу

мы кладем8080,9090Обе службы остановлены, зайдите сноваhttp://127.0.0.1/lb/test.

curl http://localhost/lb/test
端口号:9000,接口访问成功.

curl http://localhost/lb/test                                                                                                       
端口号:9000,接口访问成功.      

curl http://localhost/lb/test                                                                                                  
端口号:9000,接口访问成功.

Вы можете видеть, что наш сервер резервного копирования включен и перенаправил весь трафик запросов на9000На этом сервисе тест прошел.

Постучать по доске, нарисовать ключ

когда мы ставим8080,9090Когда оба остановлены, сервер резервного копирования будет включен, и тогда мы сможем обновить8080,9090Рабочий код этих двух служб перезапускается после завершения обновления, если8080,9090Один из двух серверов работает,nginxтрафик не будет распределяться на бэкап9000и так далее, чтобы обновить все службы.

пример кода

Если вам понравилась эта статья, нажмите на репозиторий исходного кодаStar,Спасибо! ! ! Образец исходного кода этой статьи можно получить по следующим каналам, каталогuse-nginx-loadbalance-upgrade-service:


автор личноблогИспользуйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API