dubbo-环境隔离

dubbo-环境隔离,第1张

        大家在平时开发和测试阶段定位一些bug的时候,需要调用本地启动的dubbo服务debug。如果与服务器、其他同事共用一个注册中心的话,就会调用到别人的服务或者自己本地的服务被别人调用到,造成一些调用失败或者其他异常。

       解决如上问题有大致几种解决方案:

       1、dubbo直连;

       2、dubbo group 服务分组;

       3、dubbo version 版本过渡;

        在开发以及测试环境下,经常需要绕过注册中心,只测试指定服务的提供者,这时候可  以使用点对点直连的方式。点对点直连方式,将以服务接口为单位,忽略注册中心的提供者表。A接口配置点对点,不影响B接口从注册中心获取列表。

      消费者应用,在注入的提供者api上添加 @Reference(version = "1.0.0", url = "dubbo://ip:port") 即可!

      此时,如果提供者不希望本地的服务被别人调用到,设置:dubbo.registry.register=false,默认值是true。该属性含义: 是否向此注册中心注册服务,如果设为false,将只订阅,不注册。

        通过服务分组实现环境隔离,不用绕过注册中心,大家可以共用一个注册中心。服务注册分组,使跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。

      场景:服务A希望调用到本地的服务B(此时,B服务正常的调用远程服务C),而不是远程服务B。

      本地服务B的配置设置如下:                                                                                                          //应用全局配置                                                                              dubbo.provider.group=local-group   //设置本地B所提供的dubbo服务均在local-group分组下如图:

       //针对某个Api进行配置

      也可以针对某个api单独做分组,例如:@Service(version = "1.0.0",group = "local-group")服务A:在注入的B dubbo服务的api上加 @Reference(version = "1.0.0", group = "local-group")  即可。

      服务分组的几个属性解释:

1、dubbo.registry.group=local-group 

          该值自行定义,确保唯一即可,该属性含义:服务注册分组,跨组的服务不会相互影响,也无法相互调用,适用于环境隔离。 该配置不推荐配置,配置之后服务在dubbo admin上默认无法查看,也调用不到该服 务。不同环境,通过zookeeper做数据隔离。

            

      2、dubbo.provider.group=local-group  

       该属性含义:服务分组,当一个接口有多个实现,可以用分组区分。该配置使当前服务所有的提供者都在local-group下。也可以只针对某个api做配置@Service(version ="1.0.0",group ="local-group");推荐后者!

     3、dubbo.consumer.group=local-group 

           该配置使当前服务只消费local-group分组下的提供者,建议只针对某个api进行配置即可,例如: @Reference(version ="1.0.0", group ="local-group")

            当一个接口的实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。dubbo.provider.version=1.0 //服务版本, 建议使用两位数字版本,如:1.0 ,通常在接口不兼容时版本号才需要升级。

 dubbo.consumer.version=1.0 //消费1.0版本的提供者

 可全局配置,亦可配置到某个api服务上,此时优先级大于全局配置。

 提供者服务示例:@Service(version ="your version")

 消费者api服务示例: @Reference(version ="your version")

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/loadbalance

如果在消费端和服务端都配置了负载均衡策略,以消费端为准。

在服务提供者和服务消费者上都可以配置服务超时时间,这两者是不一样的。

消费者调用一个服务,分为三步:

1.消费者发送请求(网络传输)

2.服务端执行服务

3.服务端返回响应(网络传输)

如果在服务端和消费端各配置了一个timeout,那就比较复杂了,假设

1.服务执行为5s

2.消费端timeout=3s

3.服务端timeout=6s

那么消费端掉用服务时,消费端会收到超时异常(因为消费端超时了),服务端一切正常(服务端没有超时)。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/fault-tolerent-strategy/

集群容错表示:服务消费者在掉用某个服务时,这个服务有多个服务提供者,在经过负载均衡后选择其中一个服务提供者之后进行调用,但调用报错后,Dubbo所采取的后续处理策略。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/service-downgrade/

服务降级表示:服务消费者在调用某个服务提供者时,如果该服务提供者报错了,所采取的措施。

