乐趣区

关于微服务:微服务网关鉴权gateway使用网关限流使用用户密码加密JWT鉴权

指标

  • 把握微服务网关 Gateway 的零碎搭建
  • 把握网关限流的实现
  • 可能应用 BCrypt 实现对明码的加密与验证
  • 理解加密算法
  • 可能应用 JWT 实现微服务鉴权

1. 微服务网关 Gateway

1.1 微服务网关概述

不同的微服务个别会有不同的网络地址,而内部客户端可能须要调用多个服务的接口能力实现一个业务需要,如果让客户端间接与各个微服务通信,会有以下的问题:

  • 客户端会屡次申请不同的微服务,减少了客户端的复杂性
  • 存在跨域申请,在肯定场景下解决绝对简单
  • 认证简单,每个服务都须要独立认证
  • 难以重构,随着我的项目的迭代,可能须要从新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端间接与微服务通信,那么重构将会很难施行
  • 某些微服务可能应用了防火墙 / 浏览器不敌对的协定,间接拜访会有肯定的艰难

以上这些问题能够借助网关解决。

网关是介于客户端和服务器端之间的中间层,所有的内部申请都会先通过 网关这一层。也就是说,API 的实现方面更多地思考业务逻辑,而平安、性能、监控能够交由 网关来做,这样既进步业务灵活性又不缺安全性,典型的架构图如图所示:

长处如下:

  • 平安,只有网关零碎对外进行裸露,微服务能够暗藏在内网,通过防火墙爱护。
  • 易于监控。能够在网关收集监控数据并将其推送到内部零碎进行剖析。
  • 易于认证。能够在网关上进行认证,而后再将申请转发到后端的微服务,而无须在每个微服务中进行认证。
  • 缩小了客户端与各个微服务之间的交互次数
  • 易于对立受权。

总结:微服务网关就是一个零碎,通过裸露该微服务网关零碎,不便咱们进行相干的鉴权,安全控制,日志对立解决,易于监控的相干性能。

实现微服务网关的技术有很多,

  • nginx Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务
  • zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
  • spring-cloud-gateway, 是 spring 出品的 基于 spring 的网关我的项目,集成断路器,门路重写,性能比 Zuul 好。

咱们应用 gateway 这个网关技术,无缝连接到基于 spring cloud 的微服务开发中来。

gateway 官网:

https://spring.io/projects/sp…

1.2 微服务网关微服务搭建

因为咱们开发的零碎 有包含前台零碎和后盾零碎,后盾的零碎给管理员应用。那么也须要调用各种微服务,所以咱们针对治理后盾搭建一个网关微服务。剖析如下:

搭建步骤:

1)在 changgou_gateway 工程中,创立 changgou_gateway_system 工程,pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)创立包 com.changgou , 创立疏导类:GatewayApplication

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);
    }
}

3)在 resources 下创立 application.yml

