Introdução ao Gateway de Cloud Spring
A versão oficial do Spring Boot 2 foi lançada há algum tempo. O Spring Cloud Gateway é baseado no Spring Boot 2 e é um novo projeto da Spring Cloud. O projeto fornece um gateway de API construído no ecossistema da primavera, incluindo: Spring 5, Spring Boot 2 e Project Reactor. O Spring Cloud Gateway foi projetado para fornecer uma maneira simples e eficiente de enviar APIs e fornecer a eles preocupações cruzadas, como: segurança, monitoramento/métricas e resiliência. A versão mais recente atual é v2.0.0.m8, e a versão oficial também estará aqui em breve.
Recursos do Spring Cloud Gateway:
vs Netflix Zuul
O Zuul é baseado no Servlet 2.5 (usando 3.x), usando a API de bloqueio. Não suporta conexões longas, como a WebSockets. Enquanto o Gateway é construído no Spring Framework 5, Project Reactor e Spring Boot 2, usando uma API não bloqueadora. O WebSockets é suportado e será uma melhor experiência de desenvolvimento, porque é fortemente integrada à primavera.
Prática de Introdução ao Gateway da Spring Cloud
O autor estudou recentemente o código -fonte do Spring Cloud Gateway e escreveu artigos sobre análise de código -fonte para a maioria das funções, mas a versão oficial não foi lançada afinal. Este artigo é uma prática introdutória, mostrando várias funções comumente usadas e aguarda o lançamento da versão oficial mais recente.
Exemplo inicia dois serviços: Gateway-Server e Usuário-Servidor. O cenário simulado é que o cliente solicita o serviço de back -end e o gateway fornece uma entrada unificada para o serviço de back -end. Todos os serviços de back -end são registrados no serviço e encontrados cônsul (ambos Build ZK e Eureka estão OK, e estou mais acostumado a usar o cônsul). O gateway a seguir para serviços de back -end específicos através do balanceamento de carga.
Serviço de usuário
O Serviço de Usuário é registrado no Consul e fornece uma interface/teste.
confiar
As dependências necessárias são as seguintes:
<Depencency> <GroupID> org.springframework.cloud </frupiid> <stifactId> Spring-cloud-Starter-Consul-Discovery </starfactid> </dependency> <pendency> <punerid> org.springframework.boot </groupid> <stifactId> <pursPer-Benty-Benty-web-web-we-webwebwebweb-webrweb-woot </groupid> <stifactId> <vwid-Benty-Benty-we-web-we-webweb-tringwebweb.Boot </groupid> <stifactId> Spring-BentyStarter-WEB-WEB-WEB-WEB-WEB-WEB </Artifactid> Spring-Benty
Arquivo de configuração
Spring: Aplicação: Nome: Serviço de Usuário Cloud: Consulte: Host: 192.168.1.204 Porta: 8500 Discovery: IP-Address: $ {host_address: localhost} porta: $ {service_port: $ {server.port}} HealthCheck: /HealthCheck »Namen: 15s Instância-{Server.port}}} HealthCheck: /HealthCheck} Segurança: ativado: falseExponha a interface
@SpringbooTApplication@RestController@EnablediscoveryclientPublic Classe gatewayUserApplication {public static void main (string [] args) {springapplication.run (gatewayUserApplication.class, args); } @GetMapping ("/test") public string test () {return "ok"; }}Exponha/interface de teste e retorne OK.
Serviços de Gateway
O Gateway Service fornece uma variedade de configurações de roteamento, fábricas de asserção de roteamento e filtro fábricas.
confiar
Dependências que precisam ser introduzidas:
<Depencency> <voundId> org.springframework.boot </frugiD> <stifactId> primavera-boot-actuator <TRAFACTID> Spring-Boot-Starter-Webflux </ArtifactId> </Dependency> <pendence> <puperid> org.springframework.cloud </frugiD> <stifactId> Spring-cloud-gateway-core </stifactId> </decepince> // Componente de Discovery, excluindo a web depende da web <roupidId> org.springframework.cloud </frupiD> <stifactId> Spring-cloud-starter-consul-Discovery </stutifactId> <versão> 2.0.0.m6 </version> <clusions> <cclusion> <pringa> org.springBringwork.Boot </GrupoDid> <tifactIm> <pringa> org.springBringwork.Boot </Groupid> <stiftid> </exclusion> </clusions> </dependency> // Kotlin Dependência <Ependency> <GrupidId> org.Jetbrains.kotlin </GroupId> <TarifactId> Kotlin-stdlib </ArtifactId> <bersion> $ {Kotlin.version} </sistER> </Option> </lescution> </sisters> $ {kotlin.version} </sistER> </Option> True </alal> <PuerpId> org.jetbrains.kotlin </frugiD> <ArtifactId> kotlin-reflect </artifactId> <version> $ {kotlin.version} </versão> <pptional> true </cptional> </pendence>Como mencionado acima, as dependências relacionadas a Kotlin são introduzidas e a configuração de roteamento do Kotlin precisa ser suportada aqui. O uso do Spring Cloud Gateway requer excluir configurações relacionadas à Web. Introduz referências ao webflux. Ele será verificado quando o aplicativo iniciar e deve ser introduzido.
Fábrica de afirmação de roteamento
Existem muitos tipos de fábricas de afirmação de roteamento, dependendo do tempo de solicitação, host, caminho, método etc. A definição a seguir é uma correspondência de afirmação de rota baseada em caminho.
@BeanPublic RouterFunction <VerverResponse> testFunRouterFunction () {RouterFunction <VerverResponse> rota = routerfunctions.Route (requestPredicates.path ("testfun"), solicitação -> serverResponse.ok (). rota de retorno;}Quando o caminho solicitado é /testfun, o código de status de OK é retornado diretamente e o corpo de resposta é uma string hello.
Fábrica de filtro
Os gateways geralmente precisam filtrar solicitações de roteamento e executar algumas operações, como a construção de cabeçalhos após a autenticação. Existem muitos tipos de filtragem, como adicionar cabeçalhos de solicitação, adição de parâmetros de solicitação, adição de cabeçalhos de resposta e disjuntores, etc.
@BeanPublic Routelocator CustomRoutElocator (construtor RoutelocatorBuilder, acelerador acirrado efilterfactory) {//@Formatter: Off Return Builder.Routes () .Route (R) ("/Image/Webp") .Filters ("F -)," F. "F." .uri ("http://httpbin.org:80") .build (); //@formatter: on}Como acima, quando o caminho da solicitação é/imagem/webp, a solicitação é encaminhada para http://httpbin.org:80, e a resposta é filtrada, adicionando o cabeçalho da resposta x-anotherHeader: BAZ.
Roteamento personalizado
As duas subseções acima pertencem ao roteamento personalizado da API e também podem ser definidas por meio da configuração:
Spring: Cloud: Gateway: Locor: Ativado: True Default-Filters:-AddResponseHeader = X-Response-Default-Foo, Rotas de barra padrão: # ================================================================================================================== ================================================================================================================== ================================================================================================================== ===================================================================================================================
A configuração acima define roteamento e filtros. O filtro global adiciona todas as respostas ao cabeçalho X-Response-default-foo: barra padrão. A rota com ID default_path_to_http é definida, mas a prioridade é relativamente baixa. Quando a solicitação não puder corresponder, ela será encaminhada para blueskykong.com.
Rotamento personalizado de Kotlin
O Gateway da Cloud Spring pode usar o Kotlin para personalizar o roteamento:
@ConfigurationClass adicionais {@Bean FUN ATDERROUTELOCATOR (Builder: RoutelocatorBuilder): Routelocator = Builder.Routes {Route (id = "test-kotlin") {Path ("/image/png") Filters {AddResponsoHeader ("X-testHeader", "Filters") Filters ") Uri ("http://httpbin.org:80")}}}Quando o caminho solicitado for/imagem/png, ele será encaminhado para http://httpbin.org:80, e um filtro é definido e um cabeçalho X-TestHeader: Foobar é adicionado ao cabeçalho de resposta.
Componentes de descoberta de serviço
Combinado com o registro de serviço no componente Discovery, encaminhado para a instância de serviço específica através do ServiceId. As dependências correspondentes foram introduzidas na configuração anterior.
@BeanPublic RoutefinitionLocator DiscoveryclientRouteDefinitionLocator (Discoveryclient Discoveryclient) {Return New DiscoveryclientRouteDefinitionLocator (Discoveryclient);} Injete o descoberto no construtor do DiscoveryClientRouteDefinitionLocator. A análise do código -fonte será explicada posteriormente e não será expandida aqui.
Spring: Cloud: Gateway: Locor: Ativado: True Default-Filters:-AddResponseHeader = X-Response-Default-Foo, Rotas de barra padrão: # =================================================================================- id: service_to_user uri: lb://user order: 8000 predicates: - Path=/user/** filters: - stripprefix = 1
A configuração acima permite a implementação do localizador Discoveryclient. A rota define que todas as solicitações iniciadas com /usuário serão encaminhadas para o Serviço de Usuário, e o filtro do caminho será aplicado para interceptar a primeira parte do prefixo do caminho. Ou seja, a solicitação real de acesso/usuário/teste é convertida em lb: // user/teste.
webSocket
Você também pode configurar o roteamento de gateway do WebSocket:
Spring: Cloud: Gateway: Filters padrão:-AddResponseHeader = X-Response-Default-Foo, Rotas de Bar Padrão:-Id: Websocket_test Uri: WS: // localhost: 9000 Ordem: 9000 Predicates:-Path =/Echo
Inicie um WS Server WSCAT -Listen 9000, inicie o gateway (porta do gateway é 9090) e conecte o cliente ao wscat -Conconect ws: // localhost: 9090/eco.
Acesso ao cliente
Os leitores podem baixar o código -fonte para experimentar as funções acima. Aqui eu só mostro os resultados do acesso aos serviços de usuário:
O gateway carrega com êxito para o servidor do usuário e retornou OK. O cabeçalho da resposta contém o cabeçalho do filtro global Cabeçalho X-Response-Default-Foo: BAR-BAR
Resumir
Neste artigo, exploramos alguns dos recursos e componentes que pertencem ao Spring Cloud Gateway. Esta nova API fornece ferramentas prontas para uso para suporte de gateway e proxy. Ansioso pela versão oficial do Spring Cloud Gateway 2.0.
Endereço do código -fonte
https://github.com/keets2012/spring-cloud_samples
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.