Предисловие: архитектура микросервиса неизбежно имеет несколько экземпляров одного микросервиса. Итак, как клиент может выделить запросы на экземпляры нескольких микросервисов? Здесь нам нужно использовать балансировку нагрузки
1. Введение в ленту
Ribbon - это балансировщик нагрузки, выпущенный Netflix, который помогает контролировать поведение клиентов HTTP и TCP. После настройки списка адресов поставщика услуг для ленты лента может автоматически помочь потребителям обслуживать потребителей на основе некоторого алгоритма балансировки нагрузки. Лента предоставляет нам много алгоритмов балансировки нагрузки по умолчанию, таких как опросы, случайность и т. Д., Которые также можно настроить;
Лента GitHub: https://github.com/netflix/ribbon
При использовании ленты и Eureka в Springcloud лента автоматически получит список адресов поставщика услуг от Eurekaserver и на основе алгоритма балансировки нагрузки.
2. лента фактический бой
1 Создать Eurekaserver, Eurekaclient1, Eurekaclient2. Я уже упоминал об использовании Eureka, так что вот код:
Eurekaserver:
ServerApplication.java
@SpringbootApplication@enableteurekaserverpublic class serverapplication {public static void main (string [] args) {SpringApplication.run (serverApplication.class, args); }}Pom.xml
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <doliderversion> 4.0.0 </modelversion> <groupid> com.cn </GroupId> <ratfactid> eureka-ribbon-server </artifactid> <sersion> 1.0-snapshot </version> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceEncoding> <java.version> 1.8 </java.version> </posterties> <parent> <parent> <parent> <parent> <parent> <parent> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.</groupId> <artifactId></artifactId> </dependency> <dependency> <groupId> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-eureka-server </artifactid> </vehyederian> </depertive> </depertive> </dependency> <dependency management> <dependencies> <dehyed> <groupid> org.sprameword. <ArtifactId> spring-cloud-зависимости </artifactid> <sersion> edgware.sr3 </version> <Тип> pom </type> <crappe> import </scope> </yesletrice> </ytelection> </dependencymanage> <!-Add Spring-boot Maven Plugin-> <buld> <plugind> <groupd> orgpring flugspring. <Artifactid> Spring-boot-maven-plugin </artifactid> </placin> </plugins> </build> </project>
Application.properties
Server.port = 8761#Примечание: эти две конфигурации по умолчанию верны. Вы должны измениться на False, в противном случае будет сообщена ошибка. Connot Connect Server# указывает, следует ли зарегистрироваться на Eurekaserver eureka.client.register-with-eureka = false# указывает, получает ли регистрационная информация от eurekaserver eureka.client.fetch-registr
Eurekaclient1:
Pom.xml
<? xml version = "1.0" Encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <doliderversion> 4.0.0 </modelversion> <groupid> com.cn </GroupId> <StrifactId> eureka-ribbon-client </artifactid> <sersive> 1.0-snapshot </version> <properties> <project.build.sourceencoding> utf-8 </project.build.sourceencoding> <java.version> 1.8 </java> </partyerties> <parent> <parent> <parent> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.13.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupid> org.springframework.cloud </GroupId> <ArtifactId> Spring-Cloud-Starter-eureka </artifactid> </depervice> </depertive> </reding> </depertive> <DependencyManagement> <Depeication> <DepectiOd> <groupid> org.sprameFrameword. <ArtifactId> spring-cloud-зависимости </artifactid> <sersion> edgware.sr3 </version> <Тип> pom </type> <crappe> import </scope> </yesletrice> </ytelection> </dependencymanage> <!-Add Spring-boot Maven Plugin-> <buld> <plugind> <groupd> orgpring flugspring. <Artifactid> Spring-boot-maven-plugin </artifactid> </placin> </plugins> </build> </project>
server.port = 8762spring.application.name = client-8762eureka.client.service-url.defaultzone = http: // localhost: 8761/eureka/
Добавьте экземпляр удаленного вызова Resttemplate в контейнер в классе запуска и добавьте аннотацию LoadBalanced, чтобы RestTemplate имел возможность загружать балансировку:
@SpringBootApplication@enabledIscoveryClientPublic Class ClientApplication {public static void main (string [] args) {SpringApplication.run (clientApplication.class, args); }/** * @description: добавление аннотации @loadbalanced, чтобы добавить возможности балансировки нагрузки в Resttemplate * @param: * @return: * @author: * @date: 2018/6/15 */@bean @loadbalanced public rettemplate getResttemplate () {return newtemplate (); }}Создайте контроллер, инъекцию Resttemplate и LoadBalancerClient экземпляры:
пакет com.cn.controller; import org.springframework.beans.factory.annotation.autowired; импорт org.springframework.cloud.client.serviceinstance; импорт org.springframework.cloud.client.loadbalancer.loadbalanclient; импорт org.springframe.sterpalypoytypoly. org.springframework.web.bind.annotation.getMaping; импорт org.springframework.web.bindation.responsebody; импорт org.springframework.web.client.resttemplate;/** * @progrogram: 5: 5-18 **/ @ControllerPublic Class RibbonController {@Autowired Private LoadBalancerClient LoadBalancerClient; @Autowired private resttemplate resttemplate; @GetMapping ("/loadInstance") @Responsebody public String loadInstance () {serviceInstance select = this.loadbalancerclient.choose ("client-87"); System.out.println (выберите.getServiceId ()+":"+select.gethost ()+":"+select.getport ()); возврат выберите.getServiceId () + ":" + select.gethost () + ":" + select.getport (); }} Пакет com.cn; импорт org.springframework.boot.springapplication; импорт org.springframework.boot.autoconfigure.springbootapplication; импорт org.springframe.cloud.client.discovery.enbablediscleyclient;/** * @prom 535504 *@create: 2018-06-15 16:05 **/@SpringbootApplication@enabledIscoveryClientPublic Class ClientApplication {public static void main (string [] args) {SpringApplication.run (clientApplication.class, args); }}Eurekaclient2:
pom.xml согласуется с eurekaclient1
Application.xml:
server.port = 8763spring.application.name = client-87eureka.client.service-url.defaultzone = http: // localhost: 8761/eureka
ClientController.java:
пакет com.cn.contorller; import org.springframework.steretype.controller; import org.springframework.web.bind.annotation.getMaping; импорт org.springframework.web.bindtation.ResponseBody;/** * @Program: Springcle-example-example. 2018-06-15 16:12 **/ @ControllerPublic Class ClientController {@getMapping ("/getUser") @Responsebody public String getUser () {System.out.println («Получите пользователь успешный»); вернуть "Получите пользователя успешно"; }}2. Спусков запуска:
①. Eurekaserver =》 eurekaclient1 =》 eurekaclient2;
②. Затем изменить server.port = 8763 Application.properties в eurekaclient2 на Server.port = 8764 и снова запустите проект;
③. Откройте страницу конфигурации Eurekaserver (http: // localhost: 8761/), следующим образом:
④. Мы вводим http: // localhost: 8762/loadinstance в адресной панели и обновляем его несколько раз. Вы обнаружите, что экземпляры порта различаются каждый раз, когда мы называем его, как показано на рисунке ниже:
⑤. Мы смотрим на консоли, как показано на картинке:
На этом этапе лента уже началась. Разве это не очень просто? Но это просто самое простое применение, и это пустая трата времени ... нет конца обучению!
Пример кода: https://gitee.com/lfalex/springcloud-example