Prefácio: A arquitetura de microsserviços inevitavelmente possui várias instâncias de um único microsserviço. Então, como o cliente pode alocar solicitações a instâncias de vários microsserviços? Aqui precisamos usar o balanceamento de carga
1. Introdução à fita
A fita é um balanceador de carga liberado pela Netflix, que ajuda a controlar o comportamento dos clientes HTTP e TCP. Depois de configurar a lista de endereços do provedor de serviços para fita, a fita pode ajudar automaticamente a serviço dos consumidores a solicitar com base em algum algoritmo de balanceamento de carga. A fita nos fornece muitos algoritmos de balanceamento de carga por padrão, como pesquisa, aleatoriedade etc., que também podem ser personalizados;
Ribbon's Github: https://github.com/netflix/ribbon
Ao usar o Ribbon e o Eureka em Springcloud, a Ribbon obterá automaticamente a lista de endereços do provedor de serviços do Eurekaserver e com base no algoritmo de balanceamento de carga.
2. Combate real da fita
1. Crie Eurekaserver, Eurekaclient1, Eurekaclient2. Eu mencionei o uso de Eureka antes, então aqui está o código:
Eurekaserver:
ServerApplication.java
@Springbootapplication@enableeurekaserverpublic class ServerApplication {public static void main (string [] args) {springappplication.run (serverapplication.class, args); }}pom.xml
<? xml versão = "1.0" coding = "utf-8"?> <Projeto xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.ww3.org/2001/xmlschaMance xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <lodelVersion> 4.0.0 </modelVersion> <vroupId> com.cn </groupid> </ArtifactId> Eureka-Ribbon-Server </starfactId> <versão> 1.0-snapshot </siers> <Perts> <Project.build.sourceEncoding> utf-8 </project.build.sourcencoding> <nava.version> 1.8 </java.versersion> <nava.verers> </java.vertshsion> <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 </frupid> <TRATIFACTID> Spring-cloud-starter-eureka-server </ArtifactId> </pendendicy> </dependency> </dependency> </dependency> <pendencyManagement> <pendencie> <pendency> <puadeid> org.springframework.clorging.Clordens.Clorenging.Clordenha <Depency> <Pendency> <pusency> <vringFame> <EpendencyManagement> <pendencie> <Pusency> <voupid> ou <vringFame> <TarifactId> Dependências de mola-cloud </stutifactId> <versão> edgware.sr3 </version> <type> pom </type> <cope> importar </scope> </dependency> </dependency> </dependencyManagement> <!-add spring-boot plugin-> <bump> <clugins> <lugin> <flgin> <! <TarifactId> Spring-boot-maven-plugin </stifactId> </flugin> </plugins> </fruct> </project>
Application.Properties
Server.port = 8761#Nota: Essas duas configurações são verdadeiras por padrão. Você deve mudar para False, caso contrário, um erro será relatado. Connot Connect Server# indica se deve se registrar no eurekaserver eureka.client.register-with-eureka = false# indica se a obtenção de informações de registro do eurekaserver eureka.client.fetch-registry = falseureka.client.Service-url.DeFaultZONE = Http: // Fliência do Fliente.7
Eurekaclient1:
pom.xml
<? xml versão = "1.0" coding = "utf-8"?> <Projeto xmlns = "http://maven.apache.org/pom/4.0.0" xmlns: xsi = "http://www.ww3.org/2001/xmlschaMance xsi: schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <lodelVersion> 4.0.0 </modelVersion> <vroupId> com.cn </groupid> artshversion> </Modelversion> <voundId> com.cn </groupid> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> </ArtifactId> Spring-Boot-Starter-Parent </ArtifactId> <Versão> 1.5.13.Release </siers> </parent> <pendências> <pendesency> <puperid> org.springframework.cloud </purpyid> <Tarfactid> Spring-starter-ribbon </ArtifactId> </Dependência> </pumid> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependency> </dependency> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <versão> edgware.sr3 </version> <type> pom </pype> <cope> importar </cope> </dependency> </dependency> </dependencyManagement> <!-adicione plugin maven spring-boot-> <bilt> <lamp> <TarifactId> Spring-boot-maven-plugin </stifactId> </flugin> </plugins> </fruct> </project>
server.port = 8762spring.application.name = client-8762eureka.client.service-url.defaultzone = http: // localhost: 8761/eureka/
Adicione a instância de chamada remota RestTemplate ao contêiner na classe de inicialização e adicione a anotação do LoadBalanced para fazer Resttemplate ter a capacidade de carregar o balanceamento:
@SpringbooTApplication@EnablediscoveryclientPublic Class ClientApplication {public static void main (string [] args) {springapplication.run (clientApplication.class, args); }/** * @Description: Adicionando a anotação @loadBalanced para adicionar recursos de balanceamento de carga ao Resttemplate * @param: * @return: * @author: * @Date: 2018/6/15 */@Bean @loadBalanced public Resttemplate getRestTemplate () {return New RestTemplate (); }}Crie um controlador, injetar instâncias RestTemplate e LoadBalancerclient:
pacote com.cn.controller; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.cloud.client.serviceInstance; importação de importação.springframework.cloud.client.loadBaller.loadSerTerTerTerTerCer.springFramework.cloud.client.load.loadMerTerCerTerTerCer.SPRING.SPRING.SPRERG.SPRING.SPRING.SPRING.CLIENT.CLIENT.LOLLANCER.BALLERTALTERCIMENTE; org.springframework.web.bind.annotation.getMapping; importar org.springframework.web.bind.annotation.Responsebody; importar org.springframework.web.client.resttemplate;/** ** @PRORMOW: Springcloud-expler *Desscrintr: 15:55 **/ @controlerpublic classe ribbonController {@AUTOWIRED PRIVADO LOADBALANCERCLIENT LOADBALANCERCLIENT; @Autowired Private Resttemplate Resttemplate; @GetMapping ("/loadInstance") @ResponseBody public String loadInstance () {ServiceInstance escolha = this.loadBalancerclient.choose ("Client-87"); System.out.println (escolha.getServiceId ()+":"+escolha.gethost ()+":"+escolha.getport ()); Retornar escolha.getServiceId () + ":" + escolha.gethost () + ":" + escolha.getport (); }} pacote com.cn; importar org.springframework.boot.springApplication; importar org.springframework.boot.autoconfigure.springbootapplication; importação @ScringFramework.Client.Client.Discovery.en-Enabildiscoverclient;/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *ia 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 é consistente com eurekaclient1
Application.xml:
server.port = 8763spring.application.name = client-87eureka.client.service-url.defaultZone = http: // localhost: 8761/eureka
Clientcontroller.java:
pacote com.cn.contorller; importar org.springframework.steretype.controller; importar org.springframework.web.bind.annotation.getMapping; import org.springframework.web.bind.annotation.Response; 2018-06-15 16:12 **/ @ControllerPublic Class ClientController {@GetMapping ("/getUser") @ResponseBody public String getUser () {System.out.println ("Obtenha o usuário bem-sucedido"); retornar "Obtenha o usuário bem -sucedido"; }}2. Sequência de inicialização:
①. Iniciar Eurekaserver =》 Eurekaclient1 =》 Eurekaclient2;
②. Em seguida, altere o server.port = 8763 do aplicativo.properties em Eurekaclient2 para server.port = 8764 e inicie o projeto novamente;
③. Abra a página de configuração Eurekaserver (http: // localhost: 8761/), como segue:
④. Entramos http: // localhost: 8762/loadInstance na barra de endereços e atualize -o algumas vezes. Você descobrirá que as instâncias da porta são diferentes cada vez que chamamos, como mostra a figura abaixo:
⑤. Estamos olhando para o console, como mostrado na imagem:
Neste ponto, a fita já começou. Não é muito simples? Mas essa é apenas a aplicação mais simples, e é uma perda de tempo ... não há fim para aprender!
Código de exemplo: https://gitee.com/lfalex/springcloud-example