1: O que é fita?
A fita é um projeto de código aberto lançado pela Netflix. Sua principal função é fornecer algoritmos de balanceamento de carga do software do lado do cliente para conectar os serviços de camada média da Netflix. O componente do cliente da faixa de opções fornece uma série de itens de configuração completos, como tempo limite de conexão, repetição, etc. Simplificando, é para listar todas as máquinas por trás do balanceador de carga (lb para curta) no arquivo de configuração. A fita ajudará você a conectar automaticamente essas máquinas com base em determinadas regras (como pesquisa simples, conexão instantânea etc.). Também temos uma maneira muito fácil de implementar algoritmos de balanceamento de carga personalizados usando fita.
Dois: Classificação do esquema LB
Atualmente, o esquema LB convencional pode ser dividido em duas categorias: um é o LB centralizado, ou seja, usar instalações independentes de LB (pode ser hardware, como F5 ou software, como o NGINX) entre o consumidor de serviço e o provedor, e a instalação é responsável por encaminhar solicitações de acesso ao provedor de serviços através de uma determinada política; O outro é o LB em processo, que integra a lógica LB ao consumidor, e o consumidor sabe do Centro de Registro de Serviço que os endereços estão disponíveis e, em seguida, seleciona um servidor adequado desses endereços. A fita pertence a este último. É apenas uma biblioteca de classes integrada ao processo do consumidor. Por meio disso, os consumidores obtêm o endereço do provedor de serviços.
Três: os principais componentes da Ribbon e fluxo de trabalho
Os componentes principais da Ribbon (todos os tipos de interface) têm o seguinte:
Serverlist
Usado para obter a lista de endereços. Pode ser estático (fornecendo um conjunto fixo de endereços) ou dinâmico (consulta recorrente para listas de endereços do registro).
ServerListFilter
Somente usado ao usar o Dynamic ServerList, ele é usado para usar certas políticas na lista de serviços originais para considerar alguns endereços.
Irule
Selecione um endereço de serviço final como resultado do LB. As políticas selecionadas incluem pesquisas, ponderação com base no tempo de resposta, disjuntor (quando hystrix estiver disponível), etc.
Quando o Ribbon funciona, é preferido usar o ServerList para obter todas as listas de serviços disponíveis e, em seguida, usar o ServerListFilter para considerar alguns dos endereços e, finalmente, selecionar um servidor nos endereços restantes através do Irule como resultado final.
Quatro: Introdução às principais estratégias de balanceamento de carga fornecidas por fita
1: Balanceamento de carga de votação simples (Roundrobin)
As solicitações são agendadas, por sua vez, de maneira pesquisada, ou seja, cada cronograma é executado i = (i + 1) mod n e o I-és é selecionado.
2: Balanceamento de carga aleatória (aleatória)
Selecione aleatoriamente servidor com status UP
3: Balanceamento de carga PonderedResponseTime (PondedResponseTime)
Um peso é alocado de acordo com o tempo correspondente. Quanto mais tempo o tempo correspondente, menor o peso e menor a possibilidade de ser selecionado.
4: Zoneavoidancerule
Determine de forma abrangente o desempenho da área do servidor e o servidor de seleção de disponibilidade do servidor
Comparação das próprias estratégias de balanceamento de carga da Ribbon
| Nome da estratégia | Declaração de política | Descrição da política | Instruções de implementação |
| BestavailableLeRule | Classe pública bestavailableLeleLea | Selecione um servidor com a menor solicitação simultânea | Verifique o servidor um por um. Se o servidor estiver disparado, ignore -o. Selecione o servidor com o menor ActiveReQuestScount |
| Disponibilidade FilteringRule | Disponibilidade de classe pública FilteringRule estende o PredicateBasedRule | Filtre os servidores de back -end marcados como circuito tropeçam devido à falha da conexão e filtre os servidores de back -end com alta concorrência (as conexões ativas excedem o limite configurado) | Usando um prevédico de disponibilidade para incluir a lógica dos servidores de filtragem é realmente verificar o status de execução de cada servidor gravado no status |
| PondedResponsetimerule | Public Class PonderedResponsetimerule estende RoundRobinRule | Um peso é alocado de acordo com o tempo correspondente. Quanto mais tempo o tempo correspondente, menor o peso e menor a possibilidade de ser selecionado. | Um tópico de segundo plano lê regularmente o tempo de resposta da avaliação do status e calcula um peso para cada servidor. O cálculo do peso também é relativamente simples. ResponseTime menos o tempo médio de resposta de cada servidor é o peso do servidor. Quando o status for iniciado e nenhuma estatística for formada, use a política Roubine para selecionar o servidor. |
| Repretílula | A repetição de classe pública estende abstrumloadbalancerrure | Represente o mecanismo na máquina para a política de balanceamento de carga selecionada. | Durante um período de configuração, quando a seleção do servidor não tiver êxito, você continua tentando selecionar um servidor disponível usando a subrua |
| RoundRobinRule | Classe Pública RoundRobinRule estende abstractloadBalancerrure | Roundrobin Method Polling para selecionar servidor | Índice de pesquisa e selecione o servidor correspondente ao índice |
| Randomrule | Randomrule de classe pública estende abstrumloadbalancerrure | Selecione aleatoriamente um servidor | Aleatoriamente no índice, selecione o servidor correspondente à posição do índice |
| ZoneAvoidanceRule | Classe pública ZoneAvoidanceRule estende o PredicateBasedrule | Determine de forma abrangente o desempenho da área do servidor e o servidor de seleção de disponibilidade do servidor | Use ZoneAvooDancePredicate e DisponilabilityPredicate para determinar se um servidor está selecionado. O anterior determina se o desempenho operacional de uma zona está disponível. Exclua zonas indisponíveis (todos os servidores). A disponibilidade é usada para filtrar servidores com muitas conexões. |
5: fita sozinha
Crie um nome do projeto maven ribbon_client
conteúdo de pom
<dependencies> <dependency> <groupId>com.netflix.ribbon</groupId> <artifactId>ribbon-core</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.netflix.ribbon</groupId> <artifactId>ribbon-httpclient</artifactId> <version>2.2.0</version> </dependency> </dependências>
Arquivo de configuração do Sample-Client.Properties
# Número máximo de tentativas de amostra-client.ribbon.maxautores = 1# número máximo dos próximos servidores para repetir (excluir o primeiro servidor) amostra-client.ribbon.maxaUtoretriesNextServer = 1# se todas as operações podem ser recuperadas para este cliente de amostra. Sample-client.ribbon.ServerlistReFreshInterVal = 2000# Conecte o tempo limite usado por Apache httpclient sample-client.ribbon.connectTimeout = 3000# LEIA Timeout usada por Apache HttpClient sample-client.Ribbon.readtimeout = 3000# Lista inicial de servidores, pode ser alterada via Archaius dinâmica sample-client.ribbon.listofServers = www.sohu.com: 80, www.163.com: 80, www.sina.com.cn: 80sample-lient.ribbon.enableprimeConnections = true
Código RibbonMain
importar java.net.uri; importar com.netflix.client.clientFactory; importar com.netflix.client.http.httprequest; importar com.netflix.client.htttp.httpResponse; importação com.netflix.config.config.configManager; com.netflix.loadbalancer.zoneawareloadbalancer; importação com.netflix.niws.client.http.restclient; public class ribbonmain {public static void main (string [] args) lança excepção {ConfigurationMager.RoTroPropertiesFromFromRResources (sample-climes) System.out.println (ConfigurationManager.getConfigInstance (). GetProperty ("Sample-client.ribbon.ListofServers")); RestClient Client = (RestClient) clientFactory.getNamedClient ("Sample-Client"); Solicitação httprequest = httprequest.newbuilder (). URI (novo URI ("/")). Build (); for (int i = 0; i <4; i ++) {httproponse Response = client.executeWithLoadBalancer (request); System.out.println ("Status para URI:" + Response.getRequesteduri () + "é:" + Response.getStatus ()); } Zoneawareloadbalancer lb = (zoneawareloadbalancer) client.getLoadBalancer (); System.out.println (lb.getLoadBalancerStats ()); ConfigurationManager.getConfigInstance (). SetProperty ("Sample-client.ribbon.listofServers", "ccblog.cn:80,www.linkedin.com:80"); System.out.println ("Alteração de servidores ..."); Thread.sleep (3000); for (int i = 0; i <3; i ++) {httproponse Response = client.executeWithLoadBalancer (request); System.out.println ("Status para URI:" + Response.getRequesteduri () + "é:" + Response.getStatus ()); } System.out.println (lb.getloadBalancerStats ()); }}Código Parsing
Use o Archaius ConfigurationManager para carregar propriedades;
Use o ClientFactory para criar clientes e carregar balanceadores;
Use o construtor para criar solicitações HTTP. Observe que apenas apoiamos o caminho da parte "/" do URI. Depois que o servidor for selecionado pelo balanceador de carga, o cliente calculará o URI completo;
Chamando a api client.executeWithLoadBalancer () não é a API exeucte ();
Corrigir dinamicamente o pool de servidores na configuração;
Aguarde a lista de servidores atualizar (o intervalo de atualização definido no arquivo de configuração é de 3 segundos);
Imprima as estatísticas do servidor registradas pelo balanceador de carga.
Seis: fita combinada com eureka
Primeiro, comece o projeto Eureka_register_service (Centro de Registro) e Projeto Biz-Service-0 (Produtor de Serviços)
Crie um projeto maven eureka_ribbon_client Este projeto inicia e as configurações relacionadas dependem de Eureka_register_service e Biz-Service-0
pom junção
<Parai> <GrupidId> org.springframework.boot </frugiD> <TRATIFACTID> Spring-Boot-Starter-Parent </stutifactId> <Versão> 1.4.3.Release </sipers> <PelptionalPath/> <!-Looking Parent from Repository-> </parentfl <idenci> <PeroupTy> <proughId> <!-Org. </ArtifactId> Spring-Cloud-Starter-Ribbon </stutifactId> </dependency> <pendence> <puperid> org.springframework.cloud </groupiD> <stifactId> Spring-cloud-starter-eureka </stifactId> </dependência> <Prengid> <voundId> Org.springfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfringfring. </ArtifactId> Spring-Boot-Starter-Web </ArtifactId> </Dependency> <pendency> <puperid> org.springframework.boot </foupid> <stifactId> Spring-Boot-Starter-Test </stifactId> <Cope> Test </scope> </dependência> </dependências> </dependências> </dependências <PuerpId> org.springframework.cloud </frupiD> <ArtifactId> Dependências de mola-cloud </sutifactId> <Version> Brixton.release </sipers
Na classe principal do aplicativo, adicione recursos de serviço de descoberta por meio da anotação @Enablediscoveryclient. Crie uma instância RestTemplate e ative a capacidade de carga de balanceamento por meio da anotação @loadBalanced.
@SpringboOTApplication @EnablediscOveryclientPublic Classe ribbonApplication {@Bean @loadBalanced RestTemplate RestTemplate () {return RestTemplate (); } public static void main (string [] args) {springapplication.run (ribbonApplication.class, args); }}Crie um consumercontroller para consumir o serviço getUser de Biz-Service-0. Chamando o Serviço por Resttemplate diretamente
@RestControllerPublic Classe ConsumController {@AUTOWIRED RESTTEMPLAT RESTTEMPLATE; @RequestMapping (value = "/getUserinfo", método = requestMethod.get) public string add () {return RestTemplate.getForentity ("http: // biz-salervice-0/getUser", string.class) .getbody (); }} Configurar o Centro de Registro de Serviços Eureka em Application.properties
spring.Application.Name = Ribbon-consumerServer.port = 8003eureka.client.serviceurl.DefaultZone = http: // localhost: 8000/eureka/
Após a conclusão, você pode abrir http: // localhost: 8003/getUserinfo para ver os resultados
Resumo: A fita é realmente um componente do cliente de balanceamento de carga suave. Pode ser usado em combinação com outras solicitações necessárias. Combiná -lo com Eureka é apenas um exemplo disso.
Endereço de código: https://github.com/zhp8341/springclouddemo
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.