工业互联网平台APP开发七大核心技术-熊猫出海
工业互联网平台APP开发涉及七大关键技术,它们是数据集成与边缘处理技术、IaaS技术、平台使能技术、数据管理技术、应用开发和微服务技术、工业数据建模与分析技术、安全技术。
数据集成与边缘处理技术包括设备接入、协议转换、边缘数据处理。
设备接入运用工业以太网、工业总线等协议,通过通用协议或无线协议将工业现场设备接入平台。
协议转换则兼容ModBus、OPC等协议,实现数据格式转换和统一传输。
边缘数据处理基于高性能计算芯片等技术,进行数据预处理、存储与智能分析。
IaaS技术以虚拟化、分布式存储等技术实现资源池化管理,提供弹性分配与安全隔离服务。
平台使能技术涉及资源调度与多租户管理,实现应用动态适应与隔离。
数据管理技术包括数据处理框架、预处理与存储管理。
利用Hadoop等架构处理海量数据,清洗原始数据以提供高质量数据源。
通过分布式文件系统等引擎实现数据的存储与管理。
应用开发与微服务技术支持多语言、工具集成与图形化编程,构建高效便捷的开发环境。
微服务架构提供服务管理机制,支持“松耦合”应用开发。
图形化编程简化流程,支持应用创建与扩展。
工业数据建模与分析技术运用数据分析算法与机理建模,实现历史、实时、时序数据的分析。
算法涉及数学统计、机器学习及AI,机理建模融合工业知识与经验。
安全技术包含数据接入安全、平台安全与访问安全。
通过防火墙、加密等技术保障源头与传输安全,实施访问权限限制,保护重要资源。
这七大技术领域正推动工业互联网平台的构建与应用创新,加速平台层PaaS技术、边缘计算与应用层微服务的变革,促进工业机理与数据科学的深度融合。
5种微服务注册中心如何选型?这几个维度告诉你!
1、前言
微服务的注册中心目前主流的有以下四种:
Kubernetes
那么实际开发中到底如何选择呢?这是一个值得深入研究的事情,别着急,今天陈某就带大家深入了解一下这四类注册中心以及如何选型的问题。
这是《SpringCloud进阶》专栏第四篇文章,往期文章如下:
五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?
openFeign夺命连环9问,这谁受得了?
阿里面试这样问:Nacos、Apollo、Config配置中心如何选型?这10个维度告诉你!
2、为什么需要注册中心?
随着单体应用拆分,首当面临的第一份挑战就是服务实例的数量较多,并且服务自身对外暴露的访问地址也具有动态性。可能因为服务扩容、服务的失败和更新等因素,导致服务实例的运行时状态经常变化,如下图:
商品详情需要调用营销、订单、库存三个服务,存在问题有:
营销、订单、库存这三个服务的地址都可能动态的发生改变,单纯只使用配置的形式需要频繁的变更,如果是写到配置文件里面还需要重启系统,这对生产来说太不友好了
服务是集群部署的形式调用方负载均衡如何去实现
解决第一个问题办法就是用我们用伟人说过一句话,没有什么是加一个中间层解决不了的,这个中间层就是我们的注册中心。
解决第二问题就是关于负载均衡的实现,这个需要结合我们中间层老大哥来实现。
3、如何实现一个注册中心?
对于如何实现注册中心这个问题,首先将服务之间是如何交互的模型抽象出来,我们结合实际的案例来说明这个问题,以商品服务为例:
当我们搜索商品的时候商品服务就是提供者;
当我们查询商品详情的时候即服务的提供者又是服务的消费者,消费是订单、库存等服务;由此我们需要引入的三个角色就是:中间层(注册中心)、生产者、消费者,如下图:
整体的执行流程如下:
在服务启动时,服务提供者通过内部的注册中心客户端应用自动将自身服务注册到注册中心,包含主机地址、服务名称等等信息;
在服务启动或者发生变更的时候,服务消费者的注册中心客户端程序则可以从注册中心中获取那些已经注册的服务实例信息或者移除已下线的服务;
上图还多一个设计缓存本地路由,缓存本地路由是为了提高服务路由的效率和容错性,服务消费者可以配备缓存机制以加速服务路由。
更重要的是,当服务注册中心不可用时,服务消费者可以利用本地缓存路由实现对现有服务的可靠调用。
在整个执行的过程中,其中有点有一点是比较难的,就是服务消费者如何及时知道服务的生产者如何及时变更的,这个问题也是经典的生产者消费者的问题,解决的方式有两种:
发布-订阅模式:服务消费者能够实时监控服务更新状态,通常采用监听器以及回调机制,经典的案例就是Zookeeper;
主动拉取策略:服务的消费者定期调用注册中心提供的服务获取接口获取最新的服务列表并更新本地缓存,经典案例就是Eureka;
对于如何选择这两种方式,其实还有一个数据一致性问题可以聊聊,比如选择定时器肯定就抛弃了一致性,最求的是最终一致,这里就不深入展开了,另外你可能还会说服务的移除等等这些功能都没介绍,在我看来那只是一个附加功能,注册中心重点还是在于服务注册和发现,其他都是锦上添花罢了。
负载均衡的实现有两种方式:
服务端的负载均衡;
客户端的负载均衡;对于实现的方案来说本质上是差不多的,只是说承接的载体不一样,一个是服务端,一个客户端,如下图:
服务端的负载均衡,给服务提供者更强的流量控制权,但是无法满足不同的消费者希望使用不同负载均衡策略的需求。
客户端的负载均衡则提供了这种灵活性,并对用户扩展提供更加友好的支持。
但是客户端负载均衡策略如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务提供者。
服务端负载均衡典型的代表就是Nginx,客户端负载均衡典型代表是Ribbon,每种方式都有经典的代表,我们都是可以深入学习的。
常见的负载均衡器的算法的实现,常见的算法有以下六种:
1、轮询法
将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2、随机法
通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。
由概率统计理论可以得知,随着客户端调用服务端的次数增多;其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
3、哈希算法
哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。
采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
4、加权轮询法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。
给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
5.加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。
不同的是,它是按照权重随机请求后端服务器,而非顺序。
6.最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
5、注册中心如何选型?
现在注册中心的选择也是五花八门,现阶段比较流行有以下几种:
在介绍这个之前大家有些需要了解的知识有CAP、Paxos、Raft算法这里我就不进行过多介绍了。
开始介绍以上5种实现注册中心的方式。
1、Zookeeper
这个说起来有点意思的是官方并没有说他是一个注册中心,但是国内Dubbo场景下很多都是使用Zookeeper来完成了注册中心的功能。
当然这有很多历史原因,这里我们就不追溯了,我还是来聊聊作为注册中心使用的情况下,Zookeeper有哪些表现吧。
1、三种角色
Leader角色:一个Zookeeper集群同一时间只会有一个实际工作的Leader,它会发起并维护与各Follwer及Observer间的心跳。
所有的写操作必须要通过Leader完成再由Leader将写操作广播给其它服务器。
Follower角色:一个Zookeeper集群可能同时存在多个Follower,它会响应Leader的心跳。
Follower可直接处理并返回客户端的读请求,同时会将写请求转发给Leader处理,并且负责在Leader处理写请求时对请求进行投票。
Observer角色:与Follower类似,但是无投票权。
2、四种节点
PERSISTENT-持久节点:除非手动删除,否则节点一直存在于Zookeeper上
EPHEMERAL-临时节点:临时节点的生命周期与客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
PERSISTENT_SEQUENTIAL-持久顺序节点:基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
EPHEMERAL_SEQUENTIAL-临时顺序节点:基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
3、一种机制
Zookeeper的Watch机制,是一个轻量级的设计。
因为它采用了一种推拉结合的模式。
一旦服务端感知主题变了,那么只会发送一个事件类型和节点信息给关注的客户端,而不会包括具体的变更内容,所以事件本身是轻量级的,这就是推的部分。
然后,收到变更通知的客户端需要自己去拉变更的数据,这就是拉的部分。
Zookeeper如何实现注册中心?
简单来讲,Zookeeper可以充当一个服务注册表(ServiceRegistry),让多个服务提供者形成一个集群,让服务消费者通过服务注册表获取具体的服务访问地址(ip+端口)去访问具体的服务提供者。如下图所示:
每当一个服务提供者部署后都要将自己的服务注册到zookeeper的某一路径上:/{service}/{version}/{ip:port}。
比如我们的HelloWorldService部署到两台机器,那么Zookeeper上就会创建两条目录:
/HelloWorldService/1.0.0/100.19.20.01
HelloWorldService/1.0.0/100.19.20.02。
这么描述有点不好理解,下图更直观,
在Zookeeper中,进行服务注册,实际上就是在Zookeeper中创建了一个Znode节点,该节点存储了该服务的IP、端口、调用方式(协议、序列化方式)等。
该节点承担着最重要的职责,它由服务提供者(发布服务时)创建,以供服务消费者获取节点中的信息,从而定位到服务提供者真正IP,发起调用。
通过IP设置为临时节点,那么该节点数据不会一直存储在ZooKeeper服务器上。
当创建该临时节点的客户端会话因超时或发生异常而关闭时,该节点也相应在ZooKeeper服务器上被删除,剔除或者上线的时候会触发Zookeeper的Watch机制,会发送消息给消费者,因此就做到消费者信息的及时更新。
Zookeeper从设计上来说的话整体遵循的CP的原则,在任何时候对Zookeeper的访问请求能得到一致的数据结果,同时系统对网络分区具备容错性,在使用Zookeeper获取服务列表时,如果此时的Zookeeper集群中的Leader宕机了,该集群就要进行Leader的选举,又或者Zookeeper集群中半数以上服务器节点不可用(例如有三个节点,如果节点一检测到节点三挂了,节点二也检测到节点三挂了,那这个节点才算是真的挂了),那么将无法处理该请求。
所以说,Zookeeper不能保证服务可用性。
2、Eureka
Netflix我感觉应该是在酝酿更好的东西的,下面我们重点还是来介绍Ereka1.x相关的设计。
Eureka由两个组件组成:Eureka服务端和Eureka客户端。
Eureka服务器用作服务注册服务器。
Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。
Eureka的基本架构,由3个角色组成:1、EurekaServer
提供服务注册和发现功能;
2、ServiceProvider服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到;
3、ServiceConsumer服务消费方,从Eureka获取注册服务列表,从而能够消费服务
Eureka在设计时就紧遵AP原则,EurekaServer可以运行多个实例来构建集群,解决单点问题,实例之间通过彼此互相注册来提高可用性,是一种去中心化的架构,无master/slave之分,每一个实例都是对等的,每个节点都可被视为其他节点的副本。
在集群环境中如果某台EurekaServer宕机,EurekaClient的请求会自动切换到新的EurekaServer节点上,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。
当节点开始接受客户端请求时,所有的操作都会在节点间进行复制操作,将请求复制到该EurekaServer当前所知的其它所有节点中。
当一个新的EurekaServer节点启动后,会首先尝试从邻近节点获取所有注册列表信息,并完成初始化。
EurekaServer通过getEurekaServiceUrls()方法获取所有的节点,并且会通过心跳契约的方式定期更新。
默认情况下,如果EurekaServer在一定时间内没有接收到某个服务实例的心跳(默认周期为30秒),EurekaServer将会注销该实例(默认为90秒,-expiration-duration-in-seconds进行自定义配置)。
当EurekaServer节点在短时间内丢失过多的心跳时,那么这个节点就会进入自我保护模式,这个测试环境的时候需要注意一下。
Eureka的集群中,只要有一台Eureka还在,就能保证注册服务可用,只不过查到的信息可能不是最新的(不保证强一致性)。
除此之外,Eureka还有一种自我保护机制,如果在15分钟内超过85%的节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,此时会出现以下几种情况:
Eureka不再从注册表中移除因为长时间没有收到心跳而过期的服务;
Eureka仍然能够接受新服务注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
当网络稳定时,当前实例新注册的信息会被同步到其它节点中。
3、Nacos
Nacos无缝支持一些主流的开源生态,如下图:
Nacos致力于帮助您发现、配置和管理微服务。
Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。
Nacos是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
Nacos除了服务的注册发现之外,还支持动态配置服务。
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
服务发现和服务健康监测
Nacos支持基于DNS和基于RPC的服务发现。
服务提供者使用原生SDK、OpenAPI、或一个独立的AgentTODO注册Service后,服务消费者可以使用DNSTODO或HTTP&API查找和发现服务。
Nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。
Nacos支持传输层(PING或TCP)和应用层(如HTTP、MySQL、用户自定义)的健康检查。
对于复杂的云环境和网络拓扑环境中(如VPC、边缘网络等)服务的健康检查,Nacos提供了agent上报模式和服务端主动检测2种健康检查模式。
Nacos还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos提供了一个简洁易用的UI(控制台样例Demo)帮助您管理所有的服务和应用的配置。
Nacos还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态DNS服务
动态DNS服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现API上的风险。
Nacos提供了一些简单的DNSAPIsTODO帮助您管理服务的关联域名和可用的IP:PORT列表.
服务及其元数据管理
Nacos能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的SLA以及最首要的metrics统计数据。
Nacos支持插件管理
关于Nacos数据的存储来说,支持临时也支持持久化。
关于设计来说支持CP也支持AP,对他来说只是一个命令的切换,随你玩,还支持各种注册中心迁移到Nacos,反正一句话,只要你想要的他就有。
4、Consul
Consul是HashiCorp公司推出的开源工具,Consul由Go语言开发,部署起来非常容易,只需要极少的可执行程序和配置文件,具有绿色、轻量级的特点。
Consul是分布式的、高可用的、可横向扩展的用于实现分布式系统的服务发现与配置。
Consul的特点
服务发现(ServiceDiscovery)
Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。
一些外部的服务通过Consul很容易的找到它所依赖的服务。
健康检查(HealthChecking)
Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。
操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
Key/Value存储
应用程序可以根据自己的需要使用Consul提供的Key/Value存储。
Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
安全服务通信
Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。
意图可用于定义允许哪些服务通信。
服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
多数据中心
Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
Consul支持多数据中心,在上图中有两个DataCenter,他们通过Internet互联,同时请注意为了提高通信效率,只有Server节点才加入跨数据中心的通信。
在单个数据中心中,Consul分为Client和Server两种节点(所有的节点也被称为Agent),Server节点保存数据,Client负责健康检查及转发数据请求到Server;Server节点有一个Leader和多个Follower,Leader节点会将数据同步到Follower,Server的数量推荐是3个或者5个,在Leader挂掉的时候会启动选举机制产生一个新的Leader。
集群内的Consul节点通过gossip协议(流言协议)维护成员关系,也就是说某个节点了解集群内现在还有哪些节点,这些节点是Client还是Server。
单个数据中心的流言协议同时使用TCP和UDP通信,并且都使用8301端口。
跨数据中心的流言协议也同时使用TCP和UDP通信,端口使用8302。
集群内数据的读写请求既可以直接发到Server,也可以通过Client使用RPC转发到Server,请求最终会到达Leader节点,在允许数据延时的情况下,读请求也可以在普通的Server节点完成,集群内数据的读写和复制都是通过TCP的8300端口完成。
Consul其实也可以在应用内进行注册,后续采用SpringCloud全家桶这套做负载
我们这里聊聊关于Consul的应用外的注册:
上图主要多出来两个组件,分别是Registrator和ConsulTemplate,接下来我们介绍下这两个组件如何结合可以实现在应用发进行服务发现和注册。
Registrator:一个开源的第三方服务管理器项目,它通过监听服务部署的Docker实例是否存活,来负责服务提供者的注册和销毁。
ConsulTemplate:定时从注册中心服务端获取最新的服务提供者节点列表并刷新LB配置(比如Nginx的upstream),这样服务消费者就通过访问Nginx就可以获取最新的服务提供者信息,达到动态调节负载均衡的目的。
整体架构图可能是这样:
我们用Registrator来监控每个Server的状态。
当有新的Server启动的时候,Registrator会把它注册到Consul这个注册中心上。
由于ConsulTemplate已经订阅了该注册中心上的服务消息,此时Consul注册中心会将新的Server信息推送给ConsulTemplate,ConsulTemplate则会去修改的配置文件,然后让Nginx重新载入配置以达到自动修改负载均衡的目的。
5、Kubernetes
Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务。
通过Kubernetes能够进行应用的自动化部署和扩缩容。
在Kubernetes中,会将组成应用的容器组合成一个逻辑单元以更
什么是IDaaS?一文带你全面了解IDaaS!
IDaaS身份是什么?它又存在什么样的价值?让我们一探究竟。
在构建数字身份平台的过程中,产生了IAM(IdentityandAccessManagement),即“身份识别与访问管理”。
传统IAM服务虽然解决了部分身份问题,但开发效率低,成本浪费严重。
我们每开发一个应用,就要进行一次用户系统的开发,并且实施复杂。
IDaaS是在IAM基础上加上了云计算,基于云原生架构、天然适应,实现海量数据存储,多维度保障数据安全。
本文将从以下三方面论述IDaaS的价值:
IDaaS的发展历程
IDaaS的五统能力
IDaaS背后的认证和授权基石
一、SaaS+IAM=软件即服务
软件即服务:SoftwareasaService,缩写就是我们常说的SaaS。
即服务(aaS)通常是指由别人(一般指云服务厂商)提供的服务,它可以让个人或企业专注于自身更重要的业务。
在SaaS这种软件交付模式下,软件不再需要复杂的安装部署过程,只需通过网络连接就可直接使用,软件及其数据托管在云服务厂商中,厂商将全程负责处理软件更新、漏洞修复等维护工作。
用户通常通过Web浏览器或API连接就可以使用软件。
例如腾讯云直播的SaaS方案,以及MicrosoftOffice365其实也是一种典型的针对个人用户的SaaS应用。
和SaaS对应的还有另外两种交付模式:IaaS和PaaS。
上图的湖蓝色模块代表企业需要自行实现的服务,而红色模块代表云服务厂商所提供的即用服务。
On-site,所有的一切都在用户本地部署。
IaaS,全称InfrastructureasaService,基础设施即服务。
主要提供一些基础资源,包括实际的服务器、网络、虚拟化和存储。
例如,我们买了个腾讯或阿里云服务器,在上面自行搭建所需环境并部署我们的软件。
PaaS,全称PlatformasaService,平台即服务。
主要面向开发人员,云服务厂商在提供基础设施之余,还提供业务软件的运行环境,以集成解决方案或服务的形式将该平台交付给用户。
例如,腾讯云的微服务平台TSF提供了基于SpringCloud和ServiceMesh两种微服务架构的支持。
PaaS其实也是SaaS模式的一种应用,但区别在于,SaaS面向的不是软件的开发人员,而是软件的最终用户。
有个生动形象的PizzaasaService[2]的例子可以阐述SaaS,PaaS,IaaS三者的区别。
对应上面,大抵意思就是:
On-site,在家自己做披萨;IaaS,买速食披萨回家自己做着吃;PaaS,叫外卖将披萨送到家里吃;SaaS,在披萨店吃披萨。
身份和访问管理服务
IAM全称IdentityandAccessManagement,
是一种Web服务,可以帮助用户安全地控制对资源的访问。
通俗来说,就是可以使用IAM来控制谁通过了身份验证(准许登录)并获得授权(拥有权限)来使用资源。
详细可以查看AWSIAM文档[3]。
与聘请一个保安在大厦门口相似,企业的应用程序接入IAM服务后,就可以“高枕无忧”,IAM会帮你控制谁有访问应用的权限。
身份即服务
来到本文的主角,身份即服务:IdentityasaService。
Identity就是IAM中的身份概念,asaService就是开篇介绍的SaaS。
IDaaS实际上就是一个基于SaaS模式的IAM解决方案,也就是云上的身份和访问管理服务,完全由受信任的第三方云服务厂商托管和管理。
它允许企业使用单点登录、身份验证和访问控制来提供对任意接入的已实现标准协议应用的安全访问。
根据IDaaS厂商提供的功能,某种程度下,你甚至可以认为IDaaS就是IAM。
国内目前了解到的IDaaS厂商有,腾讯云IDaaS[4],阿里云应用身份服务IDaaS[5],Authing[6]。
在云计算、云原生领域,很多时候想要了解一个产品,其实可以去上述三家企业官网看看,多参考参考他们的现成方案。
点击查看Authing开发者文档
二、IDaaS的五统能力
IDaaS的功能可以合称为5A能力[7]:Account、Authentication、Authorization、Application、Audit。
但我愿称其为五统能力:
1.统一账号管理
Account模块的管理,这块容易理解。
你想最基本的一块,应用程序要想实现单点登陆的话,
单点登录(SingleSignOn),简称为SSO,是比较流行的企业业务整合的解决方案之一。
SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
A系统使用了user1登录成功后,B系统随之也以user1的身份登录成功了。
例如淘宝和天猫两个站点。
那其账号是不是必须得统一放在一处(IDaaS)进行会话管理。
不过通常由于业务需要,应用系统和IDaaS还得做一次账号同步(SCIM/LDAP方式)。
2.统一身份认证
身份认证叫做Authentication。
更形象化就是指你在应用上通过输入账号密码、验证码或扫码等方式进行登录的这个过程。
而这个过程IDaaS所使用的认证协议会帮你做了,而且把登录页面都给做了,直接喂到你嘴里,你应用只需要重定向过来即可。
身份认证协议有很多种:OIDC/SAML等。
下文我会再着重讲述OIDC协议。
3.统一授权管理
Authorization是授权,切忌别和认证Authentication混淆。
授权是指客户端经过身份认证成功后,能够以有限的权限去访问服务端资源的一种机制。
IDaaS的授权架构一般会选用基于角色的权限访问控制(RBAC)。
常用的授权模式的话有基于OAuth2.0框架的授权码模式,这部分我也会在下文的OIDC章节重点讲诉。
4.统一应用管理
Application应用包括企业接入进来的自身应用以及IDaaS所提供的一些可选模板应用(如GitLab、Grafana等)。
IDaaS自身提供统一标准规范,对应用统一管理,例如可以控制应用是否支持单点登录,控制应用的可访问成员等。
5.统一审计管理
Audit审计,没什么好讲的,业务角度,代码埋点,Webhook等方式记录下应用和用户相关的操作日志,便于管理员分析系统的日常操作与安全事件数据。
三、OIDC身份认证协议
接下来将进入本文核心内容,讲述IDaaS背后支撑着认证和授权能力的基石:OAuth2.0和OIDC协议。
2.0
OAuth即OpenAuthorization,开放授权。
OAuth2.0(RFC6749[8])是一个授权标准协议,可以使第三方应用获得对资源服务的有限访问。
根据OAuth2.0协议规范,定义了四个角色:
资源所有者(ResourceOwner):能够授予对受保护资源访问权限的实体。
例如应用的用户是资源的所有者,可以授权其他人访问他的资源。
当资源所有者是一个人时,它被称为最终用户。
资源服务器(ResourceServer):存储受保护资源的服务器,能够接受并使用访问令牌来响应受保护的资源请求。
就是资源服务器接受AccessToken,然后验证它拥有的权限,最后返回对应的资源。
这个资源服务器一般是应用本身。
授权服务器(AuthorisationServer):服务器向客户端(即应用)颁发访问令牌来验证资源所有者并获得授权。
即负责颁发AccessToken的服务器,例如IDaaS就是一个授权服务器。
客户端(Client):需要获取访问令牌以访问资源服务器的应用。
经过授权后,授权服务器为客户端颁发AccessToken。
后续客户端可以携带这个AccessToken到资源服务器那访问用户的资源。
在OAuth2.0中一个应用可能既是ResourceServer,也是Client,具体是什么角色,取决于应用工作的场景。
概念可能有点难嚼,还请慢咽。
这四个角色一直在围绕着一个叫AccessToken的东西在转圈圈。
AccessToken也就是访问令牌,它用于允许应用访问一个资源API。
用户认证授权成功后,授权服务器会签发AccessToken给应用。
应用后续需要携带AccessToken访问资源API,资源服务API会检验AccessToken是否有权限访问,从而决定是否返回对应资源。
而AccessToken本质上只是一串随机字符串,并不能从中获取到任何信息,检验AccessToken的步骤还需要资源服务器将它转发到授权服务器上进行解析验证。
了解完AccessToken之后,我们来关注一下客户端调用方是如何获取到它的,也就是授权模式的选择。
授权码模式(AuthorizationCode):适用于具有完整前后端的传统Web应用以及移动或桌面端应用。
隐式模式(Implicit):适用于没有后端的基于浏览器(JavaScript)的纯前端应用。
密码模式(ResourceOwnerPasswordCredentials):适用于资源服务器和客户端之间高度信任的情况下,例如自家应用使用自家的资源。
客户端凭证模式(ClientCredentials):适用于没有前端参与,纯后端交互的情况,期间没有用户的参与,客户端自己就是资源所有者。
……
我们重点关注授权码模式和客户端凭证模式,这两个是最常用的。
先看授权码模式,也叫code换token模式,我们以StackOverflow使用GitHub登录为例(在这个过程中StackOverflow是客户端,GitHub是资源服务器,提供邮箱头像等资源信息,同时GitHub也是授权服务器,会颁发token给客户端)。
第一步,点击登录后需要跳转到授权服务器地址,即GitHub的地址,并且必须在URL上携带client_id和redirect_uri以及scope等信息。
redirect_uri是授权成功或失败后的回调地址;
response_type=code表示使用授权码模式授权;
scope表示应用正在请求哪些权限;
state是一个随机字符串用来防止CSRF攻击。
继续第二步,当我们点击授权按钮后,这时授权服务器即GitHub会将浏览器重定向到第一步的redirect_uri参数指定的网址。
并且跳转时,会携带一个授权码code参数(由GitHub后台生成的)以及state参数。
第四步,StackOverflow可以拿着client_id、client_secret、code跟GitHub交换令牌,GitHub收到请求以后就会校验code并颁发访问令牌(code是有过期时间的,并且是一次性的)。
Ruby//RequestPOSTcode=1efc47a278d10a04f88e&client_id=01b478c0264a1fbd7183&client_secret=xxxxxx//ResponseAccept:application/json{access_token:gho_16C7e42F292c6912E7710cAe178B4a,scope:user:email,token_type:bearer}
最后第五步,StackOverflow使用GitHub颁发的访问令牌跟GitHub获取到所需的资源(用户邮箱地址),然后就走自己的业务流程了,一般就是重定向回首页。
完整的流程可以看GitHub的CreatinganOAuthAppDocs[9]。
另一个客户端凭证模式就相对简单了,毕竟只是纯后端交互。
例如,一个B应用拥有很多photo资源,即B为资源服务器(假设同时也是授权服务器),A客户端想要获取B的photo资源。
第一步,A应用直接使用client_id和client_secret向B申请资源。
Groovy表示使用客户端凭证模式授权。
第二步,B作为授权服务器验证A客户端的client_id和client_secret是否合法,然后颁发访问令牌。
第三步,A客户端携带访问令牌向B资源服务器获取photo资源。
这期间并没有用户的参与,A客户端自己就相当于一个“用户”。
讲完OAuth2.0授权,来到OIDC认证协议。
如标题,OIDC全称是OpenIDConnect[10],
是一个基于OAuth2.0的认证+授权(OAuth2.0提供的能力)协议。
OIDC可以理解为OAuth2.0的超集,在OAuth2.0之上实现了更多的标准,例如定义了一系列的EndPoint。
还有一些规范诸如SessionManagement[11],Front-ChannelLogout[12],Back-ChannelLogout[13]等。
OIDC之所以有认证的功能,是因为在OAuth2.0颁发AccessToken的基础上,多颁发了一个IDToken(用户的身份凭证),和AccessToken是一个随机字符串不同的是,IDToken是一个JWTToken。
IDToken自身包含了一些用户的基本信息,而且由于JWT的防篡改性,让客户端不需要再向授权服务器进行身份验证,就能直接用IDToken来进行身份验证。
即使IDToken包含的用户信息不够,也可以调用OIDC定义的UserInfoEndPoint(用户信息接口)来获取更多的用户信息。
OIDC协议定义的名词和OAuth2.0协议定义的稍微有些出入:
OpenIDProvider,简称OP:相当于OAuth2.0中的授权服务器,除了负责颁发AccessToken,还会颁发IDToken。
例如IDaaS就是一个OP。
RelyingParty,简称RP:代指OAuth2.0中的客户端。
EndUser,简称EU:即用户。
最后,OIDC的授权流程与OAuth2.0是一样的,主要区别在于OIDC授权流程中会额外返回IDToken。
IDaaS的认证和授权使用了OIDC/OAuth2.0。
说白了,要搭建IDaaS得先搭建一个授权服务器OpenIDProvider(更多时候称之为OIDCProvider)。
但即便完全了解OIDC协议,自行实现一套完整的OIDCProvider依旧十分繁琐,好在云原生环境下孕育出了很多优秀的项目。
本文会简单介绍一下Go语言生态下的dexidp/dex和ory/hydra,感兴趣的可以自行到其官网详细了解。
/dex
Dex[14]作为CNCF的一个sandbox项目,是一个具有可插拔连接器的OIDC和OAuth2.0提供商。
它通过”连接器“的身份来充当其他身份提供商的门户,可以将身份验证推送到LDAP服务器、SAML提供商或GitHub、Google和ActiveDirectory等其他一些成熟的身份提供商中进行验证。
客户端只需写一次认证逻辑就可以与Dex对接,然后Dex来处理特定后端的协议。
ORYHydra[15]是一个OAuth2.0和OpenIDConnect提供者。
特别一说的是Hydra所实现的OAuth2.0协议并不依赖Go标准库提供的,而是自实现的fosite[16]。
另外ORYHydra还提供了一个5分钟的快速搭建教程。
身份行业正全面朝着现代化身份标准发展,零信任的网络安全模型、基于区块链技术的去中心化身份认证、基于物联网(IoT)的身份认证、隐私及法规问题的解决方案等都是目前身份行业所面临的挑战和趋势。
IDaaS作为现代身份之称,正是为了支持当前和未来的变化才诞生的。
借助IDaaS,可以轻松地连接到您的组织,为您提供创新未来。
而Authing正是这样一个优秀的IDaaS提供商。
作为国内首款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务。
主要功能包括:单点登录、用户分析、扫码登录、多因素认证、行为审计、风险控制、跨平台设备管理、IoT身份认证等;兼容国际各类标准协议:OAuth2.0、OIDC、SAML、AD/LDAP、WS-Fed、JWT等;此外还有基于函数计算可以无限制拓展Authing能力的Pipeline。
支持云交付和私有化部署方式,帮助企业和开发者千倍级提升生产效率。
不管是ToB、ToE的企业场景,还是ToC的终端用户场景,Authing都可以:大幅降低运营成本,提升内部管理效率;提升用户体验,提升用户运营能力。
参考资料
[1]交付模式对比图:文档:腾讯云IDaaS:阿里云应用身份服务IDaaS:能力: