1.dubbo介绍
dubbo是一个分布式服务框架,用于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,dubbo是个服务框架
2.dubbo核心
1.远程通讯:提供多种基于长连接的NIO框架,包括多线程模型,序列化,以及请求-响应模式的信息交换方式
2.集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及负载均衡,失败容错,地址路由,动态配置等集群支持。
3.自然发现:基于注册中心目录服务,使服务消费方能动态查询提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
3.dubbo实现功能
1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需要简单配置,没有任何API侵入
2.软负载均衡及容错机制,可以在内网替换F5等硬件负载均衡器,降低成本,减少单点
3.服务自动注册与发现,不需要写死服务器提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者
4.dubbo采用全spring配置方式,功明化接入应用,对应用没有任何API侵入,只需用spring加载dubbo的配置即可,dubbo基于spring的schema扩展进行加载。
3.架构演变流程
1.传统架构
传统架构即MVC架构,又称为垂直架构,将一个项目整合在一个工程中,适用于小团队开发
优点是:集中管理
缺点是:耦合度高
2.分布式服务架构
分布式架构称为SOA面向服务架构,将一个系统拆分成N多个子系统,每个系统与系统之间互不影响,适合于大团队开发
优点是:降低耦合度,维护性强
缺点是:难管理
4.dubbo工作原理
provider(生产者):提供服务(接口)到注册中心
consumer(消费者):到注册中心订阅服务,一旦有新的服务就会通知consumer(消费者)
consumer(消费者):拿到服务后会到provider(生产者)调用服务
当consumer(消费者)调用provider(生产者)出现的记录会放到 monitor(监控中心)
5.dubbo支持协议
1).dubbo协议
dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。
dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
2).Hessian协议
Hessian协议用于集成Hessian的服务,Hessian底层采用Http通讯,采用Servlet暴露服务,Dubbo缺省内嵌Jetty作为服务器实现。
3).HTTP协议
此协议采用spring 的HttpInvoker的功能实现
4)RMI协议
采用JDK标准的java.rmi实现,采用阻塞式短连接和JDK标准序列化方式
6.生产者环境搭建
1).创建maven工程
2).引入dubbo和zk依赖
dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
3).创建生产者xml配置文件(和spring配置一致)
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="provider" />
<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在29014端口暴露服务 -->
<dubbo:protocol name="dubbo" port="29014" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="test.dubbo.service.Service"
ref="service" />
<!-- 具体的实现bean -->
<bean id="service" class="test.dubbo.service.ServiceImpl" />
4).编写服务接口和实现
public class UserServiceImpl implements UserService{
private static final String SOURCE="未找到....";
public String getServiceId(Integer id) {
System.out.println("已经消费者消费:"+id);
if(id==1){
return "张三";
}
if(id==2){
return "李四";
}
if(id==1){
return "王五";
}
return SOURCE;
}
}
5).测试生产者服务
public class TestProvider {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml");
applicationContext.start();
System.out.println("服务发布成功");
//让程序阻塞
System.in.read();
}
}
7.消费者服务环境搭建
1).创建maven工程
2).引入dubbo+zk依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.6</version>
</dependency>
<!-- 添加zk客户端依赖 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
3).创建消费者配置文件
<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="consumer" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
<!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="service"
interface="testdubbo.service.Service" />
4).创建消费者服务进行消费
public class ConsumerService {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
applicationContext.start();
System.out.println("消费者服务启动成功..");
Service Service = (Service) applicationContext.getBean("Service");
System.out.println("消费者服务调用生产者服务开始...");
String result =service.getServiceId(1l);
System.out.println("消费者服务调用生产者服务结束...result:"+result);
}
}
8.dubbo-admin管理平台搭建
将dubbo-admin.zip 解压到webapps目录下
修改dubbo.properties zk注册中心连接地址连接信息
启动tomcat即可
9.dubbo集群、负载均衡、容错
修改配置文件:
provider.xml 端口号
启动两个服务