一、SOA
1.SOA概念
面向服务的架构(SOA Service Oriented Ambiguity )是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种各样的系统中的服务可以以一种统一和通用的方式进行交互。
1)有一个专门提供服务的单元
2)其他所有单元都调用这个服务
2.SOA定位
2.1 如何设计项目让开发更有效率
2.2 SOA是一种思想
3.老的项目架构设计
3.1 企业项目不允许所有项目都访问DB
3.2 开发时DB访问层代码冗余
4.使用SOA架构
4.1 专门访问DB服务(项目)
4.2 开发时可以实现DB访问层和代码复用
5.实现SOA的几种常用服务
5.1 Dubbo
5.2 WebService
5.3 Dubbox
5.4 服务方(一个Web项目,调用Web项目的控制器)
二、RPC
1.RPC概念
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。
(备注:RPC最大的优点就是数据安全性)
三、Dubbo
1.Dubbo简介
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
1)Dubbo是一个分布式、高性能、透明化的RPC服务框架
2)作用:提供服务自动注册、自动发现等高效服务治理方案
2.Dubbo架构图
1)Provider: 提供者、服务发布方
2)Consumer: 消费者,调用服务方
3)Container: Dubbo容器,依赖于Spring容器(与Spring强耦合)
4)Registry: 注册中心,当Container启动时把所有可以提供的服务在Registry中进行注册
(备注:Registry的作用是告诉Consumer提供了什么服务和服务方在哪里)
5)Monitor: 监听器(非必须)
(备注:以上5各部分可以在不同的服务器上,所以必须遵守网络协议)
3.运行原理
1)启动容器,相当于启动Dubbo的Provider
2)Provider去注册中心进行注册,注册所有可以提供的服务列表
3)Consumer去Registry中获取服务列表和Provider的地址
4)根据获取的Provider地址,真实调用Provider中的功能
(备注:当Provider修改后,注册中心会把消息推送给Consumer
Dubbo中的Registry和Consumer之间使用了观察者设计模式
Dubbo中的Consumer用Provider的服务使用了代理设计模式,Consumer使用Provider的一 个动态代理对象,来实现保护Provider真实对象的作用)
5)Consumer和Provider消费/提供服务后向Monitor发送统计信息,包括:访问次数、频率
4.注册中心
4.1 Zookeeper注册中心
优点:支持基于网络的集群方式,有广泛周边开源产品
缺点:稳定性受限于Zookeeper
1) Zookeeper 分布式协调组件(本身是一个软件,用Java语言编写的)
2) Zookeeper常用功能
- 发布订阅功能,把Zookeeper当做注册中心
- 分布式管理功能
4.2 Redis注册中心
优点:支持基于客户端双写的集群方式,性能高
缺点:要求服务器时间同步,用于检测心跳过期脏数据,对服务器环境要求较高
4.3 Multicast注册中心
优点:去中心化,不需要安装注册中心
缺点:依赖于网络拓扑和路由,跨机房有风险
4.4 Simple注册中心
优点:Dogfooding,注册中心本身也是标准的RPC服务
缺点:没有集群支持,可能单点故障(适用于测试环境,项目运行环境几乎没使用)
5.协议
5.1 Dubbo协议
优点:采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好
缺点:在大文件传输时,单一连接会成为瓶颈
5.2 Rmi协议
优点:可与原生RMI户操作,基于TCP协议
缺点:偶尔会连接失败,需重建Stub
5.3 Hessian协议
优点:可与原生Hessian互操作,基于HTTP协议
缺点:需要Hessian.jar支持,http短连接的开销大
6.Dubbo中Provider搭建
- 新建一个Maven Project,项目中只有接口(dubo-service)
(备注:Dubbo是一个RPC框架,不希望Consumer知道所需功能的具体实现,如果实现类和接口在同一个项目中,Consumer依赖此项目时,就会知道实现类的具体功能实现代码。)
- 新建一个Maven project,写接口的实现类(dubbo-service-imple)
- 配置dubbo-service-impl项目的pom.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
-
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-
<modelVersion>4.0.0
</modelVersion>
-
-
<groupId>com.hcj
</groupId>
-
-
<artifactId>dubbo-service-impl
</artifactId>
-
-
<version>1.0-SNAPSHOT
</version>
-
-
<dependencies>
-
-
<!--依赖接口项目-->
-
-
<dependency>
-
-
<groupId>com.hcj
</groupId>
-
-
<artifactId>dubbo-service
</artifactId>
-
-
<version>1.0.0
</version>
-
-
</dependency>
-
-
<dependency>
-
-
<groupId>com.alibaba
</groupId>
-
-
<artifactId>dubbo
</artifactId>
-
-
<version>2.5.3
</version>
-
-
<!--防止项目依赖老版本的spring-->
-
-
<exclusions>
-
-
<exclusion>
-
-
<artifactId>spring
</artifactId>
-
-
<groupId>org.springframework
</groupId>
-
-
</exclusion>
-
-
</exclusions>
-
-
</dependency>
-
-
<!--dubbo所需的老版本spring-->
-
-
<dependency>
-
-
<groupId>org.springframework
</groupId>
-
-
<artifactId>spring-context
</artifactId>
-
-
<version>2.5.6
</version>
-
-
</dependency>
-
-
<!--新版本spring-->
-
-
<dependency>
-
-
<groupId>org.springframework
</groupId>
-
-
<artifactId>spring-webmvc
</artifactId>
-
-
<version>4.3.18.RELEASE
</version>
-
-
</dependency>
-
-
<!--zookeeper的jar包-->
-
-
<dependency>
-
-
<groupId>com.101tec
</groupId>
-
-
<artifactId>zkclient
</artifactId>
-
-
<version>0.10
</version>
-
-
</dependency>
-
-
</dependencies>
-
-
</project>
- 在项目的resources中新建META-INF/spring文件夹,在文件夹中新建dubbo-application-context.xml
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
-
xmlns:context=
"http://www.springframework.org/schema/context"
-
-
xmlns:dubbo=
"http://code.alibabatech.com/schema/dubbo"
-
-
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
-
-
http://www.springframework.org/schema/beans/spring-beans.xsd
-
-
http://www.springframework.org/schema/context
-
-
http://www.springframework.org/schema/spring-context.xsd
-
-
http://code.alibabatech.com/schema/dubbo
-
-
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
-
-
<!--给当前Provider自定义名称,用于区别不同的Provider-->
-
-
<dubbo:application name="dubbo-service"/>
-
-
<!--配置注册中心 address:zookeeper服务器ip+端口 protocol:表明注册中心使用的是zookeeper-->
-
-
<dubbo:registry address="192.168.1.11:2181" protocol="zookeeper"/>
-
-
<!--配置Provider服务的端口 name:所使用的协议 port:Consumer调用功能时所使用的端口号(port配置什么端口,就会占用启动该服务的计算机的端口-->
-
-
<dubbo:protocol name="dubbo" port="20880" />
-
-
<!--注册接口 ref:引用接口的实现类的bean id-->
-
-
<dubbo:service interface="com.hcj.service.DemoService" ref="demoServiceImpl"/>
-
-
<bean id="demoServiceImpl" class="com.hcj.service.impl.DemoServiceImpl"/>
-
-
<!--使用注解方式,可以省略<dubbo:service../>和<bean id.../>但是会和Spring 的声明式事务产生冲突,不建议使用-->
-
-
<!--<dubbo:annotation package="com.hcj.service.impl"/>-->
-
-
</beans>
- 使用dubbo提供的方式启动容器
-
public static void main(String[] args) {
-
-
// 使用该方法启动要求配置文件必须放在/META-INF/spring/下
-
-
Main.main(args);
-
-
}
7.Consumer搭建
- 创建一个标准的SSM项目,在pom.xml中添加Dubbo相关的三个依赖(接口、zkClient、Dubbo)
- 修改web.xml中<context-param>标签
-
<context-param>
-
-
<param-name>contextConfigLocation
</param-name>
-
-
<!-- -*.xml可以匹配所有applicationContext-开头的xml文件,这样可以加载spring和dubbo的配置文件-->
-
-
<param-value>classpath:applicationContext-*.xml
</param-value>
-
-
</context-param>
- 在pom.xml中添加dubbo依赖
-
<!--Dubbo-->
-
-
<dependency>
-
-
<groupId>com.hcj
</groupId>
-
-
<artifactId>dubbo-service
</artifactId>
-
-
<version>1.0.0
</version>
-
-
</dependency>
-
-
<dependency>
-
-
<groupId>com.alibaba
</groupId>
-
-
<artifactId>dubbo
</artifactId>
-
-
<version>2.5.3
</version>
-
-
<exclusions>
-
-
<exclusion>
-
-
<artifactId>spring
</artifactId>
-
-
<groupId>org.springframework
</groupId>
-
-
</exclusion>
-
-
</exclusions>
-
-
</dependency>
-
-
<!--zookeeper zkclient jar包-->
-
-
<dependency>
-
-
<groupId>com.101tec
</groupId>
-
-
<artifactId>zkclient
</artifactId>
-
-
<version>0.10
</version>
-
-
</dependency>
(备注:因为pom.xml原本已有ssm框架所依赖的jar坐标,因此不需要再添加spring-webmvc坐标,否则会依赖冲突)
- 在resources中添加dubbo配置文件
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
-
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
-
-
xmlns:context=
"http://www.springframework.org/schema/context"
-
-
xmlns:dubbo=
"http://code.alibabatech.com/schema/dubbo"
-
-
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
-
-
http://www.springframework.org/schema/beans/spring-beans.xsd
-
-
http://www.springframework.org/schema/context
-
-
http://www.springframework.org/schema/spring-context.xsd
-
-
http://code.alibabatech.com/schema/dubbo
-
-
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
-
-
<!--给当前Provider自定义名称,用于区别不同的Provider-->
-
-
<dubbo:application name="dubbo-service"/>
-
-
<!--配置注册中心 address:zookeeper服务器ip+端口 protocol:表明注册中心使用的是zookeeper-->
-
-
<dubbo:registry address="192.168.1.11:2181" protocol="zookeeper"/>
-
-
<!--用于扫描实现类中@Reference注解-->
-
-
<dubbo:annotation package="com.hcj.service.impl"/>
-
-
</beans>
- 在业务实现类中添加RPC接口
-
//import com.alibaba.dubbo.config.annotation.Reference;
-
-
@Reference
-
-
private DemoService service;
(备注:
//相当于替代原本SSM框架中业务实现类的mapper
@Resource
private TestMapper mapper;)
- 除了以上四个步骤,其余部分和原本SSM框架搭建、使用方法一致
8.Admin管理界面
本质为一个web项目,用于获取注册中心内Provider注册的信息,再以web界面呈现。
- 将dubbo-admin-2.6.0.war上传至Tomcat服务器的webapps中
- 使用startup.sh启动服务器后再关闭Tomcat,删除之前上传的dubbo-admin-2.6.0.war
(备注:因为需要修改dubbo-admin-2.6.0中的文件内容,不删除war,下次启动Tomat,服务器启动后会解压war覆盖原修改的dubbo-admin-2.6.0)
- 打开dubbo-admin-2.6.0的WEB-INF下的dubbo.properties,将内容修改为:
-
dubbo.registry.address=zookeeper:
//192.168.1.11:2181
-
-
dubbo.admin.root.password=root
-
-
dubbo.admin.guest.password=guest
(备注:第一行末尾为zookeeper的服务器IP和端口,根据具体情况修改)
- 启动Tomcat服务器
- 启动Dubbo,将Provider注册到zookeeper中
(备注:显示一下内容则说明Dubbo服务启动成功
Dubbo service server started!)
- 在浏览器中输入http://[Tomcat服务器IP]:8080/dubbo-admin-2.6.0
- 使用用户:root 密码:root登录admin,可看到下图界面
- 在服务治理 -> 服务 中即可查看到注册中心的Provider
注意:如果Dubbo服务正常正常到zookeeper,客户端也能正常调用Dubbo服务,但在admin中查看不到注册信息,一般是因为dubbo-admin默认未配置分组信息,解决方案如下:
修改dubbo-admin-2.6.0/WEB-INF/dubbo.properties文件:
-
dubbo.registry.address=zookeeper:
//192.168.1.11:2181
-
-
dubbo.admin.root.password=root
-
-
dubbo.admin.guest.password=guest
-
-
dubbo.registry.
group=dubbo
再修改dubbo-admin-2.6.0/WEB-INF/classes/META-INF/spring/dubbo-admin.xml文件
找到:
<dubbo:registry address="${dubbo.registry.address}" check="false" file="false"/>
修改为
<dubbo:registry group="dubbo.registry.group" address="${dubbo.registry.address}" check="false" file="false"/>
再重启Dubbo服务和Tomcat服务器,登录到admin即可看见注册的服务。
项目其余参考:
上述项目源码百度云盘下载链接, 提取码: 9nmj