后台系统所用的技术
框架:Spring + SpringMVC + Mybatis+dubbo
前端:EasyUI
数据库:mysql
系统间通信
由于淘淘商城是基于SOA的架构,表现层和服务层是不同的工程。所以要实现商品列表查询需要两个系统之间进行通信。
如何实现远程通信?
1、使用WebService:效率不高,它是基于soap协议(http+xml)。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务越来越多,服务与服务之间的调用关系复杂,调用服务的URL管理复杂,什么时候添加机器难以确定。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数,管理服务。
什么是dubbo
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
1.单一应用架构
• 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
• 此时,用于简化增删改查工作量的数据访问框架(ORM) 是关键。
2.垂直应用架构
• 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
• 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。
3.分布式服务架构
• 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
• 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。
4.流动计算架构
• 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
• 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
Dubbo就是资源调度和治理中心的管理工具。
Dubbo 就是类似于webservice的关于系统之间通信的框架,并可以统计和管理服务之间的调用情况(包括服务被谁调用了,调用的次数是如何,以及服务的使用状况)。
Dubbo的架构
节点角色说明:
• Provider: 暴露服务的服务提供方。
• Consumer: 调用远程服务的服务消费方。
• Registry: 服务注册与发现的注册中心。
• Monitor: 统计服务的调用次调和调用时间的监控中心。(zookeeper)
• Container: 服务运行容器。
调用关系说明:
• 0. 服务容器负责启动,加载,运行服务提供者。
• 1. 服务提供者在启动时,向注册中心注册自己提供的服务。
• 2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
• 3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
• 4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
• 5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
使用方法:Spring配置
Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
单一工程中spring的配置local.xml:
远程服务:
在本地服务的基础上,只需做简单配置,即可完成远程化:
将上面的local.xml配置拆分成两份,
将服务定义部分放在服务提供方remote-provider.xml,
将服务引用部分放在服务消费方remote-consumer.xml。
并在提供方增加暴露服务配置dubbo:service,在消费方增加引用服务配置dubbo:reference。
服务层发布服务:(提供方)taotao-manager-service
注册中心
zookeeper的介绍
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。使用dubbo-2.3.3以上版本,官方建议使用zookeeper作为注册中心。
Zookeeper是Apacahe Hadoop的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高(稳定性好),可用于生产环境,并推荐使用。
整合:
MVC各层配置文件
Controller. springmvc.xml. (组件扫描controller,注解驱动,视图解析器)
web.xml(dispatcherservlet监听器)
Service. applicationContext-service.xml.(组件扫描)
applicationContext-trans.xml.
web.xml
Dao. SqlMapConfig.xml.
applicationContext-dao.xml.(数据源sqlsessionfactory,mapper扫描器)
1、Dao层:
mybatis整合spring,通过spring管理SqlSessionFactory、mapper代理对象。需要mybatis和spring的整合包,由spring创建数据库连接池。
mybatis是使用mapper动态代理的方式进行开发,所以需要进行mapper的接口和映射文件。
2、Service层:
所有的实现类都放到spring容器中管理。并有spring管理事务;发布dubbo服务
web.xml 配置:配置加载spring容器
3、表现层:
Springmvc整合spring框架,由springmvc管理controller;引入dubbo服务
web.xml 的配置:前端控制器的配置,配置URL拦截形式。
MVC各层配置文件中的内容
dao
taotao-manager-service
mybatis. SqlMapConfig.xml.
properties. Db.properties
spring. applicationContext-dao.xml. 配置数据库连接池druid、数据源、sqlsessionfactory、mapper扫描器
Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过多年多生产环境大规模部署的严苛考验。
Taotao-manager-dao下创建com.taotao.mapper
Service
Mybatis
Spring applicationContext-service.xml. 扫描service
applicationContext-trans.xml配置事务管理器、通知、切面
web.xml 用于spring容器初始化,加载spring容器
Properties
Taotao-manager-interface下创建com.taotao.service
表现层
taotao-manager-web.
spring. Springmvc.xml。配置controller,配置试图解析器,引用dubbo服务
视图解析器 要创建jsp文件夹/WEB-INF/jsp/
可以看到我们springmvc.xml文件中配置的扫描包是com.taotao.controller,因此我们需要创建这么一个目录
下面我们需要配置编码和前端控制器,我们需要在taotao-manager-web工程下的web.xml文件中配置。
Web.xml. 配置配置dispatcherservlet
解决post乱码
加载springmvc.xml
springmvc的前端控制器
url的拦截形式
web.xml文件配置内容如下,其中前端控制器配置中1这句话的意思是tomcat启动之后便加载DispatcherServlet,如果不配置的话,需要等请求访问的时候才会加载DispatcherServlet。另外可以看到,我们并没有配置父容器(ContextLoaderListener),这是因为我们在taotao-manager工程中已经配置过了,而且配置了Dao和Service。因此我们表现层不需要再配置一遍父容器了。
说到这里,我们一般会对父子容器(同一个工程下)比较感兴趣,想知道是怎么回事,请看下面这张图。Spring父容器一般配置的是Dao层和Service层,而Spring子容器一般配置的是Controller层,父子容器的访问关系是,子容器可以访问父容器中的对象,但是父容器无法访问子容器中的对象。比如controller可以把Dao和Service注入进来,但是Dao和Service无法把Controller注进来。
我们在service配置扫描包的时候配置的扫描范围是"com.taotao.service",如果我们配置成com.taotao,那么就会把com.taotao.controller也扫描到父容器中,这样父子容器中就都有controller层了,但是在父容器中扫进来controller是没有用的,我们在表现层访问的时候,访问的还是子容器的controller。同理,如果把子容器的扫描范围扩大,变为com.taotao,那么它便会把Dao和Service也扫描到子容器当中,这样当我们访问表现层的时候,访问的便是子容器中的Dao和Service,子容器中的Dao和Service是没有事务的,但是父容器中的Dao和Service是有事务的,这样就会导致虽然我们在父容器中配置了事务,但由于子容器扫描范围太大,而导致访问子容器中的Dao和Service没有事务的问题。
由于子容器可以直接访问父容器中的对象,因此我们在子容器中不用配置Dao和Service便可以直接使用它们。
子容器其实也可以完全当父容器使用,之所以搞出父子容器,是为了让父容器有更好的扩展性,子容器只需要消费父容器就可以了
Taotao-manager-interface下创建com.taotao.controller包
开发总体思路:
在服务层工程中创建Mapper 、service ,
表现层工程创建Controller,
使用浏览器访问,
确认是否能正常调用。
开发流程:dao(mapper代理的方式进行开发)-service-controller
开发过程:
taotao-manager-dao
com.taotao.mapper
TestMapper.java
TestMapper.xml
taotao-manager-interface
com.taotao.service
TestService.java
taotao-manager-service
com.taotao.service.impl
TestServiceImpl.java要明白是哪个@service\注入mapper、@Autowired\调用mapper的方法、返回
taotao-manager-service层发布服务
applicationContext-service.xml使用dubbo发布服务
提供方应用信息,用于计算依赖关系:统计哪个服务被谁调用了
注册中心:我这个服务要注册到注册中心去
客户端的端口,即服务要注册到注册中心去,发到客户端去,linux的ip地址+端口号
服务要暴露出来 使用dubbo的协议
声明要暴露的服务接口:执行接口的路径、以及接口的实现类(中加了@service,所以首字母小写就可以了直接是实例化对象)。
taotao-manager-web层
com.taotao.controller
编写TestController.java
注解@Controller
@RequestMapping("/test/queryNow")指定请求的url地址
@ResponseBody返回值
1.引入服务
springmvc.xml中写了实例,reference中引用testService
2.注入服务
@Autowired
private TestService testservice;
3.调用服务
Springmvc.xml中引用dubbo服务
测试:
provider:taotao-manager
consumer:taotao-manager-web
那么先启动提供者,再启动消费者。
然后访问地址:localhost:8081/test/queryNow
运行结果: