当前位置: 首页 > 后端技术 > Java

微服务网关认证:网关使用,网关限流使用,用户密码加密,JWT认证

时间:2023-04-01 23:28:02 Java

goal掌握微服务网关Gateway的系统搭建掌握网关限流的实现会使用BCrypt实现密码的加密和验证了解加密算法可以使用JWT实现微服务认证一、微服务网关Gateway1.1微服务网关概述不同的微服务一般有不同的网络地址,外部客户端可能需要调用多个服务接口来完成一个业务需求,如果客户端直接与各种通信微服务,会存在以下问题:客户端会多次请求不同的微服务,增加了客户端的复杂度。存在跨域请求,相对复杂的鉴权在某些场景下处理复杂,每个服务都需要独立的认证,很难重构。随着项目迭代,可能需要重新划分微服务。例如,可以将多个服务合并为一个或将一个服务拆分为多个。如果客户端直接和微服务通信,那么重构就很难实现。一些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会很困难。以上问题都可以借助网关来解决。网关是客户端和服务器之间的中间层,所有外部请求都会先经过网关。也就是说,API的实现更多的考虑了业务逻辑,而安全、性能、监控都可以由网关来完成,既提高了业务的灵活性,又不缺乏安全性。典型的架构图如图所示:优点如下:安全,对外只暴露网关系统,微服务可以在内网隐藏,有防火墙保护。易于监控。监控数据可以在网关收集并推送到外部系统进行分析。易于验证。可以在将请求转发到后端微服务之前在网关上完成身份验证,而不是在每个微服务中进行身份验证。减少了客户端与各个微服务的交互次数,便于统一授权。总结:微服务网关是一个系统。通过暴露微服务网关系统,方便我们进行相关的认证、安全控制、统一的日志处理,以及易于监控的相关功能。实现微服务网关的技术有很多。nginxNginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务。Zuul,Zuul是一个基于JVM的路由和服务器端负载均衡器。spring-cloud-gateway,spring出品的基于spring的网关项目,集成了断路器,路径重写,性能优于Zuul。我们利用网关技术无缝对接基于springcloud的微服务开发。网关官网:https://spring.io/projects/sp...1.2微服务网关微服务搭建由于我们开发的系统包括前台系统和后台系统,后台系统供管理员使用。然后还需要调用各种微服务,所以我们为管理后台搭建一个网关微服务。分析如下:构建步骤:1)在changgou_gateway项目中,创建changgou_gateway_system项目,pom.xml:org.springframework.cloudspring-cloud-starter-gatewayorg.springframework.cloudspring-cloud-starter-netflix-hystrix组织.springframework.cloudspring-cloud-starter-netflix-eureka-client2)创建包com.changgou,创建启动类:GatewayApplication@SpringBootApplication@EnableEurekaClient公共类GatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayApplication.class,args);}}3)在resources下创建application.ymlspring:application:name:sysgatewaycloud:gateway:routes:-id:goodsuri:lb://goodspredicates:-Path=/goods/**filters:-StripPrefix=1-id:systemuri:lb://systempredicates:-Path=/system/**filters:-StripPrefix=1server:port:9101eureka:客户端:service-url:defaultZone:http://127.0.0.1:6868/eurekainstance: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:sysgatewaycloud:gateway:globalcors:cors-configurations:'[/**]':#匹配所有请求allowedOrigins:"*"#跨域处理允许所有域allowedMethods:#支持的方法-GET-POST-PUT-DELETEroutes:-id:goodsuri:lb://goodspredicates:-Path=/goods/**filters:-StripPrefix=1server:port:9101eureka:client:service-url:defaultZone:http://127.0.0.1:6868/eureka实例:prefer-ip-address:true1.4微服务网关过滤器我们可以通过网关过滤器实现一些逻辑处理,比如ip黑白名单拦截,特定地址拦截等,下面代码中,做了两个过滤器,并设置按照顺序只演示过滤和运行效果。(具体逻辑处理有同学实现)1)changgou_gateway_systemcreatesIpFilter@ComponentpublicclassIpFilterimplementsGlobalFilter,Ordered{@OverridepublicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){System.out.println("第一个之后过滤IpFilter");ServerHttpRequest请求=exchange.getRequest();InetSocketAddressremoteAddress=request.getRemoteAddress();System.out.println("ip:"+remoteAddress.getHostName());返回chain.filter(exchange);}@OverridepublicintgetOrder(){返回1;}}2)changgou_gateway_system创建UrlFilter@ComponentpublicclassUrlFilterimplementsGlobalFilter,Ordered{@OverridepublicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){printlnSystem.out二次过滤后UrlFilter");ServerHttpRequestrequest=exchange.getRequest();Stringurl=request.getURI().getPath();System.out.println("url:"+url);返回chain.filter(exchange);}@OverridepublicintgetOrder(){返回2;}}测试,观察控制台输出目标掌握微服务网关的系统Gateway构建并掌握网关限流的实现可以使用BCrypt实现密码的加密和校验了解加密算法可以使用JWT实现微服务认证1.微服务网关1.1微服务网关概述不同的微服务一般都有不同的网络地址,外部客户端可能需要调用多个服务接口来完成一个业务需求。如果客户端直接与各个微服务通信,会存在以下问题:客户端会多次请求不同的微服务,增加了客户端跨域请求的复杂度。在某些场景下,相对复杂的认证处理起来会比较复杂。每个服务都需要独立的身份验证,并且难以重构。随着项目的迭代,可能需要重新划分微服务。例如,可以将多个服务合并为一个或将一个服务拆分为多个。如果客户端直接和微服务通信,那么重构就很难实现。一些微服务可能使用了防火墙/浏览器不友好的协议,直接访问会很困难。以上问题都可以借助网关来解决。网关是客户端和服务器之间的中间层,所有外部请求都会先经过网关。也就是说,API的实现更多的考虑了业务逻辑,而安全、性能、监控都可以由网关来完成,既提高了业务的灵活性,又不缺乏安全性。典型的架构图如图所示:优点如下:安全,对外只暴露网关系统,微服务可以在内网隐藏,有防火墙保护。易于监控。监控数据可以在网关收集并推送到外部系统进行分析。易于验证。可以在将请求转发到后端微服务之前在网关上完成身份验证,而不是在每个微服务中进行身份验证。减少了客户端与各个微服务的交互次数,便于统一授权。总结:微服务网关是一个系统。通过暴露微服务网关系统,方便我们进行相关的认证、安全控制、统一的日志处理,以及易于监控的相关功能。实现微服务网关的技术有很多,nginxNginx(enginex)是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务zuul,Zuul是一个基于JVM的路由和Server端负载平衡器。spring-cloud-gateway,spring出品的基于spring的网关项目,集成了断路器,路径重写,性能优于Zuul。我们利用网关技术无缝对接基于springcloud的微服务开发。网关官网:https://spring.io/projects/sp...1.2微服务网关微服务搭建由于我们开发的系统包括前台系统和后台系统,后台系统供管理员使用。然后还需要调用各种微服务,所以我们为管理后台搭建一个网关微服务。分析如下:构建步骤:1)在changgou_gateway项目中,创建changgou_gateway_system项目,pom.xml:org.springframework.cloudspring-cloud-starter-gatewayorg.springframework.cloudspring-cloud-starter-netflix-hystrix组织.springframework.cloudspring-cloud-starter-netflix-eureka-client2)创建包com.changgou,创建启动类:GatewayApplication@SpringBootApplication@EnableEurekaClient公共类GatewayApplication{publicstaticvoidmain(String[]args){SpringApplication.run(GatewayApplication.class,args);}}3)在resources下创建application.ymlspring:application:name:sysgatewaycloud:gateway:routes:-id:goodsuri:lb://goodspredicates:-Path=/goods/**filters:-StripPrefix=1-id:systemuri:lb://systempredicates:-Path=/system/**filters:-StripPrefix=1server:port:9101eureka:客户端:service-url:defaultZone:http://127.0.0.1:6868/eurekainstance: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:sysgatewaycloud:gateway:globalcors:cors-configurations:'[/**]':#匹配所有请求allowedOrigins:"*"#跨域处理允许所有域allowedMethods:#支持的方法-GET-POST-PUT-DELETEroutes:-id:goodsuri:lb://goodspredicates:-Path=/goods/**filters:-StripPrefix=1server:port:9101eureka:client:service-url:defaultZone:http://127.0.0.1:6868/eureka实例:prefer-ip-address:true1.4微服务网关过滤器我们可以通过网关过滤器实现一些逻辑处理,比如ip黑白名单拦截,特定地址拦截等,下面代码中,做了两个过滤器,并设置按照顺序只演示过滤和运行效果。(具体逻辑处理有同学自己实现)1)changgou_gateway_systemcreatesIpFilter@ComponentpublicclassIpFilterimplementsGlobalFilter,Ordered{@OverridepublicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){System.out.println("第一个之后过滤IpFilter");ServerHttpRequest请求=exchange.getRequest();InetSocketAddressremoteAddress=request.getRemoteAddress();System.out.println("ip:"+remoteAddress.getHostName());返回chain.filter(exchange);}@OverridepublicintgetOrder(){返回1;}}2)changgou_gateway_system创建UrlFilter@ComponentpublicclassUrlFilterimplementsGlobalFilter,Ordered{@OverridepublicMonofilter(ServerWebExchangeexchange,GatewayFilterChainchain){printlnSystem.out二次过滤后UrlFilter");ServerHttpRequestrequest=exchange.getRequest();Stringurl=request.getURI().getPath();System.out.println("url:"+url);返回chain.filter(exchange);}@OverridepublicintgetOrder(){返回2;}}测试,观察控制台输出