Eclipse configurado para ejecutar SpringCloud (Hoxton + 2.2.4) estructuras micro sirven marco de servicio de pasarela Zuul +

breve introducción

servicios de puerta de enlace

Servicios de puerta de enlace es una arquitectura de micro-servicio en una parte integral. REST API proporciona un proceso por el que sirve a cabo un sistema de pasarela unificada, además de tener el servicio de enrutamiento, la carga de función de equilibrado, sino que también tiene control de acceso y otras funciones. Primavera Nube de Netflix en Zuul ha servido como un papel, el papel de brindar protección a la arquitectura puerta micro-servicio delantera, mientras que la autoridad para controlar estos migración de contenido pesado a la lógica del no-negocio de enrutamiento de nivel de servicio, por lo que el cuerpo puede tener un servicio más agrupado alta capacidad de reutilización y la capacidad de prueba.

Ruta Forwarding Services Gateway = + filtro

  • Desvío de ruta: Recibir todas las solicitudes externas remitidos al backend de servicios de micro-Sube, por ejemplo, / puede ser asignada a la aplicación Web, / API / usuarios asignan a los servicios de usuario y / api / tienda asignan al servicio de almacén.
  • Filtros: Se puede completar una serie de función de pasarela cruzada de servicios, tales como la comprobación de permisos, limitando y seguimiento, que se pueden hacer (de hecho, el reenvío de enrutamiento se logra a través del filtro) a través del filtro.

zuul

Netflix Zuul usando las siguientes operaciones:

  • Autenticar
  • perspicacia
  • Prueba de esfuerzo
  • prueba de Canarias
  • enrutamiento dinámico
  • Servicios de migración
  • La desconexión de carga
  • seguridad
  • procesamiento de respuesta estática
  • Activo / activo de gestión del tráfico

Zuul, la cinta y Eureka se pueden combinar con funciones de encaminamiento y de equilibrio de carga inteligentes; interfaz API de puerta de enlace para todos los servicios de agregación coherente, unificado de exposición externa. Cuando el mundo exterior a la interfaz API de llamada, no es necesario conocer la complejidad del sistema de micro-servicio para cada llamada de servicio entre sí para proteger la unidad de micro-servicios de interfaz API interna; gateway puede realizar la autenticación de usuario y la autoridad de certificación, evitar la operación ilegal solicitado una interfaz API; puerta de enlace implementar el monitoreo, registro de solicitud de salida de registro en tiempo real; se puede lograr el seguimiento del tráfico de puerta de enlace, en el caso de alto tráfico, a la degradación del servicio; las interfaces API separar del servicio interno, conveniente para hacer la prueba.

Zuul logra mediante servlet, ser controlado por petición de encargo ZuulServlet. El núcleo es una serie de filtros, el filtro se pueden realizar durante una serie de inicio de la solicitud y devuelve una respuesta HTTP. Zuul tomado una dinámica de lectura, compilar y ejecutar estos filtros. Entre el filtro no se pueden comunicar directamente, sino a través de RequestContext compartió objetos de datos, cada solicitud crea un objeto RequestContext.

ciclo de vida zuul como se muestra a continuación. Solicitud Cuando una petición de cliente para entrar en servicio Zuul puerta de entrada, la primera puerta de entrada a la "pre-filtro", una serie de verificar el funcionamiento o el juicio. Y luego a "encaminamiento de filtro" reenvío de encaminamiento, por ejemplo a un procesamiento lógico de servicio específico, se devuelve datos. Cuando se ha completado el proceso de servicio específico, y finalmente procesada por un "filtro post", el tipo de procesador después de completado el procesamiento, la parte de atrás mensaje de solicitud al cliente. La aplicación de "filtro de error" en las otras etapas errores. Además del tipo de filtro por defecto, Zuul también nos permite crear un tipo de filtro personalizado. Por ejemplo, podemos tener personalizar un tipo estático de filtro, generado en respuesta Zuul directamente, sin atrás hacia delante la solicitud a los micro-servicios.
Aquí Insertar imagen Descripción

Crear un servicio de puerta de enlace

Aquí Insertar imagen Descripción

Agregar archivo dependencias pom.xml

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.springcloud</groupId>
    <artifactId>springcloud-root</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>springcloud-zuul</artifactId>
  <name>springcloud-zuul</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

archivo de configuración Application.yml

Aquí Insertar imagen Descripción

  • application.yml
spring:
  application:
    name: springcloud-zuul
  freemarker:
    prefer-file-system-access: false
  security:
    user:
      name: admin
      password: 123456
    
server:
  port: 8120

eureka:
  instance:
    hostname: eureka-zuul.com
    instance-id: eureka-zuul
  client:
    service-url:
      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer1.com:8897/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer2.com:8898/eureka/,http://${spring.security.user.name}:${spring.security.user.password}@eureka-peer3.com:8899/eureka/

