点击上方“小码哥Damon”,选择“设为星标”
回复“yeah”,获取礼包资料
简介:
微服务现如今已成为炙手可热的新技术,似乎不谈点微服务技术,都显得不是那么主流了。
微服务当中,Spring 家族尤为凸显的便是 Spring Boot,乃至 Spring Cloud。
本场 Chat 旨在一小时教你学会如何快速构建微服务架构。
在本场 Chat 中,会讲到如下内容:
- 微服务之网关
- 微服务之注册中心
- 微服务之服务注册与发现
- 微服务之配置中心
- 微服务之权限shiro
适合人群:对高效创建项目模块有兴趣的技术人员
微服务设计框架图:
Web Client :代表前端页面,展示给用户
Zuul Server:网关,验证安全以及分布式路由
Eureka Server:注册中心,服务的注册与发现
Config Server:配置中心,负责为服务端和客户端提供了分布式系统的外部化配置支持
业务层:目前针对主要划分了四大微服务模块,项目以及任务、文件中心、镜像、数据集。其中项目微服务中包括了服务的安全认证,即登录
DB:业务层的数据库,mysql
Rest-server:现有的底层服务
Redis:缓存用户认证信息,共享session
认证中心:第三方认证,低耦合性

接下来介绍Zuul
Zuul概念以及工作原理
一 :Zuul是什么
Zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用。
二 :Zuul的工作原理
1、过滤器机制
zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。zuul把Request route到用户处理逻辑的过程中,这些filter参与一些过滤处理,比如Authentication,Load Shedding等。几种标准的过滤器类型:
(1) PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
(2) ROUTING :这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
(3) POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。
(4) ERROR:在其他阶段发生错误时执行该过滤器。

2、过滤器的生命周期
filterOrder:通过int值来定义过滤器的执行顺序,越小优先级越高。
shouldFilter:返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关。在上例中,我们直接返回true,所以该过滤器总是生效。
run:过滤器的具体逻辑。需要注意,这里我们通过ctx.setSendZuulResponse(false)令zuul过滤该请求,不对其进行路由,然后通过ctx.setResponseStatusCode(401)设置了其返回的错误码。

