在如今的互联网,传统的页面刷新的用户交互已经过时了,而且使用后台渲染技术如JSP等也不符合当今互联网发展趋势,因为后台渲染会大大消耗服务器的资源,现在大多数网站的搭建都是使用html + js的方式来搭建,把数据的交互都交给客户执行,客户端通过Ajax异步交互从数据库中获取数据,而不用每次请求都刷新一次页面,说起交互,那就不得不提现在流行的单一页面应用程序了,单一页面指的是一个web应用只有一个页面,通过Ajax异步避免页面刷新提高网站的响应性,具有应用程序的良好体验,AngularJS就是为此而生的。
在这里主要讲如何利用md5散列算法对密码进行加密与校验,md5是一种不可逆的散列算法,因此广泛应用与密码的加密,以及文件的md5校验等。
对于一个好的框架,那必然有易于使用和理解的API,我们从外部看shiro,即从应用程序角度来看shiro是如何来完成工作的:
从上图可看到,程序与shiro直接的交互对象是Subject,它是shiro对外交互的核心API:
之前说过了微服务间,我是通过 Spring 的 RestTemplate 类来相互调用的,它可通过整合 Ribbon 实现负载均衡,但发现了这样写不够优雅,且不够模板化,因此本篇介绍一下 Feign。
Feign是一种声明式、模板化的 HTTP 客户端,在 Spring Cloud 中使用 Feign 其实就是创建一个接口类,它跟普通接口没啥两让,因此通过 Feign 调用 HTTP 请求,开发者完全感知不到这是远程方法。
到这里我们就可以构建一个略微不足的微服务分布式系统了,前面我们通过Ribbon实现服务的消费和负载均衡,但还有些不足的地方,举个例子,服务A和服务B,他们都注册到服务注册中心,这里还有个对外提供的一个服务,这个服务通过负载均衡提供调用服务A和服务B的方法,但是这样做就破坏了服务无状态的特点,无法直接复用既有接口,当我们需要对一个即有的集群内访问接口,实现外部服务访问时,我们不得不通过在原有接口上增加校验逻辑,或增加一个代理调用来实现权限控制,无法直接复用原有的接口。
最好的方法就是把所有请求都集中在最前端的地方,这地方就是zuul服务网关。
服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。
在整个微服务系统架构中,各个系统被拆分成一个个服务单元,个单元间又通过诸如负载均衡的方式互相依赖,而每个服务单位都在不同的服务器中运行,假设其中一个服务器崩了又或者是网络延迟,这也就会导致其它依赖此服务的服务单元b也会出现延迟,而依赖此服务单元b的服务单元c也会出现延迟,如此一来,整个微服务系统就会出现雪崩效应,导致整个系统瘫痪。
为了解决此问题,须在系统中加入断路器模式,“断路器”本身就是一个很形象的词,因为断路器模式的作用也类似于电路中的断路器,一旦发生短路,断路器就会切断电源(熔断保险丝),确保电路安全。而微服务系统中,一旦某个服务单元发生瘫痪后者网络延迟等原因,断路器模式监控到此异常,就会向调用方返回一个错误响应,而不是让调用方长时间在等待,这样就不会产生在一个线程中被长时间占用,提高了系统的响应速度。
在SpringCloud个模块中有一个叫Netflix Hystrix的断路器模块。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
在系统与系统之间,如何进行相互间得调用呢?也就是说怎么去调用服务提供得接口内容呢?这里就要说一下Ribbon了,Ribbon是一个基于http和tcp客户端得负载均衡器,什么是负载均衡呢?简单来说就是一个就是一个域名地址设置多个地址,当我们访问这个域名地址时,定位到服务器分发中心,再根据各个服务器的负载状况进行分发,达到均衡状态,试想一下如果全部访问都集中到一台服务器,那不得直接崩了?
现在公司的积分联盟平台系统构建于公司内部的第4代架构中,而第四代用得就是springCloud微服务架构,趁着项目上手,花了几天研究了一下。
SpringCloud是一个庞大的分布式系统,它包含了众多模块,其中主要有:服务发现(Eureka),断路器(Hystrix),智能路有(Zuul),客户端负载均衡(Ribbon)等。也就是说微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用。
在我们使用传统的spring开发一个web应用程序通常会想到一些基本的需要:
以上的这些仅仅只是进本的需求,无论是开发一个大型项目或者只是一个hello word程序,都需要配置几乎同等的配置文件,既然这些都是通用的东西,那有什么东西可以把这些给自动配置了呢?这时候springboot的自动配置功能就派上用场了,springboot会为这些常用的配置进行自动配置。这些自动配置涉及很多方面,比如:java持久化api,各种web模板,springMVC等等。
从今天开始,我会在这里分享一些我的工作和学习总结。