zuul:
  #接口前缀(v1作为版本号)
  prefix: /v1
  routes:
    hiapi:
      path: /hiapi/**
      serviceId: springcloud-eureka-provider
    ribbonapi:
      path: /ribbonapi/**
      serviceId: springcloud-ribbon
    feignapi:
      path: /feignapi/**
      serviceId: springcloud-feign

Modificar C: \ Windows \ System32 \ drivers \ etc \ hosts

127.0.0.1 eureka-zuul.com

Desactiva el filtro especificado

Puede configurar la necesidad application.yml desactivar el filtro, el formato

zuul.<SimpleClassName>.<filterType>.disable=true

Por ejemplo, para org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter disable está definido

zuul:
  SendResponseFilter:
    post:
      disable: true

Añadir una clase de arranque pasarela de servicio

Aquí Insertar imagen Descripción

  • ZuulApplication.java

Añadir comentarios @EnableZuulProxy

package org.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

Con el fin de iniciar el proyecto

springcloud-eureka-cluster-Peer1
springcloud-eureka-cluster-peer2
springcloud-eureka-cluster-peer3
springcloud-Eureka-provider1
springcloud-Eureka-provider2
springcloud-Eureka-provider3
springcloud-cinta
springcloud-Feign
springcloud-zuul

Aquí Insertar imagen Descripción

  1. Navegador numerosas visitas http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
    Aquí Insertar imagen Descripción
    Zuul enrutamiento reenvío hacer balanceo de carga

  2. Navegador numerosas visitas http://eureka-zuul.com:8120/v1/ribbonapi/hi?name=zhaojq
    Aquí Insertar imagen Descripción
    Zuul y la cinta combinada para lograr el equilibrio de carga (estrategia aleatoria)

  3. Navegador numerosas visitas http://eureka-zuul.com:8120/v1/feignapi/hi?name=zhaojq
    Aquí Insertar imagen Descripción
    Zuul y Feign combinada para lograr el equilibrio de carga (estrategia aleatoria)

Configuración de fusible en el servicio de pasarela Zuul

Los fusibles necesitan implementar funciones para lograr interfaz FallbackProvider, las interfaces de los dos métodos, uno es getRoute (), que especifica la función del fusible servicios de enrutamiento se utilizan; Otro método fallbackResponse () se ejecuta cuando la función del fusible entra la lógica.
Aquí Insertar imagen Descripción

  • ZuulHystrix.java

Si necesita servicio de toda la función de fusible se añaden las rutas, hay necesidad de volver sobre el método getRoute () "*" coincidencias de caracteres

package org.springcloud.zuul;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

@Component
public class ZuulHystrix implements FallbackProvider {
    @Override
    //指定熔断器功能应用于哪些路由的服务
    public String getRoute() {
        //return "springcloud-eureka-provider";
    	return "*";
    }

    @Override
    //进入熔断器功能时执行的逻辑
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        System.out.println("route:"+route);
        System.out.println("exception:"+cause.getMessage());
        return new ClientHttpResponse() {
            @Override
            public HttpStatus getStatusCode() throws IOException {
                return HttpStatus.OK;
            }

            @Override
            public int getRawStatusCode() throws IOException {
                return 200;
            }

            @Override
            public String getStatusText() throws IOException {
                return "ok";
            }

            @Override
            public void close() {

            }

            @Override
            public InputStream getBody() throws IOException {
                return new ByteArrayInputStream("eureka-provider is down!! this is the fallback.".getBytes());
            }

            @Override
            public HttpHeaders getHeaders() {
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;
            }
        };
    }
}

Después de todo el inicio normal, los proveedores de parada springcloud-Eureka-provider2, puerto: 8002 servicio de
acceso a la ventana de comando curl http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq, interruptores de circuito que ya están en vigor, Consejo: proveedor de servicios colgó
Aquí Insertar imagen Descripción

Filtro Filtro personalizado Zuul

Zuul comprendiendo el filtro 4

  • PRE Filtro: petición de encaminamiento se lleva a cabo, se puede hacer para seguro de verificación antes de servicios específicos, tales como la autenticación, la validación de parámetros.
  • ROUTING Filtro: Se utiliza para enrutar la solicitud a una instancia de servicio de micro específico. por defecto cliente HTTP para las solicitudes de red.
  • POSTAL filtros: el micro-en la solicitud se ha realizado después de la ruta de servicio. Puede ser utilizado con las estadísticas de cobro revertido, los indicadores y la respuesta al cliente.
  • Filtros de error: ejecutados cuando se ha producido otro error de filtro.

aplicación de filtros por defecto zuul

tipo orden filtro función
pre -3 ServletDetectionFilter proceso de marcado tipo Servlet
pre -2 Servlet30WrapperFilter Embalaje petición HttpServletRequest
pre -1 FormBodyWrapperFilter Embalaje cuerpo de la petición
ruta 1 DebugFilter indicador de depuración marca
ruta 5 PreDecorationFilter contexto de la petición de procesamiento para su posterior uso
ruta 10 RibbonRoutingFilter serviceId solicitud de reenvío
ruta 100 SimpleHostRoutingFilter solicitud de reenvío url
ruta 500 SendForwardFilter reenviar la petición para reenviar
enviar 0 Enviar filtro de error Error respuesta solicitud de procesamiento
enviar 1000 SendResponseFilter el procesamiento normal de las respuestas solicitud

La implementación de filtros personalizados necesitan ZuulFilter hereda, ZuulFilter implementar los métodos abstractos, incluyendo el método run () tipofiltro (), filterOrder () y el IZuulFilter shouldFilter () y.

  • FilterType () es un tipo de filtro, hay 4 tipos: pre, post, enrutamiento y de error.
  • filterOrder () es una orden de filtro, es el valor de un tipo int, el más pequeño es el valor, antes de la ejecución del filtro.
  • shouldFilter () indica si para ejecutar la lógica del filtro, representan cierto ejecutado, a medios falsos que no se ejecuta ningún proceso si es cierto run ().
  • método run () es el filtrado de la lógica específica. petición de prueba de parámetro en la presente forma de realización si la contraseña o ficha pasa este parámetro, si no hay transmisión, solicitando una instancia de servicio específico a no enruta directamente devuelve una respuesta con un código de estado 401.

filtro TokenFilter

Aquí Insertar imagen Descripción

  • TokenFilter.java
package org.springcloud.zuul;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

public class TokenFilter extends ZuulFilter {

    private static Logger LOGGER=LoggerFactory.getLogger(TokenFilter.class);

    @Override
    //定义filter的类型,有pre、route、post、error四种
    public String filterType() {
        //可以在请求被路由之前调用
    	return "pre"; 
    }

    @Override
    //定义filter的顺序,数字越小表示顺序越高,越先执行
    public int filterOrder() {
        return 0;
    }

    @Override
    //表示是否需要执行该filter,true表示执行,false表示不执行
    public boolean shouldFilter() {
        return true;
    }

    @Override
    //filter需要执行的具体操作
    public Object run() throws ZuulException { 
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        LOGGER.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
        
        //获取请求的参数
        String token = request.getParameter("token");
        
        if (StringUtils.isNotBlank(token)) {
        	//对请求进行路由
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);
            return null;
        } else {
        	LOGGER.warn("token is empty");
            //不对请求进行路由
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

Activar el filtro, iniciar programas tales ZuulFilterApplication añadir frijol

  • ZuulApplication.java
package org.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
    
    @Bean
    public TokenFilter TokenFilter() {
        return new TokenFilter();
    }
}

Después de reiniciar el proyecto, visita http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq
Aquí Insertar imagen Descripción
testigo se le solicita está vacía.

Acceso http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc
Aquí Insertar imagen Descripción
visto, después de la inyección del recipiente de granos TokenFilter COI, la filtración de la solicitud, y una solicitud lógica de enrutamiento determina antes de reenvío .

token de punta es pantalla vacía de error dos veces

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
La costumbre de TokenFilter @Component cancelarla, no deje que la gestión de contenedores de primavera.

filtro PasswordFilter

Aquí Insertar imagen Descripción

  • PasswordFilter.java
package org.springcloud.zuul;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;

public class PasswordFilter extends ZuulFilter {

    private final Logger LOGGER = LoggerFactory.getLogger(PasswordFilter.class);

    @Override
    public String filterType() {
    	//请求已被路由到微服务后执行
        return "post";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        //判断上一个过滤器结果为true,否则就不走下面过滤器,直接跳过后面的所有过滤器并返回 上一个过滤器不通过的结果
        return (boolean) ctx.get("isSuccess");     
    }

    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        LOGGER.info("--->>> PasswordFilter {},{}", request.getMethod(), request.getRequestURL().toString());

        String username = request.getParameter("password");
        if (null != username && username.equals("123456")) {
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            ctx.set("isSuccess", true);
            return null;
        } else {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("The password cannot be empty");
            } catch (IOException e) {
                e.printStackTrace();
            }
            ctx.set("isSuccess", false);
            return null;
        }
    }
}

Activar el filtro, iniciar programas tales ZuulFilterApplication añadir frijol

  • ZuulApplication.java
package org.springcloud.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
    
    @Bean
    public TokenFilter TokenFilter() {
        return new TokenFilter();
    }

    @Bean
    public PasswordFilter PasswordFilter() {
        return new PasswordFilter();
    }
}

acceso http://eureka-zuul.com:8120/v1/hiapi/hi?name=zhaojq&token=cc&password=123456
Aquí Insertar imagen Descripción

Publicado 72 artículos originales · ganado elogios 66 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/miaodichiyou/article/details/104398229
Recomendado
Clasificación