一.SOA
- 英文名称(Service Oriented Ambiguity)
- 中文名称:面向服务架构
- 2.1 有一个专门提供服务单元.
- 2.2 其他所有单元都调用这个服务.
- SOA定位:
- 3.1 如何设计项目,让开发时更有效率.
- 3.2 SOA是一种思想
- 之前项目架构设计
- 4.1 在公司项目不允许所有项目都访问数据库.
-
4.2 开发时,数据库访问层代码可能出现冗余
- 使用SOA架构
- 5.1 专门访问数据库服务(项目).
- 5.2 开发时可以实现,数据访问控制和代码复用.
- 实现SOA架构时,常用服务.
- 6.1 Dubbo 做为服务.
- 6.2 WebService 做为服务.
- 6.3 Dubbox 做为服务.
- 6.4 服务方就是web项目,调用web项目的控制器.
- 6.4.1 使用HttpClient可以调用其他项目的控制器.
二. RPC
- 英文名称(Remote Procedure Call Protocol)
- 中文名称:远程过程调用协议
-
RPC解析:客户端(A)通过互联网调用远程服务器,不知道远程服务器具体实现,只知道远程服务器提供了什么功能.
- RPC最大优点:
- 4.1 数据安全性.
三.Dubbo简介
- Dubbo:一个分布式、高性能、透明化的RPC服务框架
- 作用:提供服务自动注册、自动发现等高效服务治理方案.
- Dubbo架构图
- 3.1 Provider :提供者,服务发布方.
- 3.2 Consumer:消费者, 调用服务方
- 3.3 Container:Dubbo容器.依赖于Spring容器.
- 3.4 Registry: 注册中心.当Container启动时把所有可以提供的服务列表上Registry中进行注册.
- 3.4.1 作用:告诉Consumer提供了什么服务和服务方在哪里.
- 3.5 Monitor:监听器
- 3.6 虚线都是异步访问,实线都是同步访问
- 3.7 蓝色虚线:在启动时完成的功能
- 3.8 红色虚线(实线)都是程序运行过程中执行的功能
-
3.9 所有的角色都是可以在单独的服务器上.所以必须遵守特定的协议.
- 运行原理:
- 4.0 启动容器,相当于在启动Dubbo的Provider
- 4.1 启动后会去注册中心进行注册.注册所有可以提供的服务列表
- 4.2 在Consumer启动后会去Registry中获取服务列表和Provider的地址.进行订阅.
- 4.3 当Provider有修改后,注册中心会把消息推送给Consummer
- 4.3.1 使用了观察者设计模式(又叫发布/订阅设计模式)
- 4.4 根据获取到的Provider地址,真实调用Provider中功能.
- 4.4.1 在Consumer方使用了代理设计模式.创建一个Provider方类的一个代理对象.通过代理对象获取Provider中真实功能,起到保护Provider真实功能的作用.
- 4.5 Consumer和Provider每隔1分钟向Monitor发送统计信息,统计信息包含,访问次数,频率等.
四.Dubbo支持的注册中心
- Zookeeper
- 1.1 优点:支持网络集群
- 1.2 缺点:稳定性受限于Zookeeper
- Redis
- 2.1 优点:性能高.
- 2.2 缺点:对服务器环境要求较高.
- Multicast
- 3.1 优点:面中心化,不需要额外安装软件.
- 3.2 缺点:建议同机房(局域网)内使用
- Simple
- 4.1 适用于测试环境.不支持集群.
五.Zookeeper讲解
- Zookeeper 分布式协调组件.
- 1.1 本质一个软件.
- Zookeeper常用功能
- 2.1 发布订阅功能.把zookeeper当作注册中心原因.
- 2.2 分布式/集群管理功能.
- 使用java语言编写的.
- zookeeper单机版安装过程
前提: 已经配置好jdk环境变量
4.1 上传zookeeper 安装包到linux中/usr/local/temp 中(目录随意,对安装无影响)
4.2 解压zookeeper压缩包
tar zxvf /usr/local/temp/zookeeper-3.4.8.tar.gz
4.3 复制zookeeper解压后的文件夹到/usr/local下并起名为zookpper(复制后名称任意,对安装无影响)
cp -r /usr/local/temp/zookeeper-3.4.8 /usr/local/zookeeper
4.4 进入到zookeeper文件夹中
cd /usr/local/zookeeper
4.5 在zookeeper中新建data文件夹,做为zookeeper数据存储文件夹
mkdir data
4.6 进入到conf文件夹
cd conf
4.7 复制zoo_sample.cfg,并给新起名的zoo.cfg
cp zoo_sample.cfg zoo.cfg
4.8 修改zoo.cfg中dataDir属性值为新建data文件夹的路径
vim zoo.cfg
修改后的效果:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/zookeeper/data
# the port at which the clients will connect
clientPort=2181
进入到zookeeper/bin文件夹,使用zkServer.sh启动zookeeper
cd ../bin
./zkServer.sh start
启动成功效果图
[root@localhost zookeeper]# ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看状态,其中Mode: standalone表示单机版
./zkServer.sh status
[root@localhost zookeeper]# ./bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: standalone
为了外部能访问,需要在防火墙中放行2181端口
六. Dubbo支持的协议
- Dubbo
- 1.1 Dubbo官方推荐的协议.
- 1.2 本质:使用NIO和线程池进行处理.
- 1.3 缺点:大文件传输时可能出现文件传输失败问题.
- RMI
- 2.1 JDK提供的协议,远程方法调用协议.
- 2.2 缺点:偶尔连接失败.
- 2.3 优点:JDK原生,不需要进行额外配置(导入jar)
- Hession
- 3.1 优点:基于http协议,http请求支持.
- 3.2 缺点:需要额外导入jar,并在短连接时性能低
七.Dubbo中Provider搭建
- 新建Maven Project, 里面只有接口(dubbo-service)
- 1.1 为什么这么做?
RPC框架,不希望Consumer知道具体实现.如果实现类和接口在同一个项目中,Consumer依赖这个项目时,就会知道实现类具体实现.
- 新建Maven Project, 写接口的实现类(dubbo-service-impl)
- 在dubbo-service-impl中配置pom.xml
- 3.1 依赖接口
- 3.2 依赖dubbo,去掉老版本spring
- 3.3 依赖新版本spring
- 3.4 依赖zookeeper客户端工具zkClient
<parent>
<artifactId>dubbo-demo</artifactId>
<groupId>com.lsw</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-service-impl</artifactId>
<dependencies>
<dependency>
<artifactId>dubbo-service</artifactId>
<groupId>com.lsw</groupId>
<version>1.0-SNAPSHOT</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>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<!--访问zookeeper的客户端jar包-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 指定项目的打包插件信息 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!-- 指定打包描述文件的位置:相对项目根目录的路径 -->
<!-- assembly打包的描述文件 -->
<descriptor>assembly/assembly.xml</descriptor>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 新建实现类,并实现接口方法.
- 新建配置文件applicationContext-dubbo.xml,并配置
- 5.1 <dubbo:application/> 给provider起名,在monitor或管理工具中区别是哪个provider
- 5.2 <dubbo:registry/> 配置注册中心
- 5.2.1 address:注册中心的ip和端口
- 5.2.2 protocol使用哪种注册中心
- 5.3 <dubbo:protocol/> 配置协议
- 5.3.1 name 使用什么协议
- 5.3.2 port: consumer invoke provider时的端口号
- 5.4 <dubbo:service/> 注册接口
- 5.4.1 ref 引用接口实现类<bean>的id值
<?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/context/spring-context.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--给当前Provider自定义名字-->
<dubbo:application name="dubbo-service"/>
<!--配置注册中心-->
<dubbo:registry address="192.168.84.138:2181" protocol="zookeeper"></dubbo:registry>
<!--配置端口-->
<dubbo:protocol name="dubbo" port="20888"></dubbo:protocol>
<!--注册功能-->
<dubbo:service interface="com.lsw.dubbo.service.DemoService" ref="demoServiceImpl">
</dubbo:service>
<bean id="demoServiceImpl" class="com.lsw.dubbo.service.impl.DemoServiceImpl">
</bean>
<!--只需在实现类上加入@Service注册即可,但这个注册跟声明式事务aop有冲突,所以不推荐注解方式-->
<!--<dubbo:annotation package="com.lsw.service.impl"/>-->
</beans>
- 启动容器
- 6.1 通过spring方式启动
- 6.1.1 applicationContext-dubbo.xml位置没有要求
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-dubbo.xml");
ac.start();
System.out.println("启动成功");
6.2 使用dubbo提供的方式启动(推荐使用这种方式)
- 6.2.1 要求applicationContext-dubbo.xml必须放入类路径下/META-INF/spring/*.xml
Main.main(args);
八. Admin管理界面
前提:dubbo-admin-2.5.3.war要求jdk1.7
- 本质就是一个web项目
- 获取注册中心内Provider注册的信息.用页面呈现出来.
- 实现步骤
- 3.1 把dubbo-admin-2.5.3.war上传到服务器tomcat中.
- 3.2 启动tomcat完成后关闭tomcat,删除上传的dubbo-admin-2.5.3.war
- 3.2.1 为什么要删除:需要修改解压后的文件夹,如果不删除.war文件,下次重启tomcat会还原成未修改状态
- 3.3 进入dubbo-admin-2.5.3/WEB-INF/dubbo.properties,修改第一行为zookeeper的ip和端口
- 3.3.1 第二行和第三行为管理界面的用户名和密码
dubbo.registry.address=zookeeper://192.168.84.138:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
- 3.4 启动tomcat, 在浏览器地址栏访问tomcat中dubbo项目
九.Consumer搭建过程
1.在pom.xml中除了ssm的依赖添加dubbo相关3个依赖(接口,dubbo.jar,zkClient)
2.web.xml中修改<init-value>applicationContext-*.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
- spring配置文件命名为applicationContext-spring.xml,配置dubbo的配置文件applicationContext-dubbo.xml
<!--给当前Provider自定义名字-->
<dubbo:application name="dubbo-consumer-web"/>
<!--配置注册中心-->
<dubbo:registry address="192.168.84.138:2181" protocol="zookeeper"></dubbo:registry>
<!--配置注解扫描-->
<dubbo:annotation package="com.lsw.consumer.service.impl"/>
- 不需要编写mapper
- 除了ServiceImpl中引用Provider中接口对象改变,其他代码都一样.
package com.lsw.consumer.service.impl;
import com.alibaba.dubbo.config.annotation.Reference;
import com.lsw.consumer.service.TestService;
import com.lsw.dubbo.service.DemoService;
import org.springframework.stereotype.Service;
/**
* @作者 lishw
* @创建时间 2018/12/27
* @描述
*/
@Service
public class TestServiceImpl implements TestService {
@Reference
private DemoService demoService;
@Override
public void test() {
//implement
}
}
十. Maven打包插件Assembly
- 在dubbo的provider项目(实现类项目)中pom.xml配置assembly插件信息
<build>
<plugins>
<!-- 指定项目的打包插件信息 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!-- 指定打包描述文件的位置:相对项目根目录的路径 -->
<!-- assembly打包的描述文件 -->
<descriptor>assembly/assembly.xml</descriptor>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 在项目根目录下新建assembly文件夹
- 在assembly文件夹中新建assembly.xml
<?xml version='1.0' encoding='UTF-8'?>
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<!-- 该字符会添加到最终tar.gz包的名称后面,作为后缀 -->
<id>assembly</id>
<!-- 指定打包的格式为tar.gz,该类型压缩包在linux中比较常见 -->
<formats>
<format>tar.gz</format>
</formats>
<!-- 在tar.gz压缩包中是否包含根文件夹,该根文件夹名称和tar.gz去掉id后缀一致 -->
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<!-- 将项目根路径下assembly/bin路径中的内容打包到压缩包中的根目录下的bin目录中 -->
<fileSet>
<!-- 相对项目根路径的相对路径 -->
<directory>assembly/bin</directory>
<outputDirectory>bin</outputDirectory>
<!-- 设置最终tar.gz中该文件夹下的权限,跟linux权限写法一致 -->
<fileMode>0755</fileMode>
</fileSet>
<!-- 将项目根路径下assembly/conf路径中的内容打包到压缩包中的根目录下的conf目录中 -->
<fileSet>
<directory>assembly/conf</directory>
<outputDirectory>conf</outputDirectory>
<!-- 设置其linux权限 -->
<fileMode>0644</fileMode>
</fileSet>
</fileSets>
<!-- 将所有依赖的jar包打包到压缩包中的根目录下的lib目录中 -->
<!-- 此lib目录中包含自己开发的项目jar包以及demo_service.jar,还有第三方的jar包 -->
<dependencySets>
<dependencySet>
<outputDirectory>lib</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
- 解压下载的dubbo-monitor-simple-2.5.3-assembly.tar.gz压缩包,把解压后的bin和conf粘贴到项目下assembly文件夹中.
- 4.1 清空conf/dubbo.properties中内容.
- 进入dubbo的provider项目(实现类项目) 执行 maven install
- 5.1 在target下出现: 项目名-版本-assembly.tar.gz压缩包
- 把压缩包复制到window或linux中
- 6.1 window中使用start.bat启动,关闭命令窗口关闭服务.
- 6.2 linux中使用start.sh启动使用stop.sh关闭.
十一. 部署dubbo-monitor-simple
1.dubbo-monitor简介
监控中心负责统计各服务器调用次数,调用时间等并以报表展示。Monitor可以不安装。它不会影响Consumer和Provider之间的调用。
部署前提:dubbo-monitor是一个web工程,是基于内嵌的jetty。dubbo-monitor是使用java编写的项目,所以部署前需要安装jdk。
1.创建dubbo-monitor并上传dubbo-monitor压缩包至此目录下
[root@localhost ~]# mkdir /usr/local/dubbo-monitor
2.解压dubbo-monitor-simple压缩包
[root@localhost ~]# cd /usr/local/dubbo-monitor/
[root@localhost dubbo-monitor]# tar -xvf dubbo-monitor-simple-2.5.3-assembly.tar.gz
3.修改dubbo.properties配置文件
[root@localhost dubbo-monitor]# vi dubbo-monitor-simple-2.5.3/conf/dubbo.properties,修改内容如下:
##
dubbo.container=log4j,spring,registry,jetty
dubbo.application.name=simple-monitor
dubbo.application.owner=
#dubbo.registry.address=multicast://224.5.6.7:1234 #注释这一行
dubbo.registry.address=zookeeper://192.168.84.138:2181 #zookeeper注册中心地址
#dubbo.registry.address=redis://127.0.0.1:6379
#dubbo.registry.address=dubbo://127.0.0.1:9090
dubbo.protocol.port=7070 #这是monitor自身要发布的接口使用的端口
dubbo.jetty.port=7000 #这是monitor提供的web界面的接口
dubbo.jetty.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3 #这是dubbo monitor的解压目录
dubbo.charts.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3/charts
dubbo.statistics.directory=/usr/local/dubbo-monitor/dubbo-monitor-simple-2.5.3/statistics
dubbo.log4j.file=logs/dubbo-monitor-simple.log
dubbo.log4j.level=WARN
4.在Dubbo服务提供者和服务消费者中的spring配置文件中增加以下配置:
<dubbo:monitor protocol="registry"/>
注:
如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心,直连监控中心服务器地址,如: <dubbo:monitor address="192.168.84.138:7070"/>
- 启动/停止
通过 bin/start.sh,stop.sh来启动停止monitor
- 访问monitor服务
通过 http://host_ip:7000(dubbo.jetty.port配置的端口)访问monitor服务
网友评论