👉👉👉Рискуя провалить урок, я хочу показать вам вводное резюме Spring Cloud

Java

слова, написанные впереди

Скоро экзамен! ! !

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

Покажи тебе, что я делаю в классе, и ты поймешь, почему я ничего не могу сделать.

上课笔记。。
Заметки о классе. .

эммм, слова некрасивые😑. Я до сих пор помню, что это был урок английского языка, и учитель не разрешал пользоваться электронными устройствами, поэтому я мог только от руки писать идеи своей статьи. . .

Так что, рискуя завалить класс в конце семестра👊, я должен закончить писать эту статью и поделиться своими знаниями со всеми, чтобы я мог просмотреть и понять это сам.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Некоторые из предоставляемых услуг, как мы должны арендовать их дом сейчас.

Но если это только между арендатором и арендодателем, то их эффективность очень низка: арендодатель не может найти арендатора и не может зарабатывать деньги, а арендатор не может найти арендодателя и не может жить в доме. . Таким образом, арендодатель, должно быть, задумал транслировать информацию о своем собственном объявлении (например, разместить небольшие рекламные объявления на улице), чтобы арендодатель выполнил свою задачу (опубликовать объявление), но есть две проблемы. Во-первых, другие люди, не являющиеся арендаторами, могут получать такого рода новости об аренде, которые в реальном мире ничто, но появятся в компьютерном мире.НЧпроблема. Во-вторых, арендатору по-прежнему трудно вас найти.Представьте, что мне нужно снять жилье, а также нужно найти по очереди небольшие объявления на улице.Это хлопотно?

тогда что нам делать? Конечно, мы не будем такими глупыми, первое, что нужно найтипосредникДа, это дает нам место для унификации наших списков, и нам, потребителям, просто нужно зайти на него, чтобы найти его. А арендодателям нужно только опубликовать свои объявления у посредника.

Итак, теперь наш узор такой.

Однако некоторые проблемы все же возникают и в это время.

  1. Что делать, если арендодатель не хочет продавать дом после регистрации? Должны ли мы позволить домовладельцуРегулярно продлевайте? Удаляет ли арендодатель их из регистрационного списка агента, если они не продлеваются?Удалить.
  2. Будет ли арендатор такжерегистрШерстяная ткань? В противном случае, как Сторона Б придет к договору?
  3. Может ли посредниксеть магазиновШерстяная ткань? Если этот один магазин недоступен из-за каких-то форс-мажоров, можем ли мы перейти в другой сетевой магазин?

Ввиду вышеуказанных проблем, давайте перестроим приведенную выше диаграмму шаблона.

Хорошо, после этого 🌰 мы можем посмотреть примерно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Вы обнаружите, что на архитектурной диаграмме она ничем не отличается от промежуточной диаграммы, которую мы нарисовали ранее.

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Делайте много звонков, а два других принципиально не запрашивайте, это приведет к秒杀系统1Crash, а два других становятся марионетками, так зачем же нам все-таки делать кластеры, и в чем смысл нашей высокой доступности?

так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Микросервисы имеют определенное архитектурное понимание.

Если вы считаете, что я пишу неплохо, то ставьте лайк! 👍👍👍