Dubbo的基本应用
背景
我们都知道,技术架构的发展是从单体到分布式,越来越复杂,也越来越必然。
和传统单体架构相比,分布式多了远程通信的过程,远程服务之间的调用才是实现分布式的关键。
远程调用主要实现
1、底层网络通信处理
2、序列化和反序列化
所以,基于这两点基础功能,一般使用RPC框架来实现
常用的有java 的RMI、webservice、Hessian、Dubbo、Thrift等
当业务越来越复杂,实现大规模服务化后,会出现一系列问题,如
1、服务链路变长,如何实现监控
2、服务的大规模集群,需要注册中心来管理
3、需要容错机制
4、需要负载均衡
传统的RPC框架在这些问题上线的力不从心,所以,才有了HSF,Dubbo、JSF、dubbox、motan、sofa等新的RPC框架。
Dubbo
dubbo是什么
dubbo是一个框架
dubbo是一个RPC框架
dubbo是一个高性能的,提供SOA服务治理的RPC框架
dubbo能干什么
主要是解决分布式的服务治理问题,是指大规模服务化后产生的,服务间路由、负载均衡、容错机制、服务降级等一些列问题
dubbo的架构
一共10层架构,由地侧面往上分别是:
1、数据序列化层(Serialize)
2、传输层(Transport)
3、信息交换层(Exchange)
4、远程调用层(protocol)
5、监控层(monitor)
6、集群层(Cluster)
7、服务注册层(Registry)
8、服务代理层(Proxy)
9、配置层(Config)
10、服务接口层(Service)
dubbo的基本应用
实现一下dubbo的远程通信
1、创建服务端
api作为对外暴露的模块,provider作为具体业务代码
dubbo依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.2</version>
</dependency>
api中是用接口,provider实现类
配置application.xml
<!-- 应用-->
<dubbo:application name="pay-service"/>
<!--所用 协议-->
<dubbo:protocol name="dubbo" port="20880"/>
<!-- 具体的发布的服务-->
<dubbo:service interface="com.gupao.dubbo.PayService" ref="payService" />
<bean id="payService" class="com.gupao.dubbo.PayServiceImpl"/>
2、客户端
同理类似
配置 application.xml
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="order-service"/>
<dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" />
<!--没有注册中心时,直接配置service的地址,这里是在本机启动的 -->
<dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" url="dubbo://localhost:20880/com.gupao.dubbo.PayService"/>
启动service,client
请求结果:
dubbo的启动
上面演示的是spring启动的方式,其实还可以使用
Main.main(args)的方式启动,效果是一样的。
args可以是多个值"spring,log4j…等"。
不仅仅是spring,dubbo提供了三种容器供我们选择
容器类型
Spring Container
自动加载 META-INF/spring 目录下的所有 Spring 配置。
logback Container
自动装配 logback 日志
Log4j Container
自动配置 log4j 的配置
Dubbo 提供了一个 Main.main 快速启动相应的容器,默认情况下,只会启
动 spring 容器
通过三种容器去启动的,例如我们看下spring的启动代码
就能理解application.xml放的位置了
dubbo搭配zookeeper注册中心
只需要修改application.xml
服务端加上
<!-- 注册中心 zookeeper -->
<dubbo:registry address="zookeeper://192.168.116.137:2181" />
客户端去掉url链接,改用zookeeper
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="order-service"/>
<!--zookeeper注册中心-->
<dubbo:registry address="zookeeper://192.168.116.137:2181" />
<dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" />
用指令查看zookeeper中注册的url地址
zookeeper终端查看
多注册中心
服务端
<!-- 应用-->
<dubbo:application name="pay-service"/>
<!-- 注册中心 zookeeper -->
<dubbo:registry id="rg1" address="zookeeper://192.168.116.137:2181" />
<dubbo:registry id="rg2" address="zookeeper://192.168.116.138:2181" />
<!--所用 协议-->
<dubbo:protocol name="dubbo" port="20880"/>
<dubbo:service interface="com.gupao.dubbo.PayService" ref="payService" registry="rg1"/>
<dubbo:service interface="com.gupao.dubbo.QueryService" ref="queryService" registry="rg2" />
<bean id="payService" class="com.gupao.dubbo.PayServiceImpl"/>
<bean id="queryService" class="com.gupao.dubbo.QueryServiceImpl" />
客户端
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="order-service"/>
<!--zookeeper注册中心-->
<dubbo:registry id ="rg1" address="zookeeper://192.168.116.137:2181" />
<dubbo:registry id="rg2" address="zookeeper://192.168.116.138:2181" />
<dubbo:reference interface="com.gupao.dubbo.PayService" id="payService" registry="rg1"/>
<dubbo:reference interface="com.gupao.dubbo.QueryService" id="queryService" registry="rg2"/>
Dubbo 集成 Zookeeper 的实现原理
dubbo 每次都要连 zookeeper?
是不是每次发起一个请求的时候,都需要访问注册中心呢?作为一个设计者,你会怎么去解决这个问题。
答案很显然是通过缓存实现
在消费端的配置文件中指定如下路径
<dubbo:registry id=“zookeeper”
address=“zookeeper://192.168.13.102:2181” file=“d:/dubboserver” />
其他注册中心的实现,核心本质是一样的,都是为了管理服务地址,后续会
讲到 nacos;
多协议支持
上面我们演示的是dubbo协议,还可以支持其他协议,比如RMI、webservice
集成webservice
服务端pom.xml引入依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>9.4.19.v20190610</version>
</dependency>
application.xml配置
发布:
支持rest
引入依赖
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.8.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>4.0.0.Final</version>
</dependency>
修改application.xml
稍微修改代码:
测试:http://localhost:8888/pay/22
获取上下文
HttpServletRequest
request=(HttpServletRequest)RpcContext.getContext().getRequest();
或者直接写在方法上
String pay(@PathParam(“info”) String info,@Context HttpServletRequest request);
安装监控
Dubbo 的监控平台也做了更新,不过目前的功能还没有完善,
在 这 个 网 站 上 下 载 Dubbo-Admin 的包:
https://github.com/apache/dubbo-admin
- 修 改 dubbo-admin-server/src/main/resources/application.properties
中的配置信息 - mvn clean package 进行构建
- mvn –projects dubbo-admin-server spring-boot:run
- 访问 localhost:8080
总结
DUbbo是一个很好的远程通信和服务治理的框架