三:Zuul的负载均衡
注解 @EnableZuulProxy实现代理转发。
zuul拦截对应的api前缀请求做转发 转发到对应的 serverId上,在eureka服务上同一个serverId可以对应多个服务, 也就是说用同一个项目不同的端口注册两个服务,但是serverId是一样 zuul做转发的时候会结合eureka-server起到负载均衡的效果。
例:
#文件中心路由映射的服务
1.
zuul.routes.api-b.sensitiveHeaders="*"
zuul.routes.api-b.path=/fileCenter/api/**
zuul.routes.api-b.serviceId=file-center
2.
zuul.routes.api-a-url.path=/api-a-url/**
zuul.routes.api-a-url.url=http://localhost:3335/
四:注册中心与微服务的关系
1.各微服务先往注册中心注册服务
2.各微服务保持与注册中心心跳
3.注册中心发现各微服务
4.注册中心根据配置规则定期获取心跳,超时即认为节点无效
5.根据规则来定期清理无效节点

Eureka的一些常用配置:
eureka.client.registry-fetch-interval-seconds
表示eureka client间隔多久去拉取服务注册信息,默认为30秒,对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒。
eureka.instance.lease-expiration-duration-in-seconds
leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该instance。
默认为90秒
如果该值太大,则很可能将流量转发过去的时候,该instance已经不存活了。
如果该值设置太小了,则instance则很可能因为临时的网络抖动而被摘除掉。
该值至少应该大于leaseRenewalIntervalInSeconds
eureka.instance.lease-renewal-interval-in-seconds
leaseRenewalIntervalInSeconds,表示eureka client发送心跳给server端的频率。如果在leaseExpirationDurationInSeconds后,server端没有收到client的心跳,则将摘除该instance。除此之外,如果该instance实现了HealthCheckCallback,并决定让自己unavailable的话,则该instance也不会接收到流量。
默认30秒。
eureka.server.enable-self-preservation
是否开启自我保护模式,默认为true。
默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,以上行为可能变得非常危险了——因为微服务本身其实是健康的,此时本不应该注销这个微服务。
Eureka通过“自我保护模式”来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
eureka.server.eviction-interval-timer-in-ms
eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒。
五:配置中心
Spring Cloud Config为服务端和客户端提供了分布式系统的外部化配置支持。配置服务器为各应用的所有环境提供了一个中心化的外部配置。它实现了对服务端和客户端对Spring Environment和PropertySource抽象的映射,所以它除了适用于Spring构建的应用程序,也可以在任何其他语言运行的应用程序中使用。作为一个应用可以通过部署管道来进行测试或者投入生产,我们可以分别为这些环境创建配置,并且在需要迁移环境的时候获取对应环境的配置来运行。
它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息、加密/解密信息等访问接口;而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。Spring Cloud Config实现了对服务端和客户端中环境变量和属性配置的抽象映射,所以它除了适用于Spring构建的应用程序之外,也可以在任何其他语言运行的应用程序中使用。由于Spring Cloud Config实现的配置中心默认采用Git来存储配置信息,所以使用Spring Cloud Config构建的配置服务器,天然就支持对微服务应用配置信息的版本管理,并且可以通过Git客户端工具来方便的管理和访问配置内容。当然它也提供了对其他存储方式的支持,比如:SVN仓库、本地化文件系统。

六:认证流程与信息共享
简单版:认证用户合法性后,获取用户的信息,并返回一个token,然后这边会将认证后的信息存储在redis,同时生成session,从而实现共享session,在Zuul中,我们有过滤器filter来继承ZuulFilter实现方法run() ,过滤器根据生命周期来执行该方法,具体是验证所有请求的头部是否携带用户的token,如果没有,则视为非法请求,要求重新登录。
在通过Zuul的过滤后,用户的请求Zuul会根据路由来分配到指定的服务(采取轮询服务机制分配),请求到了服务后,会被拦截获取token,从而从Redis中获取用户信息,如果非登录认证服务需要存入session,共享给其他Controller,整个的认证流程就是这样的。
七:Shiro工作原理
subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。
securityManager:安全管理器,主体进行认证和授权都是通过securityManager进行。
authenticator:认证器,主体进行认证最终通过authenticator进行的。
authorizer:授权器,主体进行授权最终通过authorizer进行的。
sessionManager:web应用中一般是用web容器对session进行管理,shiro也提供一套session管理的方式。
SessionDao:通过SessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao。
cache Manager:缓存管理器,主要对session和授权数据进行缓存,比如将授权数据通过cacheManager进行缓存管理,和ehcache整合对缓存数据进行管理。
realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据。
shiro认证执行流程:
1、通过ini配置文件创建securityManager。
2、调用subject.login方法主体提交认证,提交的token。
3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息。
5、IniRealm根据输入的token(UsernamePasswordToken)从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)如果查询不到,就给ModularRealmAuthenticator返回null。
6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息,如果返回的认证信息是null,ModularRealmAuthenticator抛出异常org.apache.shiro.authc.UnknownAccountException,如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常org.apache.shiro.authc.IncorrectCredentialsException。

授权流程:
1、对subject进行授权,调用方法isPermitted("permission串")。
2、SecurityManager执行授权,通ModularRealmAuthorizer执行授权。
3、ModularRealmAuthorizer执行realm(自定义的Realm)从数据库查询权限数据调用realm的授权方法:doGetAuthorizationInfo。
4、realm从数据库查询权限数据,返回ModularRealmAuthorizer。
5、ModularRealmAuthorizer调用PermissionResolver进行权限串比对。
6、如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission有权限,否则 没有权限,抛出异常。
关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、监控、 k8s 等关键字可以查看更多关键字对应的文章。
个人网站:http://www.damon8.cn
热文推荐
Spring Cloud Kubernetes之实战一配置管理
Spring Cloud Kubernetes之实战二服务注册与发现
Spring Cloud Kubernetes之实战三网关Gateway


如有收获,点个在看,谢谢
16万+

被折叠的 条评论
为什么被折叠?



