指标

  • 把握微服务网关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@EnableEurekaClientpublic 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= 1server:  port: 9101eureka:  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= 1server:  port: 9101eureka:  client:    service-url:      defaultZone: http://127.0.0.1:6868/eureka  instance:    prefer-ip-address: true

1.4 微服务网关过滤器

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

1)changgou_gateway_system创立IpFilter

@Componentpublic 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

@Componentpublic 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@EnableEurekaClientpublic 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= 1server:  port: 9101eureka:  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= 1server:  port: 9101eureka:  client:    service-url:      defaultZone: http://127.0.0.1:6868/eureka  instance:    prefer-ip-address: true

1.4 微服务网关过滤器

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

1)changgou_gateway_system创立IpFilter

@Componentpublic 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

@Componentpublic 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;    }}

测试,察看控制台输入。