Spring Cloud微服务安全实战_6-1_微服务之间的通讯安全之概述

到目前为止已经实现了一个基于微服务的,前后端分离(这里我用的jquery做的,并不是真的前后端分离,因为我不会vue和angular所以没用)的架构。在网关上做了限流、认证、审计、授权等安全机制,在前端应用上也做了SSO单点登录,

现在的架构存在的问题是:

1,在网关做限流。

  在网关上做限流是有问题的,比如订单服务限流是100,库存服务限流也是100,订单服务又调了库存服务。如果网关上给订单转了100个请求,给库存转了100个请求,订单又调了库存,这时候库存就同时接到了200个请求,库存服务就可能挂掉了。

2,身份认证。

  现在的做法是,经过了一个OAuth流程以后,给前端服务器发了一个令牌。每次前端发请求的时候都会拿着这个令牌,在网关上,会调用认证服务器校验这个令牌,对应的用户信息是什么。然后在请求头里放了username,去调用其他微服务,其他微服务从请求头里获取到username,就知道当前用户是谁了。

  存在的问题是

  a) 效率低,在网关上每一个请求都要去认证服务器验令牌。多一次网络请求的开销,认证服务器压力也会变大,同时认证服务器要保证高可用,一旦认证服务器挂了,所有请求就没法验令牌了,所有请求就都没法处理了。

  b) 不安全,在代码里传递用户信息的时候,是在请求头里加了个用户名username字段,网关转发到订单服务,是在授权过滤器(最后一个过滤器)里,将token里的username字段放在了请求头,订单服务从请求头拿出来username,就认为是谁。这样其实是不安全的,你说你是张三,订单服务就认为你是张三,你说你是李四,订单服务就认为你是李四。【不能根据请求/请求头里的一个明文的参数来判断一个用户是谁的】  

  

  c)用户身份传递麻烦。网关调用订单服务,在请求头放了一个username,订单服务再调用库存服务,需要再将用户名放入请求参数,库存服务才能知道用户是谁,传递起来比较麻烦。

3,授权。

  授权的问题和限流的问题类似,在网关上,你控制住了只能调用订单服务,但是订单服务又调用了库存服务。你一访问订单服务实际上又访问到了库存服务了。权限实际上是越权了,没控制住。

4,服务雪崩

  通关网关进行调用的时候,当一个服务出现问题的时候,把其他服务都给带死了。比如因为某些原因(网络,数据库),库存服务的响应变慢了,就会导致订单服务也变慢,然后所有调库存服务的服务都变慢,这堆线程都在这等待着,然后这些线程可能又都是通过网关进来的,所以网关上也有一堆线程等待着,最后导致网关上所有的线程都被占住,导致大量的服务都不可用,但是最根上只是一个库存服务导致的。这就是服务雪崩。

本章就是要解决这些个问题。

代码  https://github.com/lhy1234/springcloud-security

原文地址:https://www.cnblogs.com/lihaoyang/p/12203586.html

时间: 2024-08-30 11:30:41

Spring Cloud微服务安全实战_6-1_微服务之间的通讯安全之概述的相关文章

Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持:同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者最近频繁宣布各组件不在更新新特性,这使得Spring Cloud Alibaba关注度不断飙升,不少开发者或团队也开始小范围试水.笔者对此

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务.当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client或者Spring的RestTemplate. 那么,为什么我们要使用Feign呢? 首先我们的项目使用了SpringCloud技术,而Feign可以和SpringCloud技术无缝整合.并且,你一

实战:基于spring cloud + docker构建微服务

本系列记录学习 spring-cloud-microservice-example的实战过程,并对利用spring cloud + docker 构建端到端的微服务架构技术进行解析. 0.安装前的准备,下列软件需要安装. Maven 3 Java 8 Docker Docker Compose 我的环境 Ubuntu 16.04 Java openjdk 1.8.0 Docker 18.03.1-ce docker-compose 1.8.0 1.克隆或复制工程 $ docker clone h

Spring-Boot:Spring Cloud构建微服务架构

概述: 从上一篇博客<Spring-boot:5分钟整合Dubbo构建分布式服务> 过度到Spring Cloud,我们将开始学习如何使用Spring Cloud 来搭建微服务.继续采用上一篇博客中所使用到的图: 我们先来观察一下Spring Cloud 的组成,从上图中可以发现,Spring Cloud 的服务会比Dubbo 完善太多,Spring Cloud 包括了配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等一系列的服务.在后续,我们

关于Spring Cloud微服务架构

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud

介绍一下Spring Cloud微服务架构的核心特性

Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功能对微服务的架构提供了怎样的便利? 传统架构发展史 单体架构 单体架构在小微企业比较常见,典型代表就是一个应用.一个数据库.一个web容器就可以跑起来,比如我们开发的开源软件云收藏,就是标准的单体架构. 在两种情况下可能会选择

关于Spring Cloud微服务架构核心组件

微服务架构 Spring Cloud解决的第一个问题就是:服务与服务之间的解耦.很多公司在业务高速发展的时候,服务组件也会相应的不断增加.服务和服务之间有着复杂的相互调用关系,经常有服务A调用服务B,服务B调用服务C和服务D ...,随着服务化组件的不断增多,服务之间的调用关系成指数级别的增长,这样最容易导致的情况就是牵一发而动全身.经常出现由于某个服务更新而没有通知到其它服务,导致上线后惨案频发.这时候就应该进行服务治理,将服务之间的直接依赖转化为服务对服务中心的依赖.Spring Cloud

Spring Cloud构建微服务架构:服务消费(基础)

使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient.这里我们即将介绍的LoadBalancerClient等.对于这些接口的定义我们在上一篇介绍服务注册与发现时已经说过,Spring Cloud做这一层抽象,很好的解耦了服务治理体系,使得我们可以轻易的替换不同的服务治理设施. 从LoadBalancerClient接口的命名中,我们就知道这是一个负载均衡客户端的抽象定义,下面我们就看看如何