spring boot使用double

 

1、正常使用

        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
/**
 * Created on 2019/4/14.
 * 需要暴露的公共接口
 * @author Grak
 * @since 1.0
 */
public interface UserService {

    List<UserAddress> getUserAddress(long playerId);
}

这个配置provider和consumer是一样的

dubbo.application.name=server-provider    服务器名称
dubbo.registry.protocol=zookeeper   
dubbo.registry.address=192.168.33.80:2181   
# dubbo.registry.address=zookeeper://192.168.204.81:2181?backup=192.168.204.82:2181,192.168.204.83:2181
dubbo.scan.base-package=com.stude.dubbo    暴露的接口
dubbo.protocol.name=dubbo

#超时时间
dubbo.consumer.timeout=3000
#重试次数
dubbo.consumer.retries=3

provider(@Service 加上double这个注解,接口自动注册到zookeeper)

@Service //这个不是spring的而是double的
@Component  //这个是为了扫描
public class UserServiceImpl implements UserService {

    @Override
    public List<UserAddress> getUserAddress(long playerId) {
        List<UserAddress> userAddresses = new ArrayList<>();
        for(int i = 0;i< 5;i++){
            UserAddress address = new UserAddress();
            address.setId(i + 1);
            address.setUserAddress("秋名山" + (i + 3) * 7 +"号公路");
            address.setUserId("1111" + i);
            address.setConsignee("幻三");
            address.setPhoneNum((1111 * i) +"");
            address.setIsDefault("有多少事!!");
            userAddresses.add(address);
        }
        return userAddresses;
    }
}

consumer(@Reference 有它就可以直接通过rpc连接获取数据,自动订阅接口实现

@Service //这个是spring的注解
public class OrderServiceImpl {

    @Reference
    UserService userService;

    public List<UserAddress> initOrder(long userId) {
        return userService.getUserAddress(userId);
    }
}

 启动类,指定扫描路径和配置路径

@Configuration
@EnableDubbo(scanBasePackages = "org.apache.dubbo.samples.simple.annotation.impl")
@PropertySource("classpath:/spring/dubbo-provider.properties")
static public class ProviderConfiguration {
       
}

 

 

官方API   http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

2、注意:

  • 分包:建议将服务接口,服务模型,服务异常等均放在 API 包中。分包原则:重用发布等价原则(REP),共同重用原则(CRP),最好在放置一份spring 的引用配置。
  • 粒度:服务接口尽可能大粒度,每个服务方法应代表一个功能。(不是某功能的一个步骤,Dubbo 暂未提供分布式事务支持
  •  

3、常用配置:(注解版本,其他去API官网看)

dubbo推荐在Provider上尽量多配置Consumer端属性(公共属性)

<dubbo:service interface="com.alibaba.hello.api.HelloService" version="1.0.0" ref="helloService"
    timeout="300" retry="2" loadbalance="random" actives="0" />
 
<dubbo:service interface="com.alibaba.hello.api.WorldService" version="1.0.0" ref="helloService"
    timeout="300" retry="2" loadbalance="random" actives="0" >
    <dubbo:method name="findAllPerson" timeout="10000" retries="9" loadbalance="leastactive" actives="5" />
<dubbo:service/>

 

配置启用优先级:方法级配置>接口级别 , Consumer>Provider配置>全局配置

 

 重试次数

//发布者
<dubbo:service retries="2" />
//订阅者
<dubbo:reference retries="2" />
<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

超时时间

消费端 
全局超时配置
<dubbo:consumer timeout="5000" />

指定接口以及特定方法超时配置
<dubbo:reference interface="com.foo.BarService" timeout="2000">
    <dubbo:method name="sayHello" timeout="3000" />
</dubbo:reference>


服务端
全局超时配置
<dubbo:provider timeout="5000" />

指定接口以及特定方法超时配置
<dubbo:provider interface="com.foo.BarService" timeout="2000">
    <dubbo:method name="sayHello" timeout="3000" />
</dubbo:provider>

版本号:(提供者可以同时提供多个版本的接口,消费者根据版本号获取)

老版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="1.0.0" />

新版本服务提供者配置:
<dubbo:service interface="com.foo.BarService" version="2.0.0" />

老版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="1.0.0" />

新版本服务消费者配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="2.0.0" />

如果不需要区分版本,可以按照以下的方式配置:
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

配置可以使用三种模式:

1、xml

2、application 配置文件

 共享配置:当前服务器名字,注册中心端口和ip,当前服务器调用端口,共享超时时间

dubbo.application.name=annotation-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.consumer.timeout=3000

xml转换application配置文件

<dubbo:reference interface="com.foo.BarService" timeout="2000">
    <dubbo:method name="sayHello" timeout="3000" />
</dubbo:reference>

dubbo:
  reference:
    interface : com.foo.BarService
    timeout : 2000
    

负载均衡配置

Random LoadBalance
随机,按权重设置随机概率。
在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
RoundRobin LoadBalance
轮循,按公约后的权重设置轮循比率。
存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。
当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

集群容错

 

Failover Cluster
失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。

重试次数配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>

Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

集群模式配置
按照以下示例在服务提供方和消费方配置集群模式
<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />

启动检测

<dubbo:reference interface="com.foo.BarService" check="false" />
//关闭某个服务的启动时这个接口检查
dubbo.reference.com.foo.BarService.check=false
//关闭某个服务的启动时检查
dubbo.reference.check=false
//关闭所有服务的启动时检查
dubbo.consumer.check=false
//关闭注册中心启动时检查
dubbo.registry.check=false

线程模型

<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

Dispatcher

all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
direct 所有消息都不派发到线程池,全部在 IO 线程上直接执行。
message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在 IO 线程上执行。
connection 在 IO 线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
ThreadPool

fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
cached 缓存线程池,空闲一分钟自动删除,需要时重建。
limited 可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。
eager 优先创建Worker线程池。在任务数量大于corePoolSize但是小于maximumPoolSize时,优先创建Worker来处理任务。当任务数量大于maximumPoolSize时,将任务放入阻塞队列中。阻塞队列充满时抛出RejectedExecutionException。(相比于cached:cached在任务数量超过maximumPoolSize时直接抛出异常而不是将任务放入阻塞队列)

宕机处理

现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务。

  1. 监控中心宕掉不影响使用,只是丢失部分采样数据
  2. 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  3. 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  4. 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  5. 服务提供者无状态,任意一台宕掉后,不影响使用
  6. 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值