dubbo学习日志(二)治理功能

看资料 dubbo有很多治理功能,这里只列举一些 我认为可能会的比较多的


1:多注册中心的情况

比如有两个服务,分别使用了两个不同的注册中心:很简单,先把这两个注册中心定义出来

打个比方

<dubbo:registry id="ARegistry" address="zookeeper://10.0.0.1:2181" />
<dubbo:registry id="intlRegistry" address="zookeeper://10.0.0.2:2181" />

然后在内容提供者注册服务的时候加上registry 属性并赋值。

比如

<dubbo:service interface="com.service.Chinese" ref="PersonInGuangXi" registry="ARegistry "/>

当然如果不添加的的话将执行那个默认的注册中心

默认服务中心定义:<dubbo:registry id="ARegistry" address="zookeeper://10.0.0.1:2181"  default="true"/>


2:多版本、服务分组:

当一个服务有多个实现,即一个service有多个实现类,那么我们在调用这个service的时候,怎么知道是用哪个实现呢?这时,对于dubbo来说仅仅是添加一个属性就可以解决了。

在创建内容的时候配置文件添加version属性。版本号自己设置。先举个例子:

服务端定义了一个接口:

public interface Chinese {
    String getNativeLanguage();
}

中国人,中国人又分很多省、自治区、直辖市,各个地方都有其方言,现在有个广西人,实现了Chinese这个类

在provider项目中添加以下实现

public class PersonInGuangXi implements Chinese {
    public String getNativeLanguage() {
        return "桂柳话";
    }
}

广西人说桂柳话。当然,也有讲白话等,这举个例子,勿喷!

河南人也实现了Chinese接口,说的是河南话。

public class PersonInHeNan implements Chinese {
    public String getNativeLanguage() {
        return "河南话";
    }
}

好了,现在消费者端调用这个Chinese类的getNativeLanguage时到底是该返回河南话、还是桂柳话呢?

所以我们需要在内容提供者端添加分组、或者版本,然后在消费者端指定哪个分组或者哪个版本就知道是该用哪个实现了。

比如:

提供者分了两组

<dubbo:service interface="com.service.Chinese" ref="PersonInGuangXi" group="GuangXi"/>
<dubbo:service interface="com.service.Chinese" ref="PersonInHeNan" group="HeNan"/>

消费者  指定广西人

<dubbo:reference interface="com.service.Chinese" id="Chinese" group="GuangXi"/>

此时执行main方法得到的值就是 桂柳话

 当然也可以用版本的方式

提供者提供了两个版本

<dubbo:service interface="com.service.Chinese" ref="PersonInGuangXi" version:"1.0.0"/>

<dubbo:service interface="com.service.Chinese" ref="PersonInHeNan" version:"1.0.1"/>

消费者调用的时候指定某一个版本

<dubbo:reference interface="com.service.Chinese" id="Chinese" version:"1.0.1"/>

使用了1.0.1那个版本,执行的时候则返回  河南话。

感觉蛮简单的!


3:分组聚合

当想把两个类的实现的执行 结果都想要的时候怎么办捏?

很简单,分组聚合帮我们实现了这个功能,当然,这个方法的返回值必须是一个集合类型,要不然他怎么给你返回一个聚合的结果,比方返回值是String 那两个方法都有返回一个String 那他到底要哪一个呢?所以很明显,首先返回值有一定要求。

举个栗子:

依然是Chinese接口,中国地大物博,而中国有句古话:“民以食为天” 每个地方对吃那是相当讲究的。每个地方都有当地的特产食品。在Chinese接口添加

List<String>getSpecialFood(); 获取当地特产食品

下面广西人说:我们有螺蛳粉、我们有油茶。河南人说:我们有饸烙面,我们有麻花儿。。。

所以广西人实现的getSpecialFood()如下

public List<String>getSpecialFood() {
    List<String> food=new ArrayList<String>();
    food.add("螺蛳粉");
    food.add("油茶");
    return food;
}

河南人实现的方法如下

public List<String> getSpecialFood() {
    List<String>food=new ArrayList<String>();
    food.add("饸烙面");
    food.add("麻花");
    return food;
}

他们属于两个分组,上文中我们说到(分别为:GuangXi、HeNan)

消费者在调用这个服务的时候,他只想知道中国有什么特产,我不管你是广西的特产还是河南的特产

那么他在配置的时候就应该使用分组聚合

<dubbo:reference interface="com.service.Chinese" id="Chinese" group="*" merger="true"/>

4:并发控制

当我们有特产提供了,消费者都找我们来要特产,但是同时来的人也不能太多啊,来的太多了特产一下子拿不出来那么多,造成供不应求,所以我们控制消费者并发数量:

在消费者节点上添加属性 actives 然后赋值,如上述

<dubbo:reference interface="com.service.Chinese" id="Chinese" group="*" actives="10" merger="true"/>

表示并发数限制为10个之内。


当然生产者也要有并发量控制,生产的螺蛳粉、饸烙面也都是受各种机器、人工、原料的限制,计算机里就CPU、内存、带宽之类的 ,都是不能一次性无限制的供应,并发量太高,服务器宕机了就比较尴尬了。

所以在服务端也可以控制并发

即在service节点添加executes属性然后赋值即可。如

<dubbo:service interface="com.service.Chinese" ref="PersonInGuangXi" executes="10" version:"1.0.0"/>

这样的话整个类并发量都不能超过10个

当然也可以只限制 生产特产的方法并发,说桂柳话就随便多少人同时说吧,大不了噪音大一点

于是,在service节点中添加一个子节点,方法节点,并限制并发量

<dubbo:service interface="com.service.Chinese" ref="PersonInGuangXi" executes="10" version:"1.0.0">

<dubbo:method name="getSpecialFood" executes="10"/>

</dubbo:service>

5:连接控制

限制服务器端接受的连接不能超过 10 个

 <dubbo:provider protocol="dubbo" accepts="10" />

限制客户端服务使用连接不能超过 10 个
<dubbo:reference interface="XXXX" connections="10" />

比方我邀请几个朋友来我家喝油茶,家里比较小,碗也不是很多,我们一次就只能邀请10个人最多了

后面有再补充吧

猜你喜欢

转载自blog.csdn.net/dwj1250254648/article/details/81746361