集群容错和服务降级的区别在于:

1.集群容错时整个集群范围内的容错

2.服务降级时单个服务提供者的自身容错

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-stub/

本地存根:名字很抽象,但实际上不难理解,本地存根就是一段逻辑,这段逻辑是在服务消费端执行的,这段逻辑一般都是由服务提供者提供,服务提供者可以利用这种机制在服务消费者远程调用服务提供者之前或之后再做一些其他事情,比如结果缓存,请求参数验证等等。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/local-mock

本地伪装就是Mock,Dubbo中的Mock的功能相对于本地存根更简单一点,Mock其实就是Dubbo中的服务容错的解决方案。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/callback-parameter/

如果当前服务支持参数回调,意思就是对于某个服务接口中的某个方法,如果想支持消费者在调用这个方式时能设置回调逻辑,那么该方法就是需要提供一个入参用来表示回调逻辑

因为Dubbo协议是基于长连接,所以消费者在两次调用同一个方法想指定不同的回调逻辑,那么就需要在调用时在指定一定key进行区分。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/async-call/

理解起来比较容易,主要要理解CompletableFuture,如果不理解,就直接把它理解为Future

其他异步调用方式: https://mp.weixin.qq.com/s/U3eyBUy6HBVy-xRw3LGbRQ

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/generic-reference/

泛化调用可以用来做服务测试。

在Dubbo中,如果某个服务想要支持泛化调用,就可以将该服务的generic属性设置为true,那对于服务消费者来说,就可以不用依赖该服务的接口,直接利用GenericService接口来进行服务调用

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/generic-service/

实现了GenericService接口就是泛化服务

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/rest/

github地址: https://github.com/apache/dubbo-admin

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/examples/config-rule/

注意动态配置修改的是服务参数,并不能修改服务的协议,IP,PORT,VERSION,GROUP,因为这5个信息是服务的标识信息,是服务的身份z号,是不能修改的。

官网地址: http://dubbo.apache.org/zh/docs/v2.7/user/example/routing-rule/

https://zhuanlan.zhihu.com/p/42671353

Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层解耦。

Dubbo在调用远程的服务的时候再本地有一个接口,就想调用本地方法一样去调用,底层实现好参数传输和远程服务运行结果传回之后的返回。

Dubbo的特点:

(1)它主要使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。

(2)采用注册中心管理众多的服务接口地址,当你想调用服务的时候只需要跟注册中心询问即可,不像使用WebService一样每个服务都得记录好接口调用方式。

(3)监控中心时实现服务方和调用方之间运行状态的监控,还能控制服务的优先级、权限、权重、上下线等,让整个庞大的分布式服务系统的维护和治理比较方便。

(4)高可用,如果有服务挂了,注册中心就会从服务列表去掉该节点,客户端会像注册中心请求另一台可用的服务节点重新调用。同时注册中心也能实现高可用(ZooKeeper)。

(5)负载均衡,采用软负载均衡算法实现对多个相同服务的节点的请求负载均衡。

Dubbo需要四大基本组件:Rigistry,Monitor,Provider,Consumer。

1、监控中心的配置文件-dubbo.properties文件

(1)容器,监控中心是在jetty和spring环境下运行,依赖于注册中心,日志系统是log4j

    dubbo.container = log4j,spring,registry,jetty

(2)监控服务的名称,监控系统对整个Dubbo服务系统来说也是一个服务

    dubbo.application.name = simple-monitor

(3)服务的所有者,这是Dubbbo的服务的功能,可以指定服务的负责人

    dubbo.application.owner = coselding

(4)注册中心的地址,配置后监控中心就能通过注册中心获取当前可用的服务列表及其状态,在页面向你汇报Dubbo中的服务运行情况。

    dubbo.registr.address = multicast://{ip}:{port} //广播

    dubbo.registr.address = zookeeper://{ip}:{port} //zookeper

    dubbo.registr.address = redis://{ip}:{port} //redis

    dubbo.registr.address = dubbo://{ip}:{port} //dubbo

(5)dubbo协议端口号

    dubbo.protocol.port = 7070

