Introdução
Continuamos a desenvolver o código dos blogs anteriores e adicionar componentes de fita para fornecer balanceamento de carga do cliente. O balanceamento de carga é uma parte importante da obtenção de serviços de alta concorrência, alto desempenho e escalonável. Ele pode distribuir solicitações a diferentes servidores em um cluster para aliviar a carga em cada servidor. O balanceamento de carga do cliente é executado em programas de clientes, como nosso projeto da web, e selecione aleatoriamente um servidor para enviar solicitações, obtendo a lista de endereços IP do cluster. Comparado com o balanceamento de carga do servidor, ele não requer recursos de servidores de consumo.
Ambiente básico
Git: código -fonte do projeto
Atualizar configuração
Desta vez, precisamos iniciar dois programas de serviço de produto localmente para verificar o balanceamento de carga, por isso precisamos fornecer portas diferentes para o segundo programa. A configuração do Centro de Serviço de Configuração da Cloud Spring substituirá as variáveis de ambiente do sistema local por padrão. Precisamos definir a porta do serviço de produto através das variáveis do ambiente do sistema, para que precisemos modificar o arquivo de configuração do serviço de produto no repositório Git Center Git.
Servidor: Porta: 8081Spring: Cloud: Config: Allow-Override: True Subster-System-Properties: False
O valor padrão do alquista é verdadeiro. Eu escrevi para explicar. Isso significa que os itens de configuração do centro de configuração remota podem substituir a configuração local, não que a configuração local possa substituir a configuração remota. É claro que podemos defini -lo como falso, mas para fornecer regras de cobertura mais precisas, o valor padrão é preservado aqui.
Adicionamos o Subster-System-Properties = False, ou seja, embora o arquivo de configuração do centro de configuração remota possa substituir a configuração local, não substitua as variáveis do sistema local. Após a conclusão da modificação, envie -a ao repositório Git.
Além disso, adicione alguns logs ao produto ProductController do Projeto Production Service para verificar se o balanceamento de carga é eficaz:
pacote cn.zxuqian.controllers; importar org.slf4j.logger; importar org.slf4j.loggerFactory; importar org.springframework.web.bind.annotation.requestMapping; importação org.springfRerwork.web.bind.annotation.ReQuestMapping; importação; Log do log estático privado = LoggerFactory.getLogger (ProductController.class); @RequestMapping (" /Products") public String ProductList () {Log.info ("Access To /Products Endpoint"); retornar "casaco, jaqueta, suéter, camiseta"; }}Configure a faixa de opções para a web
Primeiro, adicione as dependências da Ribbon no pom.xml:
<Depencency> <PuerpId> org.springframework.cloud </frugiD> <stifactId> Spring-cloud-starter-Netflix-ribbon </artifactId> </dependency>
Em seguida, modifique a classe de aplicativo e adicione o seguinte código:
@EnableCircuitbreaker@Enablediscoveryclient@ribbonClient (name = "Product-Service")@SpringbooTApplicationPublic Classe Application {public static void main (string [] args) {springapplication.run (Application.class, args); } @Bean @loadBalanced public Resttemplate Rest (RestTemplateBuilder Builder) {return Builder.build (); }} Aqui, usamos a anotação @RibBonClient (name = "Product-Service") para marcar este projeto como um cliente de balanceamento de carga de fita. Ele precisa selecionar um dos clusters de serviço de produto para acessar os serviços necessários. O atributo de nome aqui corresponde ao atributo spring.application.name configurado no projeto ProductService.
A anotação @loadBalanced indica que o RestTemplate será configurado para usar automaticamente o Ribbon LoadBalncerclient para selecionar o URI do serviço e enviar a solicitação.
Adicionamos o seguinte código à classe Products Service:
@ServicePublic Class ProductService {private final Resttemplate Resttemplate; @Autowired Private Discoveryclient Discoveryclient; public ProductsVice (RestTemplate RestTemplate) {this.resttemplate = RestTemplate; } @HystrixCommand (FallbackMethod = "backupProductList") public String ProductList () {List <VowerInstance> instâncias = this.discoveryclient.getInstances ("Product-Service"); if (instâncias! = null && instâncias.size ()> 0) {return this.resttemplate.getForObject (instâncias.get (0) .geturi () + "/produtos", string.class); } retornar ""; } public string backupProductList () {return "Jack, suéter"; } public String ProductListlloadBalanced () {return this.resttemplate.getForObject ("http: // product-Service/Products", String.class); }}Um novo método do ProductListLoadBalanced foi adicionado aqui, que é acessado o mesmo serviço que o método da lista de produtos anteriores, mas é o balanceamento de carga com o cliente da faixa de opções. Aqui, o anfitrião do URI se tornou o nome do serviço a ser acessado, o que é consistente com o atributo de nome configurado em @RIBBONCLIENT. Por fim, adicione o seguinte código em nosso produto ProductController:
@RestControllerPublic Classe ProductController {@AUTOWIRed PrivateService Products Service; @RequestMapping ("/Products") public String ProductList () {return ProduckService.ProductList (); } @ReQuestMapping ("/Productslb") public String ProductListListBalanced () {Return ProduckService.ProductListListBalanced (); }}Para criar um método que lida especificamente /Productslb solicitações e ligue para o ProductSovel para fornecer balanceamento de carga.
Neste ponto, nosso código é concluído. O código parece simples, mas de fato todas as configurações usam valores padrão. O Ribbon fornece métodos de programação e configuração para configurar o cliente da faixa de opções. Deixe -me dar uma breve introdução. Quando você se aprofunda na fita, vamos dar uma olhada em como modificar sua configuração. A fita fornece a seguinte configuração (a interface está à esquerda e a implementação padrão está à direita):
Como nosso projeto usa Eureka, alguns itens de configuração são diferentes da implementação padrão. Por exemplo, Eureka usa o DiscoveryEnabledNiWSServerlist em vez do Ribbonserverlist para obter uma lista de serviços registrados no Eureka. Há uma classe de configuração simples abaixo, no site oficial da primavera:
classe pública SayHelloconfiguration {@AUTOWIRED ICLIENTCONFIG RibBonClientConfig; @Bean Public IPing Ribbonping (ICLIENTCONFIG Config) {return New Pingurl (); } @Bean public irule ribbonRule (iClientConfig config) {return nova disponibilidade FilteringRule (); }}A fita não enviará ping para verificar o status de saúde do servidor por padrão, e o padrão é normal. Em seguida, o IRUNE é implementado como zonevoidancelerule por padrão para evitar a zona com muitos problemas com o AWS EC2. Isso não está disponível no ambiente de teste local. Em seguida, é substituído pelo FilteringRule da disponibilidade. Isso pode permitir a função do disjuntor que vem com fita para filtrar servidores que não estão funcionando corretamente.
teste
Primeiro, inicie nosso Serviço de Centro de Configuração do ConfigServer, depois inicie o serviço de registro e descoberta de registro de Eureka e inicie dois serviços de produtos. O primeiro é usar o plug-in da Spring-Boot: Run para iniciar, e o segundo é fornecer uma nova porta, que pode ser iniciada com o seguinte comando:
$ Server_port = 8082 mvn spring-boot: execute
Por fim, inicie nosso projeto de cliente da web, visite http: // localhost: 8080/Productslb e depois atualize algumas vezes. Você verá que duas linhas de comando Windows Running ProduckService aparecerá aleatoriamente:
Acesso ao endpoint /produtos
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.