1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3.服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。
节点 | 角色说明 |
---|---|
Provider | 暴露服务的服务提供方 |
Consumer | 调用远程服务的服务消费方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
dubbo默认服务间调用使用的是同步方式调用
协议是两个网络实体进行通信的基础,数据在网络上从一个实体传输到另一个实体,以字节流的形式传递到对端。在这个字节流的世界里,如果没有协议,就无法将这个一维的字节流重塑成为二维或者多维的数据结构以及领域对象.
序列化方式将对象数据进行转换
Dubbo对于数据之间传输的序列化也支持多种形式:
JDk方式序列化
hessian方式序列化 (dubbo 默认)
Json方式序列化
协议名称 |
---|
dubbo协议(默认) |
rest协议 |
HTTP协议 |
Hessian协议 |
Redis协议 |
Thrift协议 |
gRpc协议 |
memcached协议 |
RMI协议 |
WebService协议 |
Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低。
特性:
缺省协议,使用基于 mina1.1.7
和 hessian3.2.1
的 tbremoting 交互。
约束:
Serializable
接口List
,Map
,Number
,Date
,Calendar
等接口,只能用 JDK 自带的实现,因为 hessian 会做特殊处理,自定义实现类中的属性值都会丢失。 对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀,对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。而且,对于服务提供方和服务消费方来说,他们还有可能兼具这两种角色,即既需要提供服务,有需要消费服务。
通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一.
在dubbo2.7版本中支持5种注册中心
注册中心名称 |
---|
Nacos注册中心(新dubbo之后) alibaba cloud 的 官方 注册和配置中心 eureka(可用性) |
Zookeeper注册中心(推荐) 分布式一致性协调服务器系统 (一致性) |
Multicast 注册中心 |
Redis 注册中心 |
Simple 注册中心 |
Zookeeper 是 Apache Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用
2. Dubbo服务治理 Dubbo启动检查 Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认check="true"
。
可以通过check="false"
关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖
,必须有一方先启动。
另外,如果你的 Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,请关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果check="false"
,总是会返回引用,当服务恢复时,能自动连上。
在微服务应用中都是多实例部署,也就是说同一份代码部署多台机器或容器中,这样做的好处是提高服务处理能力。同时由于集群部署,所以整个集群也有容错的能力。当我们在调用集群中一个实例时出错,我们可以重试另外一个实例这样大大提高了应用的可靠性。假设系统没有容错处理能力那么即使有集群的部署在调用应用失败情况下不能重试其他实例,这样可靠性大大降低,并极大的浪费系统资源.
在Dubbo中有6种容错模式分别是:
Failover Cluster
失败自动切换:当我们在调用Dubbo服务时出现失败,容错策略会重试其它服务器 。
使用场景:对于一些必达性要求高的服务调用,但是服务提供方要求做幂等处理 。
Failfast Cluster
快速失败:只发起一次调用,如果调用Dubbo服务失败立即报错。
使用场景:通常用于非幂等性的写操作,比如新增记录。
Failsafe Cluster
失败安全:当调用Dubbo服务出现异常时,直接忽略。
使用场景:通常用于运行数据丢失常见,例如:日志记录等操作。
Failback Cluster
失败自动恢复:当调用Dubbo服务失败,后台记录失败请求并定时重发。
使用场景:通常用于必达通知场景,例如:消息通知操作。
Forking Cluster
集群并行:并行调用多个Dubbo服务,只要其中有一个成功即返回。
使用场景:通常用于从多个源获取相同数据,以获取最快的响应速度,例如:同时从多个备库查询数据。
Broadcast Cluster
集群广播:循环调用所有Dubbo服务提供者,任意一台报错则报错。
使用场景:通用用于向多个实例通知消息,例如:更新集群中所有应用缓存或日志。
5. Zookeeper安装 1.安装1.在local下创建zookeeper文件夹
2.上传zookeeper文件到创建的文件夹
3.使用 tar -xzvf解压zookeeper
4.进入zookeeper的conf文件夹,复制zoo_sample.cfg为zoo.cfg,因为启动时默认会去找这个文件名
5.在解压后的目录中创建data文件夹
6.设置zoo.cfg文件,设置dataDir为创建的data文件夹路径
7.进入bin目录,使用./zkServer.sh start启动zookeeper服务
2.集群搭建修改各个linux下的zoo.cfg配置文件,向文件中添加
server.1=192.168.25.100:2888:3888
server.2=192.168.25.101:2888:3888
server.3=192.168.25.102:2888:3888
其中1,2,3为各集群节点的id,需要在data目录下创建myid文件并设置文件里面内容为各个节点的id。
6. Spring整合Dubbo 6.1 Provider生产者1.pom依赖
com.alibaba dubbo 2.6.0 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1
2.spring整合dubbo配置文件
服务接口暴露注册时,可采用dubbo的**@Service**注解进行服务接口注册
6.2 Consumer消费者1.pom依赖
org.example dubbo-provider 1.0-SNAPSHOT com.alibaba * com.alibaba dubbo 2.6.0 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1
2.spring整合dubbo消费端配置文件
7. SpringBoot整合Dubbo
7.1 Provider生产者1.pom依赖
4.0.0 org.example springboot-dubbo-provider 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-web com.alibaba.boot dubbo-spring-boot-starter 0.2.1.RELEASE com.alibaba dubbo 2.6.5 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1 org.apache.curator curator-framework 4.1.0
2.yml核心配置文件
dubbo:
application:
name: dubbo_provider
protocol:
name: dubbo
port: 20880
registry:
address: zookeeper://192.168.25.100:2181
protocol: zookeeper
scan:
base-packages: com.li.service
spring:
application:
name: dubbo_provider
server:
port: 8084
3.服务暴露注册
package com.li.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.li.pojo.Goods;
import com.li.service.GoodsService;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
@Service
@Component
public class GoodsServiceImpl implements GoodsService {@Override
public void save() {System.out.println("save方法被远程调用了");
}
@Override
public String get() {return "远程调用get方法";
}
@Override
public Goods findGoods() {Goods goods = new Goods(1,"小米2",new BigDecimal(2333));
return goods;
}
}
7.2 Consumer消费者1.pom依赖
4.0.0 org.example springboot-dubbo-consumer 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-parent 2.1.8.RELEASE org.springframework.boot spring-boot-starter-web com.alibaba.boot dubbo-spring-boot-starter 0.2.1.RELEASE com.alibaba dubbo 2.6.5 com.caucho hessian 4.0.38 org.apache.zookeeper zookeeper 3.4.6 com.github.sgroschupf zkclient 0.1 org.apache.curator curator-framework 4.1.0
2.yml核心配置文件
dubbo:
application:
name: dubbo_consumer
protocol:
name: dubbo
port: 20881
registry:
address: zookeeper://192.168.25.100:2181
protocol: zookeeper
spring:
application:
name: dubbo_consumer
server:
port: 8083
3.服务消费
package com.li.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.li.service.GoodsService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {@Reference
private GoodsService goodsService;
@RequestMapping("/aaa")
public void test01(){String s = goodsService.get();
System.out.println(s);
}
}
8.Dubbo的Spi机制的过滤器扩展应用:系统参数的过滤器校验
1.方法调用时添加对应的接口验证参数
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {if(servletContext!=null&&contextRefreshedEvent.getApplicationContext().getParent()==null){servletContext.setAttribute("root",servletContext.getContextPath());
//由于系统参数需要防止恶意调用修改,所以需要存一个令牌来进行进行验证,当调用放调用接口时,
// 通过dubbo过滤器来验证是否正确,正确则调用,否则抛出异常
//获取RPC上下文对象
RpcContext context = RpcContext.getContext();
context.setAttachment("systemConfigToken","dugasud78dt67q6d");
//获取数据库系统参数赋值给配置文件
ListconfigList = systemConfigService.findAllConfig();
for (ConfigVo config : configList) {PropertiesUtils.setProp(config.getConfigname(),config.getConfigvalue().toString());
}
}
}
2.被调用接口的接口拦截验证
//dubbo过滤器,需要手动在xml中添加,不能使用@Component注解交给Spring,不生效,且不写全包名
@Activate(group = "provider")
public class RequestAuthFilter implements Filter {@Override
public Result invoke(Invoker>invoker, Invocation invocation) throws RpcException {//获取上下文对象,判断传过来的令牌是否正确
RpcContext context = RpcContext.getContext();
String tokenValue = context.getAttachment("systemConfigToken");
if(!"dugasud78dt67q6d".equals(tokenValue)){//不相等抛异常
throw new RpcException("非法调用请求");
}
//调用
return invoker.invoke(invocation);
}
}
3.验证接口的配置
/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
requestAuthFilter=com.li.config.service.impl.RequestAuthFilter
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