(6)jetty工作端口号

    dubbo.jetty.port = 8082

(7)工作目录,用于存放监控中心的数据

    dubbo.jetty.directory = ${user.home}/monitor

(8)监控中心报表存放目录

    dubbo.charts.directory=${dubbo.jetty.directory}/charts

(9)监控中心数据资料目录

    dubbo.statistics.directory=${user.home}/monitor/statistics

(10)监控中心日志文件路径

    dubbo.log4j.file=logs/dubbo-monitor-simple.log

(11)监控中心日志记录级别

    dubbo.log4j.level=WARN

2、Dubbo提供负载均衡方式

(1)Random,随机,按权重配置随机概率,调用量越大分布越均匀,默认方式。

(2)RounRobin,轮询,按权重设置轮询比例,如果存在比较慢的机器容易在这台机器上请求阻塞较多。

(3)LeastActive,最少活跃调用数,不支持权重,只能根据自动识别的活跃数分配,不能灵活调配。

(4)ConsistenHash,一致性hash,对相同参数的请求路由到一个服务提供者上,如果有类似灰度发布需求可采用。

3、Dubbo过滤器

Dubbo初始化过程加载ClassPath下的META-INF/dubbo/internal/,META-INF/dubbo/,META-INF/services/三个路径下的com.alibaba.dubbo.rpc.Filter文件。文件内容:

    Name = FullClassName,这些类必须实现Filter接口。

自定义Filter类:

配置文件在配置过滤器,consumer.xml中:

Dubbo对过滤器的加载过程:

    先加载三个路径下的com.alibaba.dubbo.rpc.Filter文件里面的键值对,key为过滤器名称,value为过滤器的类的全限定名(这个类必须实现Dubbo中的Filter接口)。

    自定义的类中@Active注解是过滤器设定的全局基本属性。

    Spring在加载consumer.xml文件时,通过 <dubbo:consumer filter="xxx" id = "xxx" retrries = "0">这个配置指定消费者端要加载的过滤器,通过filter属性指定过滤器名称。

@Activate注解-自动激活,group属性是表示匹配了对应的角色才被加载,value表示表明过滤条件,不写则表示所有条件都会被加载,写了则只有dubbo URL中包含该参数名且参数值不为空才被加载,这个参数会以dubbo协议的一个参数K-V对传到Provider。

4、Dubbo的Provider配置

5、Dubbo的Consumer配置

1、Dubbo是什么?

Dubbo是阿里巴巴开源的基于Java的高性能RPC分布式框架。

2、为什么使用Dubbo?

很多公司都在使用,经过很多线上的考验,内部使用了Netty,Zookeeper,保证了高性能可用性。

使用Dubbo可以将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,可以提高业务复用灵活性扩展,使前端应用能快速的响应对边的市场需求。分布式架构可以承受更大规模的并发流量。

Dubbo的服务治理图:

3、Dubbo和Spring Cloud的区别

两个没有关联,但是非要说区别,有如下几点:

(1)通信方式不同,Dubbo使用RPC通信,Spring Cloud使用HTTP Restful方式

(2)组成部分不同

4、Dubbo支持的协议

dubbo://  (推荐);rmi:// ;hessian:// ;http:// ;webservice:// ;thrift:// ;memcached:// ;redis:// ;rest:// 。

5、Dubbo需要容器吗?

不需要,如果硬要容器的话,会增加复杂性,同时也浪费资源。

6、Dubbo内置的服务容器

Spring Container;Jetty Container;Log4j Container。

7、Dubbo中节点角色

Register,Monitor,Provider,Consumer,Container(服务运行的容器)。

8、Dubbo的服务注册和发现的流程图

9、Dubbo的注册中心

默认使用Zookeper作为注册中心,还有Redis,Multicast,dubbo注册中心。

10、Dubbo的配置方式

Spring配置方式和Java API配置方式

11、Dubbo的核心配置

(1)dubbo:service 服务配置

(2)dubbo:referece 引用配置

(3)dubbo:protocol 协议配置

(4)dubbo:application 应用配置

(5)dubbo:registry 注册中心配置

