слова, написанные впереди
Скоро экзамен! ! !
Как борющемуся студенту колледжа, мне снова приходится сдавать полугодовой выпускной экзамен, потому что я не слушал в классе, я ничего не могу знать, никаких принципов связи, одночиповых микрокомпьютеров. . . Простите меня! ! !
Покажи тебе, что я делаю в классе, и ты поймешь, почему я ничего не могу сделать.
эммм, слова некрасивые😑. Я до сих пор помню, что это был урок английского языка, и учитель не разрешал пользоваться электронными устройствами, поэтому я мог только от руки писать идеи своей статьи. . .
Так что, рискуя завалить класс в конце семестра👊, я должен закончить писать эту статью и поделиться своими знаниями со всеми, чтобы я мог просмотреть и понять это сам.Spring Cloud
.
Моя девушка сказала, если этот пост наберет 50 лайков, купи мне SSD 🙏🙏🙏
Прежде всего, позвольте мне показать вам картинку, Если вы не понимаете некоторые части этой картины, я надеюсь, что вы придете к пониманию после прочтения моей статьи.
что такое весеннее облако
Создание распределенной системы не обязательно должно быть сложным и подверженным ошибкам. Spring Cloud предоставляет простую и удобную модель программирования для наиболее распространенных шаблонов распределенных систем, помогая разработчикам создавать отказоустойчивые, надежные и скоординированные приложения. Spring Cloud построен на основе Spring Boot, что позволяет разработчикам легко приступить к работе и быстро внедрить его в работу.
Официальное действительно официальное, и введение настолько предусмотрительно.
что я понимаюSpring Cloud
Это универсальное решение для архитектуры микросервисной системы.В процессе создания микросервисов нам необходимо сделать следующее:Регистрация службы обнаружения,Центр конфигурации,шина сообщений,балансировки нагрузки,выключатель,Мониторинг данныхи другие операции, а Spring Cloud предоставляет нам простую модель программирования, которая позволяет легко реализовать построение микросервисных проектов на основе Spring Boot.
Версия Spring Cloud
Конечно, это просто не по теме.
Номер версии Spring Cloud — это не числовой номер версии, который мы обычно видим, а какие-то очень странные слова. Эти слова являются названиями станций лондонского метрополитена в Соединенном Королевстве. При этом хронологический порядок версий соответствует порядку алфавита, например: самая ранняя Релизная версия Angel, вторая Релизная версия Brixton (топоним Великобритании), а затем Camden, Dalston, Edgware, Finchley, Greenwich , Хокстон.
Платформа обнаружения сервисов Spring Cloud — Eureka
Eureka — это служба на основе REST (Representational State Transfer), которая в основном используется в облаке AWS для поиска служб для балансировки нагрузки и аварийного переключения серверов среднего уровня. Мы называем эту службу сервером Eureka. Eureka также поставляется с клиентским компонентом на основе Java, Eureka Client, который значительно упрощает взаимодействие со службами. Клиент также имеет встроенный балансировщик нагрузки, который может выполнять базовую циклическую балансировку нагрузки. В Netflix более сложный балансировщик нагрузки использует Eureka, чтобы обеспечить взвешенную балансировку нагрузки на основе множества факторов, таких как трафик, использование ресурсов, условия ошибок и т. д., для превосходной отказоустойчивости.
В целом,Eureka
Это платформа обнаружения служб. Что такое сервис и что такое открытие?
Берите пример из жизни, например, когда мы обычно снимаем жилье и находим посредника.
Когда нет посредника, нам нужно найти арендодателей, у которых есть дома для сдачи в аренду один за другим, что, очевидно, будет очень трудоемким. ленивы Ищите вот так (после стольких поисков, если нет подходящего, можно только уладить).Здесь мы эквивалентны микросервисамConsumer
, и эти арендодатели являются эквивалентом микросервисовProvider
. потребительConsumer
нужно звонить провайдеруProvider
Некоторые из предоставляемых услуг, как мы должны арендовать их дом сейчас.
Но если это только между арендатором и арендодателем, то их эффективность очень низка: арендодатель не может найти арендатора и не может зарабатывать деньги, а арендатор не может найти арендодателя и не может жить в доме. . Таким образом, арендодатель, должно быть, задумал транслировать информацию о своем собственном объявлении (например, разместить небольшие рекламные объявления на улице), чтобы арендодатель выполнил свою задачу (опубликовать объявление), но есть две проблемы. Во-первых, другие люди, не являющиеся арендаторами, могут получать такого рода новости об аренде, которые в реальном мире ничто, но появятся в компьютерном мире.НЧпроблема. Во-вторых, арендатору по-прежнему трудно вас найти.Представьте, что мне нужно снять жилье, а также нужно найти по очереди небольшие объявления на улице.Это хлопотно?
тогда что нам делать? Конечно, мы не будем такими глупыми, первое, что нужно найтипосредникДа, это дает нам место для унификации наших списков, и нам, потребителям, просто нужно зайти на него, чтобы найти его. А арендодателям нужно только опубликовать свои объявления у посредника.
Итак, теперь наш узор такой.
Однако некоторые проблемы все же возникают и в это время.
- Что делать, если арендодатель не хочет продавать дом после регистрации? Должны ли мы позволить домовладельцуРегулярно продлевайте? Удаляет ли арендодатель их из регистрационного списка агента, если они не продлеваются?Удалить.
- Будет ли арендатор такжерегистрШерстяная ткань? В противном случае, как Сторона Б придет к договору?
- Может ли посредниксеть магазиновШерстяная ткань? Если этот один магазин недоступен из-за каких-то форс-мажоров, можем ли мы перейти в другой сетевой магазин?
Ввиду вышеуказанных проблем, давайте перестроим приведенную выше диаграмму шаблона.
Хорошо, после этого 🌰 мы можем посмотреть примерноEureka
некоторые основные понятия, вы обнаружите, насколько просто это понять. 👎👎👎
обнаружение службы: По сути, это «посредник», и во всем процессе есть три роли:Поставщики услуг (арендные дома), потребители услуг (арендаторы), агенты по обслуживанию (жилищные агенты).
поставщики услуг: Это предоставление некоторых услуг, которые он может выполнять внешнему миру.
потребители услуг: это «пользователь», которому необходимо использовать некоторые службы.
сервисный посредник: По сути, это «мост» между поставщиками услуг и потребителями услуг.Поставщики услуг могут зарегистрироваться у посредников услуг, а потребители услуг могут найти услуги у посредников услуг, если им нужно потреблять какие-то услуги (использовать какие-то функции). провайдер, зарегистрированный у брокера услуг.
Реестр регистрации службы:
Официальное объяснение: когдаEureka
клиент дляEureka Server
При регистрации предоставляет свойметаданные, такие как IP-адрес, порт, URL-адрес индикатора работоспособности, домашняя страница и т. д.
В сочетании с пониманием посредника: арендодатель (поставщикEureka Client Provider
) в посреднике (серверEureka Server
), где регистрируется информация о доме, такая как площадь, цена, местоположение и т. д. (метаданныеmetaData
).
Продление услуги Продление:
Официальное объяснение:Eureka
Клиент будет отправлять сердцебиение каждые 30 секунд (по умолчанию), чтобы обновить контракт.. Сообщите о продлении контрактаEureka Server
ДолженEureka
Клиент все еще там без проблем. Обычно, еслиEureka Server
Не получено за 90 секундEureka
Обновление клиента, он удаляет экземпляр из своего реестра.
В сочетании с пониманием посредника: арендодатель (поставщикEureka Client Provider
) периодически сообщать посреднику (серверуEureka Server
) Мой дом еще в аренде (продление), посредник (серверEureka Server
) сохранить дом после получения.
Получить реестры Получить реестры:
Официальное объяснение:Eureka
Клиент получает информацию реестра с сервера и кэширует ее локально. Клиенты используют эту информацию, чтобы найти другие службы для совершения удаленных вызовов. Информация в этом списке регистрации периодически обновляется (каждые 30 секунд). Каждый раз, когда возвращается информация списка регистрации, это может быть связано сEureka
Информация кэша клиента отличается,Eureka
Клиент обрабатывает это автоматически. Если по какой-либо причине информация о регистрационном списке не может быть сопоставлена вовремя,Eureka
Затем клиент получает всю информацию реестра.Eureka
Сервер кэширует информацию реестра, весь реестр и информацию каждого приложения сжимает, а сжатое содержимое точно такое же, как и несжатое содержимое.Eureka
клиент иEureka
Серверы могут обмениваться данными в формате JSON/XML. по умолчаниюEureka
Клиент использует сжатиеJSON
формат, чтобы получить информацию о списке регистрации.
В сочетании с промежуточным пониманием: арендаторы (потребителиEureka Client Consumer
) идем к посреднику (серверуEureka Server
), чтобы получить список всей информации о жилье (список клиентовEureka Client List
), а арендатор регулярно запрашивает посредника (серверEureka Server
), чтобы получить и обновить там локальный список.
Сервис не в сети Отменить:
Официальное объяснение: клиент Eureka отправляет запрос на отмену на сервер Eureka, когда программа закрывается. После отправки запроса информация об экземпляре клиента удаляется из реестра экземпляров сервера. Этот запрос на выход не выполняется автоматически, он должен вызвать следующее:DiscoveryManager.getInstance().shutdownComponent();
В сочетании с пониманием посредника: арендодатель (поставщикEureka Client Provider
) сообщает посреднику (серверуEureka Server
) Мой дом больше не сдается, и агент удаляет зарегистрированный дом из списка.
Услуга Ликвидация Выселение:
Официальное объяснение: по умолчаниюКогда клиент Eureka не отправляет обновление службы на сервер Eureka в течение 90 секунд подряд (3 периода обновления), то есть пульс, сервер Eureka удалит экземпляр службы из списка регистрации службы., то есть отбраковка услуг.
В сочетании с промежуточным пониманием: арендодатель (поставщикEureka Client Provider
) будет периодически связываться с посредником (серверомEureka Server
) сказать ему, что мой дом все еще сдается (продление), если агент (серверEureka Server
) давно не получал информацию от провайдера, то агент заберет информацию о его жилье с полки (удаление услуги).
НижеNetflix
официально даноEureka
Вы обнаружите, что на архитектурной диаграмме она ничем не отличается от промежуточной диаграммы, которую мы нарисовали ранее.
Конечно, есть много компонентов, которые могут выступать в качестве службы обнаружения:Zookeeper
,Consul
,Eureka
Ждать.
больше оEureka
Знания (самозащита, стратегия первоначальной регистрации и т.д.) можно посмотреть на официальном сайте самостоятельно, или ознакомиться с другой моей статьейГлубокое понимание Эврики.
Лента для балансировки нагрузки
Что такое RestTemplate?
не говоряRibbon
Какие? что случилосьRestTemplate
уже? Не волнуйся, просто слушай меня медленно.
Я не слушаю, я не слушаю, я не слушаю 🙉🙉🙉.
Я просто скажу слово!RestTemplate
даSpring
Предоставляет клиентский класс для доступа к службам Http.,как сказать? То есть вызовы между микросервисами используютсяRestTemplate
. Например, когда нашему потребителю B нужно позвонить в службу, предоставляемую провайдером A, нам нужно написать это. Как и мой псевдокод ниже.
@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";
@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
return restTemplate.postForObject(url, request, Boolean.class);
}
Если вас интересует исходный код, вы найдете то, что мы сказали вышеEureka
в рамкерегистр,ПродлитьПодождите, нижний слой используетсяRestTemplate
.
Зачем нужна лента?
Ribbon
даNetflix
Проект балансировки нагрузки с открытым исходным кодом компании представляет собой клиентский/внутрипроцессный балансировщик нагрузки,работать на стороне потребителя.
Возьмем другой 🌰, например, мы разработали систему seckill, но ради всей системыВысокая доступность, нам нужно сделать эту систему кластером, и в это время наши потребители могут иметь несколько методов вызова системы seckill, как показано на следующем рисунке.
Если мы не сделаем некоторыеоперация выравнивания, если мы秒杀系统1
Делайте много звонков, а два других принципиально не запрашивайте, это приведет к秒杀系统1
Crash, а два других становятся марионетками, так зачем же нам все-таки делать кластеры, и в чем смысл нашей высокой доступности?
такRibbon
Появились, обратите внимание на слова, которые мы выделили жирным шрифтом выше -работать на стороне потребителя. Относится,Ribbon
Это балансировщик нагрузки, работающий на стороне потребителя, как показано на рисунке ниже.
Его принцип работыConsumer
После того, как клиент получит список всех сервисов, в еговнутреннийиспользоватьалгоритм балансировки нагрузки, совершать звонки в несколько систем.
Сравнение Nginx и ленты
упомянулбалансировки нагрузкиЯ должен упомянуть знаменитогоNignx
, а иRibbon
Отличие в том, что этоцентрализованныйбалансировщик нагрузки.
Что такое централизованное? Простое пониманиеЦентрализуйте все запросы перед балансировкой нагрузки. Как показано ниже.
Мы видим, чтоNginx
Он получает все запросы на балансировку нагрузки и наRibbon
Другими словами, это балансировка нагрузки на стороне потребителя. Как показано ниже.
Пожалуйста, обрати внимание
Request
расположение, вNginx
В запросе сначала вводится балансировщик нагрузки, а вRibbon
Сначала он запрашивается на клиенте.
Лента несколько алгоритмов балансировки нагрузки
балансировка нагрузки независимо отNginx
все ещеRibbon
Оба нуждаются в поддержке своих алгоритмов, если я правильно помнюNginx
Используются алгоритмы циклического и взвешенного циклического перебора. пока вRibbon
Существует больше алгоритмов планирования балансировки нагрузки, которые используются по умолчанию.RoundRobinRule
Стратегия голосования.
-
RoundRobinRule: Стратегия опроса.
Ribbon
Стратегия по умолчанию. Если после одного раунда опроса не найдено доступныхprovider
, который опрашивает до 10 раундов. Возвращает null, если не найден в конце. - RandomRule: Случайная стратегия, случайный выбор одного из всех доступных провайдеров.
- RetryRule: стратегия повтора. Сначала получите провайдера в соответствии со стратегией RoundRobinRule.Если получить не удалось, попробуйте еще раз в течение указанного срока. Ограничение времени по умолчанию составляет 500 миллисекунд.
🐦🐦🐦 Их намного больше, здесь не все🌰.Самое главное, что вам нужно знать, это алгоритм опроса по умолчанию, и вы можете изменить алгоритм балансировки нагрузки по умолчанию, просто внеся изменения в файл конфигурации.
providerName:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
Конечно, вRibbon
вы также можетеПользовательский алгоритм балансировки нагрузки, вам просто нужно реализоватьIRule
интерфейс, а затем изменить файл конфигурации или настроитьJava Config
своего рода.
Что такое открытый фанфик
имеютEureka
,RestTemplate
,Ribbon
Мы можем 😃 с удовольствием совершать звонки между сервисами, но использоватьRestTemplate
Все равно неудобно, приходится каждый раз делать такой звонок.
@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";
@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
// 是不是太麻烦了???每次都要 url、请求、返回类型的
return restTemplate.postForObject(url, request, Boolean.class);
}
Это вызывает каждый разRestRemplate
изAPI
Это слишком много хлопот, могу ли я сделать что-то вродеВызывать исходный код для совершения звонков между службами?
💡💡💡Умные дети должны были подумать об этом, так что используйтекартаДа, это похоже на сопоставление доменных имен и IP-адресов. Мы можем отобразить код вызываемой службы на сторону потребителя, чтобы мы могли«Бесшовное развитие»Ла.
OpenFeign также работает на стороне потребителя и использует ленту для балансировки нагрузки, поэтому OpenFeign имеет встроенную ленту напрямую.
в импортномOpen Feign
Тогда мы можем с радостью написатьConsumer
конечный код.
// 使用 @FeignClient 注解来指定提供者的名字
@FeignClient(value = "eureka-client-provider")
public interface TestClient {
// 这里一定要注意需要使用的是提供者那端的请求相对路径,这里就相当于映射了
@RequestMapping(value = "/provider/xxx",
method = RequestMethod.POST)
CommonResponse<List<Plan>> getPlans(@RequestBody planGetRequest request);
}
Тогда мыController
можно назвать как раньшеService
Он называется как код слоя.
@RestController
public class TestController {
// 这里就相当于原来自动注入的 Service
@Autowired
private TestClient testClient;
// controller 调用 service 层代码
@RequestMapping(value = "/test", method = RequestMethod.POST)
public CommonResponse<List<Plan>> get(@RequestBody planGetRequest request) {
return testClient.getPlans(request);
}
}
Эфирный Хайстрикс
Что такое автоматический выключатель Hystrix и понижение версии
В распределенной среде неизбежен сбой некоторых из множества зависимостей служб. Hystrix — это библиотека, которая помогает вам контролировать взаимодействие между этими распределенными службами, добавляя логику устойчивости к задержке и отказоустойчивости. Hystrix делает это, изолируя точки доступа между службами, предотвращая каскадные сбои между службами и предоставляя резервные варианты, что повышает общую отказоустойчивость системы.
В целомHystrix
тот, который можетпредохранительипонизить рейтингбиблиотека, с ее помощью можно повысить отказоустойчивость всей системы.
Так что же такое автоматические выключатели и понижение версии? Возьмем еще 🌰, на этот раз вся наша микросервисная система такая. Сервис А звонит сервису Б, а сервис Б звонит сервису С, но по какой-то причине сервис С больше не выдерживает, в это время в сервисе С будет заблокировано большое количество запросов.
Ничего страшного, что служба C заблокирована, в конце концов, это просто системный сбой. Но обратите внимание, что в настоящее время, поскольку служба C не может вернуть ответ, будет заблокирован запрос службы B на вызов службы C. Точно так же, если служба B заблокирована, служба A также заблокируется и выйдет из строя.
Обратите внимание, почему происходит сбой блокировки. Потому что эти запросы будут потреблять ресурсы, такие как потоки, ввод-вывод и т. д., которые занимают систему, и ваш системный сервер рухнет после их использования.
это называетсяСервис Лавина. Мама, два верхнихпредохранительипонизить рейтингВы мне толком не объяснили, о чем вы сейчас?Сервис Лавина? 😵😵😵
Не волнуйся, слушай меня медленно.
Если ты не слушаешь меня, ты должен продолжать!
так называемыйпредохранительЭто эффективное решение для сервисной лавины. Когда частота отказов запросов в указанном временном окне достигает установленного порога, система проходитвыключательНапрямую отключите эту ссылку запроса.
То есть, когда служба B вызывает службу C, указанную выше, частота отказов вызова достигает определенного значения в течение указанного временного окна, затемHystrix
Все запросы между сервисами B и C будут автоматически прерваны, чтобы избежать лавины сервисов.
Собственно, что здесь сказанопредохранительозначаетHystrix
серединасхема автоматического выключателя, вы можете использовать простой@HystrixCommand
Аннотация для обозначения метода, чтобыHystrix
буду использоватьвыключательЧтобы «обернуть» этот метод, автоматический выключатель прерывает вызов этого метода всякий раз, когда время вызова превышает указанное время (по умолчанию 1000 мс).
Конечно, вы можете установить многие свойства этой аннотации, например, установить период тайм-аута, вот так.
@HystrixCommand(
commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")}
)
public List<Xxx> getXxxx() {
// ...省略代码逻辑
}
Однако я проверил несколько блогов и обнаружил, что все онипредохранительипонизить рейтингПонятие запутанное, в моем понимании,Понижение предназначено для лучшего взаимодействия с пользователем, когда вызов метода является ненормальным, путем выполнения другой логики кода, чтобы дать удобный ответ.. Это также соответствуетHystrix
изрезервная обработкамодель. Вы можете установитьfallbackMethod
чтобы настроить альтернативную логику кода для метода. Например, когда в это время появляется горячая новость, мы рекомендуем ее пользователю для просмотра деталей, а затем пользователь будет запрашивать подробности новости через идентификатор, но поскольку эта новость слишком популярна (например, что это *легко в последнее время), большое количество пользователей одновременного доступа может привести к сбою системы, тогда мы продолжимпонижение уровня обслуживания, некоторые запросы будут понижены, например, текущее количество людей слишком велико, проверьте позже и т. д.
// 指定了后备方法调用
@HystrixCommand(fallbackMethod = "getHystrixNews")
@GetMapping("/get/news")
public News getNews(@PathVariable("id") int id) {
// 调用新闻系统的获取新闻api 代码逻辑省略
}
//
public News getHystrixNews(@PathVariable("id") int id) {
// 做服务降级
// 返回当前人数太多,请稍后查看
}
Что осталось от Hystrix
Когда я читал книгу «Микросервисы Spring в действии», я также наткнулся нарежим переборкиКонцепция чего-либо. Без использования режима переборки служба A вызывает службу B, которая по умолчаниюиспользовать один и тот же пакет потоков для выполнения, а когда у службы возникают проблемы с производительностью, все потоки будут сбрасываться и ожидать обработки, а новые запросы будут одновременно блокироваться, что в конечном итоге приведет к сбою программы. В то время как режим переборки изолирует вызовы удаленных ресурсов в их собственном пуле потоков, чтобы можно было управлять одной неэффективной службой без сбоя программы.
Конкретный принцип рекомендую вам понять самому.режим переборкиНе объясняй слишком много. Есть конечноHystrix
приборная доска,этодля мониторинга в режиме реального времениHystrix
информация по различным показателям, этот вопрос я тоже закину сюда, надеюсь, если вы не поняли, то можете сами поискать.
Шлюз микросервисов — Zuul
ZUUL — это входная дверь для всех запросов от устройств и веб-сайтов к серверной части потокового приложения Netflix. В качестве пограничного сервисного приложения ZUUL создан для динамической маршрутизации, мониторинга, отказоустойчивости и безопасности. Он также имеет возможность направлять запросы в несколько групп Amazon Auto Scaling Group в зависимости от ситуации.
Выше мы узналиEureka
Тогда мы знаемпоставщики услугдапотребительпройти черезEureka Server
доступ, т.е.Eureka Server
дапоставщики услугединый вход. Тогда их так много во всем приложениипотребительПользователю нужно позвонить, как пользователю получить доступ к этимпотребительская инженерияШерстяная ткань? Конечно, к этим проектам можно получить прямой доступ, как и раньше. Но этот метод не имеет единой записи вызова проекта-потребителя, к которой неудобно обращаться и управлять, а Zuul является такой дляпотребительединый вход.
Если вы изучили внешний интерфейс, вы должны знать Router, например маршрутизацию во Flutter, маршрутизацию в Vue и React.С Zuul вы обнаружите, что функции маршрутизации и маршрутизация конфигурации внешнего интерфейса в основном одинаковы. 😁 Иногда я щелкаю Flutter.
Шлюз должен быть знаком каждому, если коротко, то шлюз — это единственный внешний вход в систему между клиентом и сервером и используется для обработки запросов.Аутентификация,Ограничение,маршрутизация,монитори другие функции.
Да, у шлюза есть функции,Zuul
В основном есть. иZuul
Самое главноеМаршрутизация и фильтры, в официальной документацииZuul
название
Router and Filter : Zuul
Возможности маршрутизации Zuul
Простая конфигурация
Изначально я хотел скопировать для вас некоторый код, но, подумав об этом, поскольку конфигурация каждого кода относительно разбросана и выглядит относительно разрозненно, я решил нарисовать для вас картинку для пояснения.
Пожалуйста, не голосуйте за меня только потому, что я такой хороший 👍 . Сумасшедшие намеки.
Например, в это время у насEureka Server
зарегистрированы дваConsumer
, триProvicer
, на этот раз мы добавляемZuul
Шлюз должен выглядеть так.
эммм, объем информации немного велик, позвольте мне объяснить. Я не буду объяснять предыдущие знания 😐 .
Во-первых,Zuul
нужноEureka
Каковы преимущества регистрации?
ты глупыйConsumer
все дляEureka Server
После регистрации мой шлюз сможет получить их все, просто зарегистрировавшись?Consumer
Информация?
Какая польза от наличия информации?
я получил информацию могу ли я получить всеConsumer
метаданные (имя, ip, порт)?
Какая польза от наличия этих метаданных? Можем ли мы сделать это напрямуюКарта маршрута? Например, исходный пользователь звонитConsumer1
Интерфейсlocalhost:8001/studentInfo/update
Можем ли мы назвать этот запрос так?localhost:9000/consumer1/studentInfo/update
Шерстяная ткань? Ты вдруг понял это?
URL-адрес здесь не использует спокойный стиль, чтобы его было легче понять большему количеству людей.
Вы понимаете вышесказанное, тогда вы можете понять оZuul
Самая базовая конфигурация смотри ниже.
server:
port: 9000
eureka:
client:
service-url:
# 这里只要注册 Eureka 就行了
defaultZone: http://localhost:9997/eureka
Затем добавьте его в класс запуска@EnableZuulProxy
Просто аннотируйте. Да всё просто 😃.
единый префикс
Это очень просто, то есть мы можем добавить впереди юниформ-префикс, например, то, что мы только что назвали, этоlocalhost:9000/consumer1/studentInfo/update
, в это время мыyaml
Добавьте следующее в файл конфигурации.
zuul:
prefix: /zuul
Итак, нам нужно пройтиlocalhost:9000/zuul/consumer1/studentInfo/update
посещать.
Конфигурация политики маршрутизации
Вы обнаружите, что предыдущий метод доступа (непосредственное использование имени службы) требует раскрытия имени микрослужбы пользователю, что вызовет проблемы с безопасностью. Следовательно, вы можете настроить путь для замены имени микросервиса, то есть настроить стратегию маршрутизации.
zuul:
routes:
consumer1: /FrancisQ1/**
consumer2: /FrancisQ2/**
В этот момент вы можете использоватьlocalhost:9000/zuul/FrancisQ1/studentInfo/update
посетил.
маскировка имени службы
На данный момент не думайте, что вы хороши. Вы можете попробовать. После того, как вы настроите политику маршрутизации, вы по-прежнему сможете получить к ней доступ, используя имя микрослужбы. В настоящее время вам нужно заблокировать имя службы.
zuul:
ignore-services: "*"
экранирование пути
Zuul
Вы также можете указать URI заблокированного пути, то есть, пока запрос пользователя содержит указанный путь URI, запрос не сможет получить доступ к указанной службе. Таким образом, полномочия пользователя могут быть ограничены.
zuul:
ignore-patterns: **/auto/**
Таким образом, мы можем отфильтровать запросы на auto.
** Представляет совпадающие многоуровневые произвольные пути
* представляет собой сопоставление произвольного пути первого уровня
Маскировка заголовка конфиденциального запроса
По умолчанию конфиденциальная информация заголовка запроса, такая как Cookie и Set-Cookie, будет заблокирована zuul. Мы можем удалить эту блокировку по умолчанию и, конечно, мы также можем добавить заголовки запроса, которые будут заблокированы.
Возможности фильтрации Zuul
Если сказать, функция маршрутизацииZuul
, тогдафильтрэтоZuul
оружие. Ведь все запросы идут через шлюз (Zuul), далее мы можем делать различные фильтры, таким образом мы можем добитьсяОграничение,выпуск оттенков серого,Контроль доступаи Т. Д.
Простая реализация печати журнала времени запроса
реализовывать самоопределяемыеFilter
Нам просто нужно унаследоватьZuulFilter
Затем замените этот класс фильтра на@Component
Аннотации добавляются в контейнер Spring.
Прежде чем я покажу вам код, позвольте мне объяснить вам некоторые предостережения о фильтрах.
Тип фильтра: Pre, Routing, Post. Pre-pre — это фильтр перед запросом, Routing routing filter — это стратегия маршрутизации, о которой мы упоминали выше, а Post-post-filter находится вResponse
Фильтр, который выполнял фильтрацию раньше. Вы можете наблюдать эту картину в сочетании с пониманием, и я дам соответствующие комментарии ниже.
// 加入Spring容器
@Component
public class PreRequestFilter extends ZuulFilter {
// 返回过滤器类型 这里是前置过滤器
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
// 指定过滤顺序 越小越先执行,这里第一个执行
// 当然不是只真正第一个 在Zuul内置中有其他过滤器会先执行
// 那是写死的 比如 SERVLET_DETECTION_FILTER_ORDER = -3
@Override
public int filterOrder() {
return 0;
}
// 什么时候该进行过滤
// 这里我们可以进行一些判断,这样我们就可以过滤掉一些不符合规定的请求等等
@Override
public boolean shouldFilter() {
return true;
}
// 如果过滤器允许通过则怎么进行处理
@Override
public Object run() throws ZuulException {
// 这里我设置了全局的RequestContext并记录了请求开始时间
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set("startTime", System.currentTimeMillis());
return null;
}
}
// lombok的日志
@Slf4j
// 加入 Spring 容器
@Component
public class AccessLogFilter extends ZuulFilter {
// 指定该过滤器的过滤类型
// 此时是后置过滤器
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
// SEND_RESPONSE_FILTER_ORDER 是最后一个过滤器
// 我们此过滤器在它之前执行
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
// 过滤时执行的策略
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
// 从RequestContext获取原先的开始时间 并通过它计算整个时间间隔
Long startTime = (Long) context.get("startTime");
// 这里我可以获取HttpServletRequest来获取URI并且打印出来
String uri = request.getRequestURI();
long duration = System.currentTimeMillis() - startTime;
log.info("uri: " + uri + ", duration: " + duration / 100 + "ms");
return null;
}
}
Вышеупомянутое просто реализует функцию печати журнала времени запроса.Вы чувствовали это?Zuul
Насколько эффективна функция фильтрации?
нет? Хорошо, давай еще.
Текущий лимит корзины токенов
Конечно, это не только метод ограничения тока корзины токенов,Zuul
Пока это работа с ограничением по току, она может это сделать, здесь я просто даю простую 🌰.
Позвольте мне сначала объяснить, что такоеТекущий лимит корзины токеновБар.
Сначала у нас будет ведро, если оно не полное то будемфиксированная ставкаВ него будет помещен токен.При приходе запроса необходимо сначала получить токен из ведра.Если он не получен, то запрос будет отклонен, а если получен, то освобожден. Все просто, ахаха,
Ниже мы проходимZuul
Предварительный фильтр для реализации ограничения текущего сегмента токенов.
@Component
@Slf4j
public class RouteFilter extends ZuulFilter {
// 定义一个令牌桶,每秒产生2个令牌,即每秒最多处理2个请求
private static final RateLimiter RATE_LIMITER = RateLimiter.create(2);
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return -5;
}
@Override
public Object run() throws ZuulException {
log.info("放行");
return null;
}
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
if(!RATE_LIMITER.tryAcquire()) {
log.warn("访问量超载");
// 指定当前请求未通过过滤
context.setSendZuulResponse(false);
// 向客户端返回响应码429,请求数量过多
context.setResponseStatusCode(429);
return false;
}
return true;
}
}
Так что мы можем ограничить количество запросов до двух в секунду, вам не кажется, что это круто?
Другое о Зууле
Zuul
Функция фильтра определенно больше, чем две, которые я реализовал выше, он также может достигатьпроверка разрешений, в том числе те, о которых я упоминал вышевыпуск оттенков серогои Т. Д.
Конечно,Zuul
Как шлюз конечно тоже существуетпроблема с одной точкой, если мы хотим гарантироватьZuul
высокая доступность, нам нужноZuul
Конфигурация кластера, на этот раз вы можете использовать некоторые дополнительные балансировщики нагрузки, такие какNginx
.
Управление конфигурацией Spring Cloud — Конфигурация
Зачем использовать его для управления конфигурацией?
Когда наша микросервисная система начинает медленно расти, так многоConsumer
,Provider
,Eureka Server
,Zuul
Система будет иметь свою конфигурацию.В это время нам может понадобиться изменить конфигурацию некоторых приложений при работе проекта.Если мы не будем вести единое управление конфигурацией, мы можем толькоПерейдите к каждому приложению, чтобы найти файл конфигурации один за другим, затем измените файл конфигурации и перезапустите приложение..
Прежде всего, для распределенной системы мы не должны ходить к каждому приложению для изменения файла конфигурации отдельно, а для перезапуска приложения к сервису нет доступа, поэтому доступность напрямую заброшена, что мы еще более неохотно видим .
Так есть способМожно ли единообразно управлять файлом конфигурации и можно ли динамически изменять файл конфигурации во время работы проекта?
Это то, что я собираюсь представить сегодняSpring Cloud Config
.
Фреймворки, обеспечивающие управление конфигурацией, более чем
Spring Cloud Config
Один вы можете выбрать в соответствии с вашими потребностями (disconf, Apollo и т. д.). и дляConfig
В некоторых местах это не так удовлетворительно.
Что такое конфигурация
Spring Cloud Config
Обеспечивает поддержку сервера и клиента для внешней конфигурации в распределенных системах. использоватьConfig
Сервер, который централизованно управляет внешними свойствами приложений во всех средах.
Проще говоря,Spring Cloud Config
То есть файлы конфигурации каждого приложения/системы/модуля могут храниться вединое место, а затем управляемое(Git или SVN).
Подумайте, будет ли наше приложение загружать файл конфигурации только при запуске, тогда наше приложениеSpring Cloud Config
Он предоставляет интерфейс для запуска приложения для получения нужного файла конфигурации, а приложение получает файл конфигурации, а затем выполняет свою инициализацию. Так же, как на картинке ниже.
Конечно, тут у вас должен возникнуть вопрос.Если я изменю соответствующий файл конфигурации в удаленном репозитории конфигурации (Git) во время работы приложения, будет ли запущенное приложение, которое зависит от этого файла конфигурации, изменить свою соответствующую конфигурацию?
Ответ - нет.
Какие? Итак, как динамически изменять файл конфигурации? это не появилосьДрейф конфигурации? Ты подонок 🤬, ты опять мне наврал!
Не волнуйтесь, вы можете использоватьWebhooks
,Этоgithub
Предоставляет функцию, которая обеспечивает обновление сведений о конфигурации в клиенте после обновления файла конфигурации удаленной библиотеки.
О, это примерно то же самое. Я проверю, как его использовать.
подожди, послушай меня,Webhooks
Хотя ее можно решить, вы обнаружите, что она вообще не подходит для производственных сред, поэтому в основном не используется.
И вообще мы будем использоватьBus
шина сообщений +Spring Cloud Config
Выполните динамическое обновление конфигурации.
Представляем Spring Cloud Bus
Шина событий для связи служб и экземпляров служб с распределенной системой обмена сообщениями. Полезно для распространения изменений состояния по всему кластеру (например, событий изменения конфигурации).
Вы можете просто понять какSpring Cloud Bus
рольУправление и передача сообщений в распределенных системах, который является широковещательным режимом в системе механизма сообщений. Конечно какшина сообщенийизSpring Cloud Bus
Может делать гораздо больше, чем просто функция обновления конфигурации на стороне клиента.
и имеютSpring Cloud Bus
После этого нам просто нужно создать простой запрос и добавить@ResfreshScope
Аннотации можно использовать для динамического изменения конфигурации.Ниже я нарисовал картинку для вашего понимания.
Суммировать
В этой статье я дам вам предварительное представление оSpring Cloud
различных компонентов, они имеют
- Фреймворк обнаружения сервисов Eureka
- Лента In-Process Load Balancer
- Сопоставление вызовов службы Open Feign
- Автоматический выключатель для понижения сервисного обслуживания Hystrix
- Шлюз микросервисов Zuul
- Единый центр конфигурации микросервиса Config
- Шина сообщений шины
Если вы можете понять изображение ниже в это время, это означает, что выSpring Cloud
Микросервисы имеют определенное архитектурное понимание.
Если вы считаете, что я пишу неплохо, то ставьте лайк! 👍👍👍