spring:
  application:
    name: sysgateway
  cloud:
    gateway:
      routes:
      - id: goods
        uri: lb://goods
        predicates:
        - Path=/goods/**
        filters:
        - StripPrefix= 1
      - id: system
        uri: lb://system
        predicates:
        - Path=/system/**
        filters:
        - StripPrefix= 1
server:
  port: 9101
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka
  instance:
    prefer-ip-address: true

参考官网手册:

https://cloud.spring.io/sprin…

1.3 微服务网关跨域

批改 application.yml,在 spring.cloud.gateway 节点增加配置,

globalcors:
  cors-configurations:
    '[/**]': # 匹配所有申请
      allowedOrigins: "*" #跨域解决 容许所有的域
      allowedMethods: # 反对的办法
      - GET
      - POST
      - PUT
      - DELETE

最终配置文件如下:

spring:
  application:
    name: sysgateway
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有申请
            allowedOrigins: "*" #跨域解决 容许所有的域
            allowedMethods: # 反对的办法
            - GET
            - POST
            - PUT
            - DELETE
      routes:
      - id: goods
        uri: lb://goods
        predicates:
        - Path=/goods/**
        filters:
        - StripPrefix= 1
server:
  port: 9101
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka
  instance:
    prefer-ip-address: true

1.4 微服务网关过滤器

咱们能够通过网关过滤器,实现一些逻辑的解决,比方 ip 黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)

1)changgou_gateway_system 创立 IpFilter

@Component
public class IpFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("通过第 1 个过滤器 IpFilter");
        ServerHttpRequest request = exchange.getRequest();
        InetSocketAddress remoteAddress = request.getRemoteAddress();
        System.out.println("ip:"+remoteAddress.getHostName());
        return chain.filter(exchange);
    }

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

2)changgou_gateway_system 创立 UrlFilter

@Component
public class UrlFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("通过第 2 个过滤器 UrlFilter");
        ServerHttpRequest request = exchange.getRequest();
        String url = request.getURI().getPath();
        System.out.println("url:"+url);
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {return 2;}
}

测试,察看控制台输入。

指标

  • 把握微服务网关 Gateway 的零碎搭建
  • 把握网关限流的实现
  • 可能应用 BCrypt 实现对明码的加密与验证
  • 理解加密算法
  • 可能应用 JWT 实现微服务鉴权

1. 微服务网关 Gateway

1.1 微服务网关概述

不同的微服务个别会有不同的网络地址,而内部客户端可能须要调用多个服务的接口能力实现一个业务需要,如果让客户端间接与各个微服务通信,会有以下的问题:

  • 客户端会屡次申请不同的微服务,减少了客户端的复杂性
  • 存在跨域申请,在肯定场景下解决绝对简单
  • 认证简单,每个服务都须要独立认证
  • 难以重构,随着我的项目的迭代,可能须要从新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端间接与微服务通信,那么重构将会很难施行
  • 某些微服务可能应用了防火墙 / 浏览器不敌对的协定,间接拜访会有肯定的艰难

以上这些问题能够借助网关解决。

网关是介于客户端和服务器端之间的中间层,所有的内部申请都会先通过 网关这一层。也就是说,API 的实现方面更多地思考业务逻辑,而平安、性能、监控能够交由 网关来做,这样既进步业务灵活性又不缺安全性,典型的架构图如图所示:

长处如下:

  • 平安,只有网关零碎对外进行裸露,微服务能够暗藏在内网,通过防火墙爱护。
  • 易于监控。能够在网关收集监控数据并将其推送到内部零碎进行剖析。
  • 易于认证。能够在网关上进行认证,而后再将申请转发到后端的微服务,而无须在每个微服务中进行认证。
  • 缩小了客户端与各个微服务之间的交互次数
  • 易于对立受权。

总结:微服务网关就是一个零碎,通过裸露该微服务网关零碎,不便咱们进行相干的鉴权,安全控制,日志对立解决,易于监控的相干性能。

实现微服务网关的技术有很多,

  • nginx Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务
  • zuul ,Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
  • spring-cloud-gateway, 是 spring 出品的 基于 spring 的网关我的项目,集成断路器,门路重写,性能比 Zuul 好。

咱们应用 gateway 这个网关技术,无缝连接到基于 spring cloud 的微服务开发中来。

gateway 官网:

https://spring.io/projects/sp…

1.2 微服务网关微服务搭建

因为咱们开发的零碎 有包含前台零碎和后盾零碎,后盾的零碎给管理员应用。那么也须要调用各种微服务,所以咱们针对治理后盾搭建一个网关微服务。剖析如下:

搭建步骤:

1)在 changgou_gateway 工程中,创立 changgou_gateway_system 工程,pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2)创立包 com.changgou , 创立疏导类:GatewayApplication

@SpringBootApplication
@EnableEurekaClient
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);
    }
}

3)在 resources 下创立 application.yml

spring:
  application:
    name: sysgateway
  cloud:
    gateway:
      routes:
      - id: goods
        uri: lb://goods
        predicates:
        - Path=/goods/**
        filters:
        - StripPrefix= 1
      - id: system
        uri: lb://system
        predicates:
        - Path=/system/**
        filters:
        - StripPrefix= 1
server:
  port: 9101
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka
  instance:
    prefer-ip-address: true

参考官网手册:

https://cloud.spring.io/sprin…

1.3 微服务网关跨域

批改 application.yml,在 spring.cloud.gateway 节点增加配置,

globalcors:
  cors-configurations:
    '[/**]': # 匹配所有申请
      allowedOrigins: "*" #跨域解决 容许所有的域
      allowedMethods: # 反对的办法
      - GET
      - POST
      - PUT
      - DELETE

最终配置文件如下:

spring:
  application:
    name: sysgateway
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]': # 匹配所有申请
            allowedOrigins: "*" #跨域解决 容许所有的域
            allowedMethods: # 反对的办法
            - GET
            - POST
            - PUT
            - DELETE
      routes:
      - id: goods
        uri: lb://goods
        predicates:
        - Path=/goods/**
        filters:
        - StripPrefix= 1
server:
  port: 9101
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka
  instance:
    prefer-ip-address: true

1.4 微服务网关过滤器

咱们能够通过网关过滤器,实现一些逻辑的解决,比方 ip 黑白名单拦挡、特定地址的拦挡等。上面的代码中做了两个过滤器,并且设定的先后顺序,只演示过滤器与运行成果。(具体逻辑解决局部学员实现)

1)changgou_gateway_system 创立 IpFilter

@Component
public class IpFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("通过第 1 个过滤器 IpFilter");
        ServerHttpRequest request = exchange.getRequest();
        InetSocketAddress remoteAddress = request.getRemoteAddress();
        System.out.println("ip:"+remoteAddress.getHostName());
        return chain.filter(exchange);
    }

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

2)changgou_gateway_system 创立 UrlFilter

@Component
public class UrlFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("通过第 2 个过滤器 UrlFilter");
        ServerHttpRequest request = exchange.getRequest();
        String url = request.getURI().getPath();
        System.out.println("url:"+url);
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {return 2;}
}

测试,察看控制台输入。

退出移动版