Por que você precisa de um gateway?
Sabemos que queremos entrar em um serviço em si e é óbvio que não temos um método particularmente bom. Digitamos diretamente o endereço IP + número da porta. Sabemos que essa abordagem é muito ruim. Há um grande problema com essa abordagem. Primeiro, expõe o endereço IP da nossa máquina física. Quando outros olham para o seu endereço IP, eles sabem onde o serviço é implantado, permitindo que outras pessoas conduzam operações de ataque de maneira muito conveniente.
Segundo, temos tantos serviços, temos que chamá -los de um por um? Vamos supor que fizemos a autenticação de permissão e cada um de nossos clientes acessa programas de serviço em diferentes JVMs em execução em diferentes máquinas. Cada um de nossos serviços precisa de uma autenticação de serviço. Isso é irritante? É obviamente muito irritante.
Então estamos enfrentando esses dois e seus problemas gerais no momento, e precisamos de uma maneira de resolvê -los. Primeiro de tudo, vejamos a exposição do endereço IP e o problema de ponto único causado pela redação do endereço IP após a morte. Também preciso manter dinamicamente a lista de serviços para esse próprio serviço? Eu preciso chamar esse serviço em si, também preciso de uma coisa de balanceamento de carga?
Há também coisas sobre a exposição ao endereço IP. Eu preciso ser um proxy, como o proxy reverso da Nginx, e também há coisas que implantam módulos públicos nessa coisa, como verificação de permissão para todos os portais. Então agora precisamos do Zuul API Gateway. Ele resolve o problema acima. Se você quiser ligar para um determinado serviço, ele mapeará você e mapeará o endereço IP do seu serviço em
Se você entrar no caminho, ele corresponde a ele e acessará o serviço para você. Terá um processo de encaminhamento de solicitação. Como o nginx, a força específica da instância da máquina de serviço, ele não acessará diretamente o IP, ele irá ao Eureka Registration Center para obter o ID da instância de serviço, ou seja, o nome do serviço. Usei a fita de balanceamento de carga do cliente para acessar uma das instâncias de serviço novamente.
O gateway da API é usado principalmente para resolver o problema de chamadas externas pelo próprio serviço e para resolver o problema da verificação de permissão. Você pode integrar e chamar uma série de filtros aqui, como integrar Shiro, Springsecurity e outras coisas.
Zuul pode carregar um mecanismo de filtragem dinâmica para alcançar as seguintes funções:
1. Verificação e segurança: Identifique os requisitos de verificação para vários recursos e rejeite solicitações que não correspondem aos requisitos.
2. Revisão e monitoramento: rastrear dados significativos e resultados estatísticos em locais de borda, trazendo -nos conclusões precisas sobre o status de produção.
3. Rotamento dinâmico: solicitações de rota para diferentes clusters de back -end dinamicamente, conforme necessário.
4. Teste de estresse: Aumente gradualmente o fluxo de carga para o cluster para calcular o nível de desempenho.
5. Alocação de carga: atribua a capacidade correspondente a cada tipo de carga e deprecie solicitações que excedam o valor limite.
6. Processamento de resposta estática: Crie respostas parciais diretamente nos locais da borda para impedir que elas fluam para o cluster interno.
7. Elasticidade de várias regiões: o roteamento de solicitação nas regiões da AWS foi projetado para obter o uso diversificado de ELBs e garantir que os locais das borda sejam o mais próximos possível dos usuários.
Em seguida, vá para uma pequena demonstração
A primeira etapa é construir um novo módulo Zuul no projeto original e introduzir dependências. O código é o seguinte:
<Depencency> <PuerpId> org.springframework.cloud </frupiid> <TRATIFACTID> Spring-cloud-starter-eureka </artifactId> <versão> 1.3.5.Release </Version> </dependency> <pendence> <purrg> org.springframework.cloud </grupo> <tutiftId> <PRESTIF> <PRERG> Org.springFramework.Cloud </Groupid> <Versão> 1.3.5.Release </sipers> </dependency>
Em seguida, digite a anotação @enablezuulproxy na aula de inicialização, e o código é o seguinte:
Servidor: Porta: 5000Spring: Aplicação: Nome: API-GETEWAYZUUL: Rotas:#Identifique o nome do seu serviço, que pode ser definido por você mesmo aqui. De um modo geral, a conveniência e as especificações são as mesmas que o nome do seu serviço HOLO-Service: #O caminho do mapeamento de serviços, por esse caminho, você pode acessar seu serviço de fora. O objetivo é evitar expor o IP da sua máquina e a rota orientada a serviço e escolher uma disponível para você. #Ure, Zuul depende automaticamente da Hystrix e da fita, não para o caminho independente: /Hello-Service /**# Este deve ser o nome do serviço no seu Centro de Registro Eureka. Portanto, o ServiceId está configurado aqui porque é combinado com Eureka. Se você usar o Zuul sozinho, deve escrever o IP da sua própria máquina. #Such como URL: http: // localhost: 8080/Isso não é bom o suficiente para escrever o IP Dead. Se esse IP falhar e isso for alta disponibilidade, o conjunto de registro de serviço não será usado. ServiceId: hello-serviceeureka: #client: #Registration Centro de endereço Service-url: DefaultZone: http: // localhost: 8888/eureka/, http: // localhost: 8889/eureka/
Em seguida, inicie o centro de registro e dois provedores de serviços de serviço da Hello no artigo anterior. Em seguida, nós o executamos e analisamos sua função de encaminhamento de solicitação para ver se ela faz pesquisas nos dois serviços.
Digite localhost: 5000/Hello-Service/Hello, como segue:
Então atualize novamente:
Você pode ver que Zuul fez uma solicitação para distribuí -lo. É mapeado para uma máquina específica com base no nome do seu serviço Hello-Servie. Não é essa a função de um proxy reverso?
O Zuul também pode executar a filtragem de solicitações, então vamos executar a verificação de token para demonstrar. Primeiro, precisamos criar uma nova classe TokenFilter para herdar a classe Zuulfilter e implementar suas quatro interfaces. O código é o seguinte:
pacote hjc.zuul; importar com.netflix.zuul.zuulfilter; importar com.netflix.zuul.context.requestContext; importar javax.servlet.http.httpsttletrequest;/*** Criado por credor em 2018/5/18. */Public Classe TokenFilter estende o zuulfilter {// quatro tipos: pré, roteamento, erro, post // pré: é usado principalmente no estágio de mapeamento de roteamento para encontrar a tabela de mapeamento de roteamento // roteamento: o filtro de encaminhamento de roteamento específico está no roteador de roteamento. Ao encaminhar a solicitação específica, ele será chamado // ERRO: Após a ocorrência do erro de filtro anterior, o filtro de erro será chamado. // POST: Este filtro não será chamado após a conclusão do roteamento e o erro. É @Override public String filterType () {return "pre"; } // Personalize a ordem de execução de filtros. Quanto maior o valor, mais tarde a execução. Quanto menor o valor, mais ele é executado, mais é executado primeiro. @Override public int filterOrder () {return 0; } // Controle o filtro para entrar em vigor ou não. Você pode escrever uma sequência de lógica para controlar @Override public boolean devefilter () {return true; } // Execute o filtro lógica @Override public Object run () {requestContext context = requestcontext.getCurrentContext (); HttpServletRequest request = context.getRequest (); String token = request.getParameter ("token"); if (token == null) {context.setsendzuulResponse (false); context.setResponsestatuscode (401); context.setResponseBody ("não autenticado"); retornar nulo; } retornar nulo; }}FILTERTYPE: Retorna uma string representando o tipo de filtro. Quatro tipos de filtro com diferentes ciclos de vida são definidos em Zuul, como segue:
1. pre : pode ser chamado antes que a solicitação seja roteada. É usado para encontrar a tabela de mapeamento de roteamento durante o estágio de mapeamento de roteamento.
2.route : é chamado durante a solicitação de roteamento. O filtro de encaminhamento de roteamento específico será chamado ao rotear o encaminhamento específico de solicitação do roteador.
3. error : chamado quando ocorre um erro ao processar a solicitação
4. post : O filtro não será chamado após a conclusão do roteamento e o erro, que está no último estágio.
Aqui declaramos a exceção que ocorre quando o filtro Zuul executa uma solicitação de rede. A exceção capturada pelo Try-Catch não pode ser jogada diretamente na página no filtro. A exceção lançada pelo aplicativo pode ser retornada à página usando o método context.set () na captura. do seguinte modo:
tente {lógica de negócios ...} catch (Exceção e) {requestContext context = requestContext.getCurrentContext (); context.set ("error.status_code", 401); context.set ("error.exception", e); context.set ("error.message", "sfdfsdf");}Em seguida, você precisa adicionar esse filtro à mola e deixar a primavera gerenciá -lo. O código é o seguinte:
pacote hjc; importar hjc.zuul.tokenfilter; importar org.springframework.boot.springApplication; importar org.springframework.boot.autoconfigure.springbootapplication; importação org.springFramework.cloud.netflix.zuLulation; org.springframework.context.annotation.bean;@springbootApplication@enablezuulProxypublic Classe zuulApplication {public static void main (string [] args) {springappatication.run (zuulapplication.class, args); } // Deixe o filtro para o gerenciamento da primavera @Bean Public TokenFilter TokenFilter () {return New TokenFilter (); }}Em seguida, vamos iniciar a aula de inicialização e o primeiro acesso sem tokens, como segue:
Você pode ver que uma mensagem sem permissão é retornada. Aqui, quero dizer que os tokens geralmente são colocados no cabeçalho da solicitação. Aqui não estamos fazendo isso para fins de demonstração.
Em seguida, pegue o token e visite -o, como segue:
Você pode ver que nosso pedido foi enviado.
Aqui vou falar sobre qual é a rota padrão e excluir a configuração do Zuul, como segue:
Servidor: Porta: 5000Spring: Aplicação: Nome: API-GETEWAYEUREKA: #Client Client: #Register Center Endereço Service-URL: DefaultZone: http: // localhost: 8888/eureka/, http: // localhost: 8889/Eureka//
Em seguida, reinicie e continue o acesso, como segue:
, Assim,
Você pode ver que ainda podemos continuar a acessar. Não temos nada a fazer, mas ainda podemos acessá -lo. Isso porque, por padrão, você é declarado automaticamente com o nome do seu serviço Hello-Service.
Então, se eu não quero que o declare automaticamente para mim e quero defini-lo sozinho, posso usar o Zuu.Ignored Services no arquivo de configuração YML para filtrá-lo como filtragem, como segue: "
Zuul: #IF Services ignorados:* significa que todas as rotas padrão expiraram. Você tem que combiná -los um por um. Ninguém ficará tão fodido, a menos que você encontre negócios estranhos ignoram serviços:
Vamos falar sobre as regras de mapeamento, por exemplo
Zuul: Rotas:#Identifique o nome do seu serviço, você pode defini -lo aqui. De um modo geral, a conveniência e as especificações são as mesmas que o nome do seu serviço HOLO-Service: #Service Mapeed Path, por esse caminho, você pode acessar seu serviço de fora. O objetivo é evitar expor o IP da sua máquina, e a rota orientada a serviços é para você. #Ure Zuul depende automaticamente da Hystrix e da fita, não para o caminho independente: /Hello-Service /**#Este deve ser o nome do seu serviço de Centro de Registro Eureka, para que o ServiceId seja configurado aqui porque é combinado com Eureka. Se você usar o Zuul sozinho, deve escrever o IP da sua máquina, #Such como URL: http: // localhost: 8080/Isso é ruim, significa escrever o IP Dead. Se este IP falhar e alta disponibilidade, o conjunto de registro de serviço não será usado ServiceId: Hello-Servicezuul: Rotas: Hello-Service: Path:/Hello-Service/ext/** ServiceId: Hello-Service
Os dois caminhos de mapeamento de configuração do Zuul aqui têm /hello-service /. Você pode ver que/hello-service/** inclui/hello-service/ext/**. Existem conflitos ao combinar esses dois caminhos? Como lidar com isso? Quem vai combinar primeiro?
Aqui está o pedido definido no YML para corresponder. Se for um arquivo de configuração no formato Application.Properties, esse pedido não poderá ser garantido. Os arquivos de configuração no formato YML estão em sequência, que podem ser garantidos. Observe isso aqui.
E se quisermos definir uma regra correspondente? Então precisamos definir um feijão na aula de inicialização, que determina sua rota, como segue:
Não vou demonstrar isso aqui. Quando você precisar, procure informações lentamente.
Também há padrões ignorados: da seguinte forma:
Zuul: Rotas:#Identifique o nome do seu serviço, você pode defini -lo aqui. De um modo geral, a conveniência e as especificações são as mesmas que o nome do seu serviço HOLO-Service: #Service Mapeed Path, por esse caminho, você pode acessar seu serviço de fora. O objetivo é evitar expor o IP da sua máquina, e a rota orientada a serviços é para você. #Ure Zuul depende automaticamente da Hystrix e da fita, não para o caminho independente: /Hello-Service /**#Este deve ser o nome do seu serviço de Centro de Registro Eureka, para que o ServiceId seja configurado aqui porque é combinado com Eureka. Se você usar o Zuul sozinho, deve escrever o IP da sua máquina, #Such como URL: http: // localhost: 8080/Isso é ruim, significa escrever um IP morto. Se este IP falhar e alta disponibilidade, o conjunto de registro de serviço não será usado ServiceId: Hello-Service Ignored Patterns: /hello /**
Ignore Patterns: indica que o caminho de /hello /** está bloqueado. Mesmo se você/hello-service/hello/** não for possível, você ainda o bloqueia. Podemos refinar ainda mais essa configuração. Por exemplo, se eu não quiser rotear a interface /hello, podemos configurá -la como acima
E se também queremos configurar o prefixo de um serviço? O código é o seguinte:
Zuul: Rotas:#Identifique o nome do seu serviço, você pode defini -lo aqui. De um modo geral, a conveniência e as especificações são as mesmas que o nome do seu serviço HOLO-Service: #Service Mapeed Path, por esse caminho, você pode acessar seu serviço de fora. O objetivo é evitar expor o IP da sua máquina, e a rota orientada a serviços é para você. #Ure Zuul depende automaticamente da Hystrix e da fita, não para o caminho independente: /Hello-Service /**#Este deve ser o nome do seu serviço de Centro de Registro Eureka, para que o ServiceId seja configurado aqui porque é combinado com Eureka. Se você usar o Zuul sozinho, deve escrever o IP da sua máquina, #Such como URL: http: // localhost: 8080/Isso não é bom o suficiente para escrever um IP morto. Se este IP falhar e alta disponibilidade, o conjunto de registro de serviço não será usado ServiceId: Hello-Service Prefix: /API /**
Você pode ver que os serviços que você visita devem ser prefixados com/API/, como/API/Hello-Service/**
O que devemos fazer se queremos pular para minha área local se queremos fazer um acesso ao caminho?
Espero que o usuário possa pular automaticamente para esse método ao acessar /local. Então, neste momento, precisamos usar o salto local de Zuul, e o método de configuração é o seguinte:
zuul: prefixo:/API Ignored Patterns:/**/hello/** Rotas: Local: Path:/hello-Service/** URL: Forward:/Local
Alguns dos mais usados, conectando-se ao SpringSecurity ou a alguns componentes de terceiros, obterão algumas de suas informações de cookies. Então, o Zuul Gateway matou todas as suas informações de biscoitos por razões de segurança, e não há como fazer cookies. É morto por padrão.
Aqui, o Zuul fornece aos cabeçalhos Zuul. Controle suas informações confidenciais.
Por padrão, as informações sensíveis do cabeçalho não podem ser passadas pelo gateway da API. Podemos torná -lo aceitável através da seguinte configuração:
Zuul: Rotas: Hello-Service: Path: /Hello-Service /** ServiceId: Hello-Service Sensitive-cabeçalhos: biscoito, cabeçalho e outras coisas
Também pode ser usado com algumas configurações detalhadas do Hystrix, como mencionado anteriormente. Eu não vou falar sobre isso aqui
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.