Spring Cloud é uma coleção ordenada de uma série de estruturas. Ele usa a conveniência de desenvolvimento da Spring Boot para simplificar inteligentemente o desenvolvimento da infraestrutura do sistema distribuída, como registro de descoberta de serviços, centro de configuração, barramento de mensagens, balanceamento de carga, disjuntores, monitoramento de dados etc., que podem ser iniciados e implantados em um clique usando o estilo de desenvolvimento da Spring Boot. A primavera não fabrica rodas repetidamente. Ele combina apenas as estruturas de serviço relativamente maduras e práticas desenvolvidas por várias empresas. Ele reembala e protege configurações complexas e princípios de implementação através do estilo de inicialização da primavera e, finalmente, deixa os desenvolvedores com um kit de ferramentas de desenvolvimento de sistemas simples, fácil de entender, fácil de implantar e fácil de manter.
Em seguida, usaremos o SpringCloud para implementar uma arquitetura de microsserviço simples.
Todos os códigos a seguir foram de origem aberta para o Github, endereço: https://github.com/lynnlovimin/sofservice
Eureka (Registro de Serviço e Descoberta)
Primeiro introduza pacotes de dependência relacionados
<Dor> <PuerpId> org.springframework.boot </frugiD> <TRATIFACTID> Spring-boot-Starter-Parent </ArtifactId> <Versão> 1.5.9.Release </siERSE> <RelityPath/> <!-Lookup Parent do Repositor <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> <ject.reporting.outputencoding> utf-8 </project.reporting.outputEncoding> <nava.version> 1.8 </java.version> </prophers> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <dependency> <GroupID> org.springframework.boot </roupiD> <TRATIFACTID> Spring-boot-starter-web </artifactId> </dependency> <pendency> <puperid> org.springframework.boot </groupid> <stifactId> Spring-boot-scarter </ArtiftItid> </dependency> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependency> </dependencyManagement> <build> <plugins> <PuerpId> org.springframework.boot </frugiD> <ArtifactId> primavera-boot-maven-plugin </artifactId> </flugin> </flugins> </fuild> <popositories> <positório> <di> spring-milestones </id> <name> mola </Nome> <erl> https://repo.spring.io/milestone </erl> <nsnapshots> <bilted> false </ability> </snapshots> </positório> </positório> </repositórios>
Configure o aplicativo.yml
Servidor: Porta: 8761eureka: Instância: HostName: localhost Cliente: RegisterWitheureka: False Fetchregistry: False ServiceUrl: DefaultZone: http: // $ {Eureka.instance.hostname}: $ {server.port}/eureka/Crie um aplicativo de classe de inicialização
@Enableeurekaserver@springbootApplicationPublic Class Application {public static void main (string [] args) {springapplication.run (application.class, args); }} Execute o método principal e o navegador visita: http: // localhost: 8761, e podemos ver a seguinte interface no navegador:
Isso significa que Eureka é iniciado com sucesso.
Em seguida, percebemos o saldo da dívida, o disjuntor, o gateway e o cliente. Todos os serviços devem ser registrados em Eureka e, ao visitar Eureka, você pode ver todos os serviços registrados.
cliente (cliente)
pom.xml
<Dor> <PuerpId> org.springframework.boot </frugiD> <TRATIFACTID> Spring-boot-Starter-Parent </ArtifactId> <Versão> 1.5.9.Release </siERSE> <RelityPath/> <!-Lookup Parent do Repositor <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> <ject.reporting.outputencoding> utf-8 </project.reporting.outputEncoding> <nava.version> 1.8 </java.version> </prophers> <roupdiD> org.springframework.cloud </proupId> <TRARFACTID> Spring-Cloud-Starter-eureka </stutifactId> </pendesicency> <pendence> <puperid> org.springframework.boot </frugid> <stifactid> Spring-boot-starter </artiftIf <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependency> </dependencies> <dependencyManagement> <dependency> <dependency> <groupId>org.springframework.cloud</groupId> </ArtifactId> dependências de primavera </artifactId> <versão> dalston.rc1 </version> <type> pom </pype> <cope> importar </scope> </dependency> </dependency> </dependency> </dependency> </dependencyManagement> <ufring> <dirpys> <plupin> <vginId> </ArtifactId> </plugin> </plugins> </fuild> <positórios> <pository> <id> spring-milestones </dod> <name> Milestos de primavera </name> <url> https :/repo.spring.milemile </snapshots> </positório> </positório> </positório> </positório> </positório> </positório>
Application.yml
Eureka: Cliente: ServiceUrl: DefaultZone: http: // localhost: 8761/eureka/#register aqui no Eureka Server: Port: 8763Spring: Aplicativo: Nome: Service-Hi
Classe de aplicação
@SpringbooTApplication@enableeurekaclient@RestControllerPublic Classe Application {public static void main (string [] args) {springapplication.run (applicatioin.class, args); } @Value ("$ {server.port}") porta string; // Aqui fornecemos uma interface @RequestMapping ("/oi") public String Home (@RequestParam String Name) {return "Hi"+Name+", eu sou da porta:"+porta; }}FEIGN (saldo da dívida, disjuntor)
pom.xml
<Dor> <PuerpId> org.springframework.boot </frugiD> <TRATIFACTID> Spring-boot-Starter-Parent </ArtifactId> <Versão> 1.5.9.Release </siERSE> <RelityPath/> <!-Lookup Parent do Repositor <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> <ject.reporting.outputencoding> utf-8 </project.reporting.outputEncoding> <nava.version> 1.8 </java.version> </prophers> <roupdiD> org.springframework.cloud </proupId> <TRARFACTID> Spring-cloud-starter-eureka </stutifactId> </pendesency> <pendence> <puperid> org.springframework.boot </frugid> <stifactid> Spring-boot-starter </artef <PuerpId> org.springframework.cloud </frupiD> <ArtifactId> Spring-cloud-starter-feign </stutifactId> </dependency> <pendence> <puperid> org.springframework.boot </frupid> <stifactid> spring-boot-starter-actator </artifactIddid) <PuerpId> org.springframework.cloud </frupiD> <TRATIFACTID> Spring-Cloud-Starter-hystrix-Dashboard </stutifactId> </pendendicy> <pendence> <puperid> org.springframework.boot </roupid> <stifactid> spring-boot scarter-test-testertIFTIF <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift <//Artift </dependency> </dependency> </dependency> <dependencyManagement> <dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url> https://repo.spring.io/milestone </url> <nsnapshots> <bility> false </ability> </snapshots> </positório> </positórios>
Application.yml
Eureka: Cliente: ServiceUrl: DefaultZone: http: // localhost: 8761/eureka/servidor: Porta: 8765Spring: Aplicação: Nome: Service-Feignfeign: Hystrix: Ativado: True: true
Classe de aplicação
@Springbootapplication@habilablediscoveryclient@enableFeignCliients@enableHystrixDashboardPublic Classe aplicativo {public static void main (string [] args) {springapplication.run (appold.class, args); }}Em seguida, forneça um serviço, sua função é realizar o saldo da dívida e as funções do disjuntor
@FeignClient (Value = "Service-hi", Fallback = ScorrentualServiceHiHyStrict.Class) Interface pública Sgrocesto ScorrerviceHi {@RequestMapping (Value = "/HI", Method = requestMethod.get) SLAGE SLIGHIFromClientOne (@RequestParam (Value = "Nome") String); String); @ComPonentPublic Classe SgrocalageServiceHiHyStrict implementa SGILDualServiceHi {@Override public String diz quehifromClientOne (Nome da String) {return "Sorry"+Name; }}FeignClient Nós especificamos o nome: Service-hi, Fallback especificado ao criar o cliente antes. Dessa forma, quando iniciamos vários clientes, podemos ver que diferentes portas Feign serão acessadas alternadamente quando solicitações HTTP. Quando o cliente estiver parado, o acesso à interface retornará uma mensagem de erro.
Zuul (serviço de serviço)
Em geral, não exporemos diretamente o cliente ao mundo exterior, mas o encaminharemos através do serviço de serviço. Os serviços internos são comunicados dentro da rede da área local e não podem ser acessados do mundo exterior. Através do gateway de serviço, também podemos executar a verificação de segurança da interface e interceptar uniformemente. Por favor, veja o código:
pom.xml
<Dor> <PuerpId> org.springframework.boot </frugiD> <TRATIFACTID> Spring-boot-Starter-Parent </ArtifactId> <Versão> 1.5.9.Release </siERSE> <RelityPath/> <!-Lookup Parent do Repositor <Project.build.sourceEncoding> utf-8 </project.build.sourceEncoding> <ject.reporting.outputencoding> utf-8 </project.reporting.outputEncoding> <nava.version> 1.8 </java.version> </prophers> <roupdiD> org.springframework.cloud </proupId> <TRARFACTID> Spring-cloud-starter-eureka </stutifactId> </pendesency> <pendence> <puperid> org.springframework.boot </frugid> <stifactid> Spring-boot-starter </artef <GroupID> org.springframework.cloud </roupfactId> <TRATIFACTID> Spring-Cloud-Starter-Zuul </ArtifactId> </Dependency> <pendency> <puperid> org.springframework.boot </groupid> <TarfactId> Spring-boot-screter </ArtiftItid. </dependency> <dependencyManagement> <dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependency> </dependency> </dependencyManagement> <build> <plugins> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url> https://repo.spring.io/milestone </url> <nsnapShots> <bility> false </ability> </snapshots> </positório>
Application.yml
Eureka: Cliente: ServiceUrl: DefaultZone: http: // localhost: 8761/eureka/servidor: Porta: 8080spring: Aplicação: Nome: Service-Zuulzuul: Rotas: API-W: Path:/API/** Service: Service-FEIGN #Alls Solicitação Com o acesso API ao API para o Serviço F-FEIR
Classe de aplicação
@EnablezuulProxy@enableeurekaclient@springbootapplicationpublic class Application {public static void main (string [] args) {springapplication.run (application.class, args); }}Inicie o aplicativo e o acesso: http: // localhost: 8080/api/hi para acessar a interface que definimos antes. Em seguida, interceptamos a interface:
/*** FILTERTYPE: Retorna uma string representando o tipo do filtro. Quatro tipos de filtro com diferentes ciclos de vida são definidos em Zuul, como segue: pré: Antes do roteamento: Ao rotear postagem: Após o erro de roteamento: Enviar erro de chamada FilterOrder: FilterOrder: Filter Order deve filter: Aqui você pode escrever um julgamento lógico, se deve filtrar, este artigo é verdadeiro, filtrar para sempre. Execute: a lógica específica do filtro. É muito complicado de usar, incluindo a verificação do SQL e o NOSQL para determinar se a solicitação tem permissão para acessar. */@ComponentPublic Class MyFilter estende o zuulfilter {private static logger log = loggerFactory.getLogger (myfilter.class); @Override public String filterType () {return "pre"; } @Override public int filterOrder () {return 0; } @Override public boolean devefilter () {return true; } @Override public Object run () {requestContext ctx = requestContext.getCurrentContext (); HttpServletRequest request = ctx.getRequest (); log.info (string.format (" %s >>> %s", request.getMethod (), request.getRequesturl (). tostring ())); Objeto AccessToken = request.getParameter ("Token"); if (accessToken == null) {log.warn ("token está vazio"); ctx.setsendzuulResponse (false); ctx.setResponsestatuscode (401); tente {ctx.getResponse (). getWriter (). write ("token está vazio"); } catch (Exceção e) {} retornar null; } log.info ("ok"); retornar nulo; }} Dessa forma, primeiro executaremos o método de execução na classe MyFilter antes de chamar a interface. Neste método, podemos fazer uma série de verificações de segurança, como tokens.
OK, uma arquitetura simples de microsserviço foi construída.
Todo o código acima foi de origem aberta para o Github, endereço: https://github.com/lynnlovemin/sofservice
O exposto acima é a arquitetura de microsserviço simples que o editor apresentou a você. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a tempo.