(6)dubbo:monitor 监控中心配置

(7)dubbo:provider 提供方配置

(8)dubbo:consumer 消费方配置

(9)dubbo:method 方法配置

(10)dubbo:argument 参数配置

12、在Provider 节点上可以配置Consumer端的属性有哪些?

(1)timeout:方法调用超时

(2)retries:失败重试次数,默认是2次

(3)loadbalance:负载均衡算法,默认随机

(4)actives消费者端,最大并发调用控制

13、Dubbo启动时如果依赖的服务不可用会怎样

Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。默认check ="true"。

14、Dubbo序列化框架

推荐使用Hessian序列化,还有Dubbo,FastJson,Java自带序列化。

15、Dubbo的通信框架

默认使用Netty框架,另外也提供了Mina,Grizzly。

16、Dubbo集群容错方案

(1)Failover Cluster,失败自动切换,自动重试其他服务器。

(2)Failfast Cluster,快速失败,立即报错,只发起一次调用。

(3)Failsafe Cluster,失败安全,出现异常时,直接忽略。

(4)Failback Cluster,失败自动恢复,记录失败请求,定时重发。

(5)Forking Cluster,并行调用多个服务器,只要一个返回成功即可。

(6)Broadcast Cluster,广播逐个调用所有提供者,任意一个报错则报错。

17、Dubbo的负载均衡策略

(1)Random LoadBalance,随机,按权重设置随机概率,默认。

(2)RoundRobin LoadBalace,轮询,按公约后的权重设置轮训比例。

(3)LeastActive LoadBalace,最少活跃调用数,相同活跃数的随机。

(4)ConsistenHash LoadBalance,一致性hash,相同参数的请求总是发到用一个服务器。

18、指定某一个服务

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

<dubbo:reference interface="com.weidian.dubbo.IMyDemo" version="1.0" id="myDemo" url="dubbo://127.0.0.1:20880/"></dubbo:reference>

19、Dubbo多协议

Dubbo允许配置多协议,在不同服务器上支持不同协议,或者同一服务支持多种协议。

20、当一个服务有多种实现时怎么做?

当一个接口有多种是现实,可以用group属性来分组,服务提供方和消费方都指定同一个group即可。

21、兼容旧版本

使用版本号过度,多个不同版本的服务注册到注册中心,版本号不同的服务相互间不引用。

22、Dubbo可以缓存吗?

Dubbo提供声明式缓存,用于加速热门数据的访问速度,以减少用户加缓存的工作量。

23、Dubbo服务之间的调用时阻塞的吗?

默认是同步等待结果阻塞的,支持异步调用。Dubbo是基于NIO的非阻塞实现并行调用的,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个Future对象。

24、Dubbo不支持分布式事务

25、Dubbo必须依赖的包

Dubbo必须依赖JDK,其他为可选。

26、Dubbo使用过程中的问题

Dubbo的设计目的是为了满足高并发小数据量的rpc请求,在大数据量下性能表现不是很好,建议使用rmi或http协议。

27、Dubbo的管理控制台的作用

路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡。

28、Spring boot整合Dubbo

(1)添加依赖

        <!-- https://mvnrepository.com/artifact/com.alibaba.boot/dubbo-spring-boot-project -->

        <dependency>

            <groupId>com.alibaba.boot</groupId>

            <artifactId>dubbo-spring-boot-starter</artifactId>

            <version>0.1.0</version>

        </dependency>

        <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->

        <dependency>

            <groupId>com.101tec</groupId>

            <artifactId>zkclient</artifactId>

            <version>0.10</version>

        </dependency>

(2)配置dubbo

    ## Dubbo 服务提供者配置

    spring.dubbo.application.name=provider

    spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

    spring.dubbo.protocol.name=dubbo

    spring.dubbo.protocol.port=20880

    spring.dubbo.scan=org.spring.springboot.dubbo

    ## Dubbo 服务消费者配置

    spring.dubbo.application.name=consumer

    spring.dubbo.registry.address=zookeeper://127.0.0.1:2181

    spring.dubbo.scan=org.spring.springboot.dubbo


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11941456.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存