单点登录系统
token形式
独立的系统,数据库中根据查询用户信息,获得正确用户后,生成一个token,token中存放用户信息,例如JWT生成的包含用户信息的字符串,有两种返回方式:(1)可以把字符串通过 cookie 返回;(2)可以把字符串通过地址栏返回
用户在访问其他模块时,带着token,服务器反解信息,就能获取到用户的登录信息,用户就不用重复登录。
cookie+redis的形式
用户登录成功后,自动生成一个key,value是用户的登录信息,存放在redis中,以cookie的形式存放key返回给用户。
key是唯一,value是用户信息,注意要设置过期时间
用户在访问其他模块时,从cookie将key信息取出,查询对比redis库,如果能查询到则不用重复登录,反之查询不到则重新登录。

webservice:跨平台跨语言信息传递技术
jax-ws:soap协议,传输xml
jax-rs:http协议,传输xml、json

soap协议:简单对象访问协议,基于xml语言协议
soap=http+xml数据
soap是基于http协议的

异构平台的互通性、软件复用
webservice作为soa架构的一种实现

apache cxf框架实现webservice

发布服务服务端:
@webservice注解在服务类上
1.如果是基于jax-ws架构的,就先创建发布服务的工厂
jaxwsservicefactorybean fatory = new jaxwsservicefactorybean()
2.设置发布地址
fatory.setaddress(“http://127.0.0.1/test”)
3.设置服务类
fatory.setservicebean(new helloworld) 括号中为要发布的类helloworldService的实现类
4.发布服务
fatory.create

访问客户端:
和服务端有同样的接口helloworldService接口
1.创建cxf代理工厂
jaxwsproxyfactorybean fatory = new jaxwsproxyfactorybean()
2.设置远程服务器访问地址
fatory.setaddress(“http://127.0.0.1/test”)
3.设置接口类型
fatory.setserviceclass(helloworldService.class)
4.生成代理对象
helloworldService helloworldService = fatory.create(helloworldService.class)
5.访问服务器端
helloworldService.方法 helloworldService服务器端的方法

如果整合spring,则是spring+cxf,通过spring发布服务时,首先要经过cxf的servlet,所以web.xml要配置cxfservlet
在applicationcontext中配置服务端,jaxws:service标签
在applicationcontext中配置客户端,jaxws:client标签

RESTFUL风格
同一个URL,不同的请求方式,后台也随之响应不同的响应方式
GET POST DELETE PUT

服务端
实体类上添加注解@xmlrootelement(“jk”) 指定对象序列化为xml或者json数据时根节点的名称

接口上添加@Path(“路径”) 表示当前服务接口对应的路径
接口方法上添加@Path(“路径”) 表示当前服务接口方法对应的路径
在方法上添加@post或者@put或者@get或者@delete,表示对应的请求方式
@produces(“appliction/xml”,“appliction/json”) 表示服务器支持返回的数据类型
@consumes(“appliction/xml”,“appliction/json”) 表示服务器支持请求的数据类型

客户端
需要相同的实体
用webclient访问
webclient.create(“服务器地址”).post或者@put或者@get或者@delete 表示对应的请求方式
webclient.create(“服务器地址”).post
webclient.create(“服务器地址”).put
webclient.create(“服务器地址”).get
webclient.create(“服务器地址”).delete
webclient.create(“服务器地址”).get(“id”).type(“json或者xml”) type表示请求的数据格式
webclient.create(“服务器地址”).get(“id”).type(“json或者xml”).accept(“json或者xml”) accept表示响应的数据格式
整合spring+cxf,同上

下面我要讲讲zookeeper的实际运用场景:

场景一:有一组服务器向客户端提供某种服务(例如:我前面做的分布式网站的服务端,就是由四台服务器组成的集群,向前端集群提供服务),我们希望客户端每次请求服务端都可以找到服务端集群中某一台服务器,这样服务端就可以向客户端提供客户端所需的服务。对于这种场景,我们的程序中一定有一份这组服务器的列表,每次客户端请求时候,都是从这份列表里读取这份服务器列表。那么这分列表显然不能存储在一台单节点的服务器上,否则这个节点挂掉了,整个集群都会发生故障,我们希望这份列表时高可用的。高可用的解决方案是:这份列表是分布式存储的,它是由存储这份列表的服务器共同管理的,如果存储列表里的某台服务器坏掉了,其他服务器马上可以替代坏掉的服务器,并且可以把坏掉的服务器从列表里删除掉,让故障服务器退出整个集群的运行,而这一切的操作又不会由故障的服务器来操作,而是集群里正常的服务器来完成。这是一种主动的分布式数据结构,能够在外部情况发生变化时候主动修改数据项状态的数据机构。Zookeeper框架提供了这种服务。这种服务名字就是:统一命名服务,它和javaEE里的JNDI服务很像。

场景二:分布式锁服务。当分布式系统操作数据,例如:读取数据、分析数据、最后修改数据。在分布式系统里这些操作可能会分散到集群里不同的节点上,那么这时候就存在数据操作过程中一致性的问题,如果不一致,我们将会得到一个错误的运算结果,在单一进程的程序里,一致性的问题很好解决,但是到了分布式系统就比较困难,因为分布式系统里不同服务器的运算都是在独立的进程里,运算的中间结果和过程还要通过网络进行传递,那么想做到数据操作一致性要困难的多。Zookeeper提供了一个锁服务解决了这样的问题,能让我们在做分布式数据运算时候,保证数据操作的一致性。

场景三:配置管理。在分布式系统里,我们会把一个服务应用分别部署到n台服务器上,这些服务器的配置文件是相同的(例如:我设计的分布式网站框架里,服务端就有4台服务器,4台服务器上的程序都是一样,配置文件都是一样),如果配置文件的配置选项发生变化,那么我们就得一个个去改这些配置文件,如果我们需要改的服务器比较少,这些操作还不是太麻烦,如果我们分布式的服务器特别多,比如某些大型互联网公司的hadoop集群有数千台服务器,那么更改配置选项就是一件麻烦而且危险的事情。这时候zookeeper就可以派上用场了,我们可以把zookeeper当成一个高可用的配置存储器,把这样的事情交给zookeeper进行管理,我们将集群的配置文件拷贝到zookeeper的文件系统的某个节点上,然后用zookeeper监控所有分布式系统里配置文件的状态,一旦发现有配置文件发生了变化,每台服务器都会收到zookeeper的通知,让每台服务器同步zookeeper里的配置文件,zookeeper服务也会保证同步操作原子性,确保每个服务器的配置文件都能被正确的更新。

场景四:为分布式系统提供故障修复的功能。集群管理是很困难的,在分布式系统里加入了zookeeper服务,能让我们很容易的对集群进行管理。集群管理最麻烦的事情就是节点故障管理,zookeeper可以让集群选出一个健康的节点作为master,master节点会知道当前集群的每台服务器的运行状况,一旦某个节点发生故障,master会把这个情况通知给集群其他服务器,从而重新分配不同节点的计算任务。Zookeeper不仅可以发现故障,也会对有故障的服务器进行甄别,看故障服务器是什么样的故障,如果该故障可以修复,zookeeper可以自动修复或者告诉系统管理员错误的原因让管理员迅速定位问题,修复节点的故障。大家也许还会有个疑问,master故障了,那怎么办了?zookeeper也考虑到了这点,zookeeper内部有一个“选举领导者的算法”,master可以动态选择,当master故障时候,zookeeper能马上选出新的master对集群进行管理。

Activemq用于解耦、异步、削峰
反射是在类的加载阶段进行的,当类被JVM加载为.class文件后,在内存中JVM会开辟内存,生成.class对象,反射是根据class对象反向获取该类的一些信息

Spring的AOP:
spring的AOP是运行时的方式织入,而aspectj是采用编译时的方式织入(字节码),spring集成了aspectj去进行AOP。aspectj也是一种AOP框架
Spring的AOP实现是通过JDK代理和CGlib代理,可实现事务管理,权限,日志等
而在spring中使用aspectj实现AOP时则更细节化
比如要增强某个功能,则使用spring的AOP思想,在接口或父类中实现即可,若要以aspectj的方式实现,则需要配置切点切面通知等,采用XML的声明方式或注解方式都行,也是在接口的实现类中进行增强操作,比如spring的声明式事务管理
加日志也是采用AOP思想,如SpringMVC中要在所有的controller执行前加一行日志,则使用@modelatrrbite注解。本质也是动态代理,cglib的动态代理,所有的controller继承一个父类controller,在父类的某个方法上添加@modelatrrbite注解
实质是cglib生成的子类对象运行一行日志

Slor
Slor是一个全文检索服务器,可独立运行
需要jdk,tomcat,slor

配置完成后可直接访问slor服务页面。
注意分析器,查询,等几个功能

Slor不支持中文分析器,所以要添加IK分析器

redis
数据类型string,hash,set,zset,list
redis-cli 自带客户端

使用jedis客户端工具包

连接redis服务器(使用方法和redis命令行工具一样)
jedis jedis = new jedis(“ip”,“port”);
jedis.set(key,value);
jedis.get(key);

redis集群
搭建3个节点,每个节点有主备,总共6个redis服务端
搭建好之后,每个redis之间数据数据互通。

使用jedis客户端工具包访问集群,jediscluster自动生成连接池
hashset hashset = new hashset<>();
hashset.add(HostAndPort(IP,PORT));
jediscluster jediscluster = new jediscluster(nodes); //nodes中放的是一个hashset<host,port>集合
jediscluster.set(key,value);
jediscluster.get(key);

redis的缓存穿透处理