直连提供者
通常我们称之为点对点链接
作为消费者 我们如果需要直连一个服务,可以在配置文件里面这样写
服务端暴露服务
<!-- 省略部分 -->
<!--服务发布的配置,需要暴露的服务接口-->
<!--interface 接口路径-->
<!--timeout 服务的超时时间-->
<!--retries 服务的重试次数-->
<!--loadbalance 服务的负载均衡策略 random 随机,roundrobin 轮询 leastactive 最少活跃调用数,响应的越快的越容易收到请求,相同的随机
consistenthash 一致性hash ,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 -->
<!--actives-->
<!--ref-->
<dubbo:service
interface="com.jenkin.common.module1api.OrderService"
retries="2"
cluster="failover"
loadbalance="leastactive"
ref="orderService">
<!--可以指定方法级别的配置-->
<dubbo:method name="getOrderFailOver" retries="2" />
<dubbo:method name="getOrder" actives="0" />
</dubbo:service>
<!-- 省略部分 -->
消费端:
<dubbo:reference id="xxxService" interface="com.jenkin.common.module1api.OrderService" url="dubbo://localhost:20880" />
这样连接就不会去使用注册中心,一版不会在生产环境这样使用
只订阅
在使用dubbo开发的过程中,如果我们本地的应用需要调用一些其他的稳定服务,比如邮件,短信服务,但是呢,我们又不想发现在还没开发好的服务注册上去,所以我们本地就可以只用,不注册
<dubbo:registry address="zookeeper://47.102.XXX.XXX:7000" register="false"/>
只注册
同理,有了上面的只订阅,那么肯定就会有只注册,为什么会有只注册,因为我们有时候如果有多个注册中心,但是呢有一个注册中心里面的服务我们是不需要的,不过别人又会从这个注册中心上面拉取我们的服务,所以这时候就需要只注册了
<dubbo:registry address="zookeeper://47.102.XXX.1:7000" />
<dubbo:registry address="zookeeper://47.102.XXX.2:7000" subscribe="false" />
比如上面,我们需要提供服务到47.102.XXX.2 上面去,但是呢我们不需要从47.102.XXX.2上面拉取服务
静态服务
静态服务可以看做是把服务的自动注册和发现功能给改成手动得了,不过服务还是会自动注册上来,只是注册上了之后不会启用处于一个被禁用的状态。
需要手动去启用
这个一般在写监控平台或者监控脚本的时候会去使用
多协议
dubbo可以使用多个不同的协议来暴露同一个服务,同样也可以为不同的服务配置不同的协议
不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议
<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="rmi" port="1099" />
<!-- 使用dubbo协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" protocol="dubbo" />
<!-- 使用rmi协议暴露服务 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" protocol="rmi" />
</beans>
需要与 http 客户端互操作
<?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:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="world" />
<dubbo:registry id="registry" address="10.20.141.150:9090" username="admin" password="hello1234" />
<!-- 多协议配置 -->
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:protocol name="hessian" port="8080" />
<!-- 使用多个协议暴露服务 -->
<dubbo:service id="helloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" protocol="dubbo,hessian" />
</beans>
多注册中心
同一个服务注册到不同的注册中心
例如 helloService 同时注册到了两个注册中心
<!-- 多注册中心配置 -->
<dubbo:registry id="hangzhouRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="qingdaoRegistry" address="10.20.141.151:9010" default="false" />
<!-- 向多个注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="hangzhouRegistry,qingdaoRegistry" />
不同服务不同注册中心
例如:官网示例,HelloService注册到chinaRegistry,DemoService注册到intlRegistry
<!-- 多注册中心配置 -->
<dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
<!-- 向中文站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService" registry="chinaRegistry" />
<!-- 向国际站注册中心注册 -->
<dubbo:service interface="com.alibaba.hello.api.DemoService" version="1.0.0" ref="demoService" registry="intlRegistry" />
分开引用不同注册中心的相同服务
比如:CRM 需同时调用中文站和国际站的 PC2 服务,PC2 在中文站和国际站均有部署,接口及版本号都一样,但连的数据库不一样。
<!-- 多注册中心配置 -->
<dubbo:registry id="chinaRegistry" address="10.20.141.150:9090" />
<dubbo:registry id="intlRegistry" address="10.20.154.177:9010" default="false" />
<!-- 引用中文站服务 -->
<dubbo:reference id="chinaHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="chinaRegistry" />
<!-- 引用国际站站服务 -->
<dubbo:reference id="intlHelloService" interface="com.alibaba.hello.api.HelloService" version="1.0.0" registry="intlRegistry" />
服务分组
当一个接口有多个实现类的时候,注册的时候就可以对每个接口的实现进行分组
例如:
服务提供端 的配置:
这里有一点需要注意,在使用了分组之后就不能再服务端指定方法级别的配置了,因为dubbo会根据方法名把method标签封装成为beanDefinition对象,如果重名,就会报错。
服务消费端的配置:
xml文件配置好之后在代码里面直接引用就好
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
- 在低压力时间段,先升级一半提供者为新版本
- 再将所有消费者升级为新版本
- 然后将剩下的一半提供者升级为新版本
服务端定义多个版本的服务
消费端定义需要使用的版本
使用模式和group的使用差不多
代码调用
异步调用
dubbo 的异步调用
Dubbo 的异步调用是非阻塞的 NIO 调用,一个线程可同时并发调用多个远程
服务,每个服务的调用都是非阻塞的,线程立即返回。就是对 java 中 Futrue
模式的扩展支持
- XML定义
<dubbo:method name="addOrderCost2Seconds" async="true" sent="true" return="true"/>
<dubbo:method name="getOrderCost2Seconds" async="true"/>
- 测试类
@Autowired
UserService userService;
/**
* 使用方式:
* 1、async 使用异步
* 2、sent 是否等待请求发送成功之后再返回,发送失败直接抛异常
* 3、return 是否关心返回值
* <dubbo:method name="addOrderCost2Seconds" async="true" sent="true" return="true"/>
* 使用异步调用科明显缩短接口的总耗费时长
* @return
* @throws ExecutionException
* @throws InterruptedException
*/
@GetMapping("/testAsyncCall")
public OrderDTO test() throws ExecutionException, InterruptedException {
userService.testAsyncCall();
return new OrderDTO();
}
上面测试对每个接口休眠了2秒,使用异步之后两个接口的总执行时间为2秒
事件通知
在调用之前、调用之后、出现异常时,
会触发 oninvoke、onreturn、onthrow 三个事件,
可以配置当事件发生时,通知哪个类的哪个方法
- 配置代码
<dubbo:method name="testEventNotice" oninvoke="eventService.oninvoke"
onreturn="eventService.onreturn"
onthrow="eventService.onthrow" />
- 测试用例
@Autowired
UserService userService;
/**
* 时间通知可以与异步结合使用
* 1、同步回调
* 仅仅使用回调
* 2、异步回调
* 加上aSync=‘true’
* 3、同步无回调
* 4、异步无回调
* 回调事件
* 使用方式
* <dubbo:method name="testEventNotice" oninvoke="eventService.oninvoke"
* onreturn="eventService.onreturn"
* onthrow="eventService.onthrow" />
* 1、onreturn
* 在方法返回的时候回调
* 2、oninvoke
* 在方法开始执行的是调用
* 3、onthrow
* 在方法出异常的时候调用
*
*
* @return
* @throws ExecutionException
* @throws InterruptedException
*/
@GetMapping("/testEventNotice")
public OrderDTO test() throws ExecutionException, InterruptedException {
userService.testEventNotice();
return new OrderDTO();
}
- 执行结果
转载:https://blog.csdn.net/youzi1394046585/article/details/105605500