1. 程式人生 > >dubbo學習五--服務分組,多版本,引數驗證,結果快取

dubbo學習五--服務分組,多版本,引數驗證,結果快取

服務分組

當一個介面有多種實現時,可以用group區分

<dubbo:service group="feedback" interface="com.xxx.IndexService" />
<dubbo:service group="member" interface="com.xxx.IndexService" />
<dubbo:reference id="feedbackIndexService" group="feedback" interface="com.xxx.IndexService" />
<dubbo:reference id="memberIndexService" group="member" interface="com.xxx.IndexService" />
任意組:(2.2.0以上版本支援,總是隻調一個可用組的實現)
<dubbo:reference id="barService" interface="com.foo.BarService" group="*" />

多版本

當一個介面實現,出現不相容升級時,可以用版本事情過度,版本號不同的服務相互間不引用。

<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" />
不區分版本:(2.2.0以上版本支援)
<dubbo:reference id="barService" interface="com.foo.BarService" version="*" />

分組聚合

按組合並返回結果,比如選單服務,介面一樣,但有多種實現,用group區分,現在消費方需從每種group中呼叫一次返回結果,合併結果返回,這樣就可以實現聚合選單項。

配置如:(搜尋所有分組)

<dubbo:reference interface="com.xxx.MenuService" group="*" merger="true" />

或:(合併指定分組)

<dubbo:reference interface="com.xxx.MenuService" group="aaa,bbb" merger="true" />

或:(指定方法合併結果,其它未指定的方法,將只調用一個Group)

<dubbo:reference interface="com.xxx.MenuService" group="*">

    <dubbo:method name="getMenuItems" merger="true" />

</dubbo:service>

或:(某個方法不合並結果,其它都合併結果)

<dubbo:reference interface="com.xxx.MenuService" group="*" merger="true">

    <dubbo:method name="getMenuItems" merger="false" />

</dubbo:service>

或:(指定合併策略,預設根據返回值型別自動匹配,如果同一型別有兩個合併器時,需指定合併器的名稱)
參見:[合併結果擴充套件]

<dubbo:reference interface="com.xxx.MenuService" group="*">

    <dubbo:method name="getMenuItems" merger="mymerge" />

</dubbo:service>

或:(指定合併方法,將呼叫返回結果的指定方法進行合併,合併方法的引數型別必須是返回結果型別本身)

<dubbo:reference interface="com.xxx.MenuService" group="*">

    <dubbo:method name="getMenuItems" merger=".addAll" />

</dubbo:service>

引數驗證

引數驗證功能是基於JSR303實現的,使用者只需標識JSR303標準的驗證Annotation,並通過宣告filter來實現驗證。

import java.io.Serializable;

import java.util.Date;

import javax.validation.constraints.Future;

import javax.validation.constraints.Max;

import javax.validation.constraints.Min;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Past;

import javax.validation.constraints.Pattern;

import javax.validation.constraints.Size;

public class ValidationParameter implements Serializable {

    private static final long serialVersionUID = 7158911668568000392L;

    @NotNull // 不允許為空

    @Size(min = 1, max = 20) // 長度或大小範圍

    private String name;

    @NotNull(groups = ValidationService.Save.class) // 儲存時不允許為空,更新時允許為空 ,表示不更新該欄位

    @Pattern(regexp = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$")

    private String email;

    @Min(18) // 最小值

    @Max(100) // 最大值

    private int age;

    @Past // 必須為一個過去的時間

    private Date loginDate;

    @Future // 必須為一個未來的時間

    private Date expiryDate;

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getEmail() {

        return email;

    }

    public void setEmail(String email) {

        this.email = email;

    }

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public Date getLoginDate() {

        return loginDate;

    }

    public void setLoginDate(Date loginDate) {

        this.loginDate = loginDate;

    }

    public Date getExpiryDate() {

        return expiryDate;

    }

    public void setExpiryDate(Date expiryDate) {

        this.expiryDate = expiryDate;

    }

}

分組驗證示例:

public interface ValidationService { // 預設可按服務介面區分驗證場景,如:@NotNull(groups = ValidationService.class)

@interface Save{} // 與方法同名介面,首字母大寫,用於區分驗證場景,如:@NotNull(groups = ValidationService.Save.class),

可選

    void save(ValidationParameter parameter);

    void update(ValidationParameter parameter);

}

關聯驗證示例:

import javax.validation.GroupSequence;

public interface ValidationService {

    @GroupSequence(Update.class) // 同時驗證Update組規則

    @interface Save{}

    void save(ValidationParameter parameter);

    @interface Update{}

    void update(ValidationParameter parameter);

}

引數驗證示例:

import javax.validation.constraints.Min;

import javax.validation.constraints.NotNull;

public interface ValidationService {

    void save(@NotNull ValidationParameter parameter); // 驗證引數不為空

    void delete(@Min(1) int id); // 直接對基本型別引數驗證

}

在客戶端驗證引數:

<dubbo:reference id="validationService" interface="com.alibaba.dubbo.examples.validation.api.ValidationService"

validation="true" />

在伺服器端驗證引數:

<dubbo:service interface="com.alibaba.dubbo.examples.validation.api.ValidationService" ref="validationService"

validation="true" />

驗證異常資訊:

import javax.validation.ConstraintViolationException;

import javax.validation.ConstraintViolationException;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.examples.validation.api.ValidationParameter;

import com.alibaba.dubbo.examples.validation.api.ValidationService;

import com.alibaba.dubbo.rpc.RpcException;

public class ValidationConsumer {

    public static void main(String[] args) throws Exception {

        String config = ValidationConsumer.class.getPackage().getName().replace('.', '/') + "/validation-consumer.xml";

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(config);

        context.start();

        ValidationService validationService = (ValidationService)context.getBean("validationService");

        // Error

        try {

            parameter = new ValidationParameter();

            validationService.save(parameter);

            System.out.println("Validation ERROR");

        } catch (RpcException e) { // 丟擲的是RpcException

            ConstraintViolationException ve = (ConstraintViolationException) e.getCause();

// 裡面嵌了一個ConstraintViolationException

            Set<ConstraintViolation<?>> violations = ve.getConstraintViolations(); // 可以拿到一個驗證錯誤詳細資訊的集合

            System.out.println(violations);

        }

    }

}

需要加入依賴:

<dependency>

    <groupId>javax.validation</groupId>

    <artifactId>validation-api</artifactId>

    <version>1.0.0.GA</version>

</dependency>

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-validator</artifactId>

    <version>4.2.0.Final</version>

</dependency>

結果快取

dubbo提供宣告式快取,以減少使用者加快取的工作量。

最後歡迎大家訪問我的個人網站:1024s

相關推薦

dubbo學習--服務分組版本引數驗證結果快取

服務分組 當一個介面有多種實現時,可以用group區分 <dubbo:service group="feedback" interface="com.xxx.IndexService" /> <dubbo:service group="member"

Dubbo-5 服務分組版本

服務分組   當一個介面有多種實現時,可以用 group 區分。   服務端配置 <dubbo:service group="feedback" interface="com.xxx.IndexService" id="feedbackIndexService"

Spring-batch學習總結(2)—Job,Flow創建及應用線程並發決策器監聽器參數

class getname current ces 表達式 .get been ant string 一.Job的創建及其應用1.Job flow的介紹:(1)狀態機:例完成step1,是否繼續完成step2,step3,我們就需要通過Job flow來控制(2)進行演示:

安裝版本 cuda 版本之間切換

1. cuda 的下載與安裝方法選擇 到 CUDA Toolkit Download 下載所需版本,以 cuda_9.0.176_384.81_linux.run為例: 建議選擇使用 .run 檔案安裝,因為使用 .deb可能會將已經安裝的較新的顯示卡驅動替換。 2. c

Python3 Scrapy框架學習:使用crawl模板爬取豆瓣Top250並存入MySql、MongoDB

1.新建專案及使用crawl模板 2.頁面解析 rules = (Rule(LinkExtractor(allow=r'subject/\d+/',restrict_css = '.hd > a[class = ""]'), callback='parse_it

【Java】JDK9 內部探索——版本架構版本 jar 包及其他

JShell 因為已經有很多人在談論 Jigsaw,因此在第一部分我們先跳過不去講它。在這一部分我們將會照本宣科地拿 JShell 做些事情, 這是 Java 的一個全新的 REPL (說到它能做的事情,例如你在一個地方敲入了 Java 程式碼,有了它就可以馬上把程式碼

ajax實現文件上傳文件上傳追加參數

bytes meta -- ets throw eal proc cti esp 1.html部分實現代碼: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <

python:進程進程隊列進程管道,Manager,進程鎖,進程池

子進程 __name__ art get 調用 sta manage parent call #!usr/bin/env python# -*- coding:utf-8 -*-__author__ = "Samson"import multiprocessingimpor

潭州課堂25班:Ph201805201 第十一課 繼承繼承和魔術方法屬性和方法 (課堂筆記)

筆記 父類 當前 TE -s __del__ color true ont 繼承: class p : cls_name = ‘p‘ def __init__(self): print(‘正在實例化‘) def __del__(se

區塊鏈社交IM系統開發幣種錢包系統開發直播系統開發

溝通 及時通訊 同時 數字資產 三種 發展 信息 什麽 資產 區塊鏈社交IM系統開發是現在能夠應用於各個行業增加用戶粘度的一款系統app。開發區塊鏈社交IM系統不僅僅是用於用戶與用戶之間的社交溝通,這類型的app系統還可以做一個多幣種錢包系統來使用,還可以是一個直播系統。區

SpringBoot系統列 2 - 配置檔案環境配置(devqaonline) SpringBoot系統列 1 - HelloWorld!

 實現專案的多環境配置的方法有很多,比如通過在Pom.xml中配置profiles(最常見) 然後在Install專案打War包的時候,根據需求打不同環境的包,如圖: 這種配置多環境的方法在SSM框架中使用的最多,但在SpringBoot中使用最多的是在啟動SpringBoot專案的時候指定執

PHP獲取單選下拉列表選下拉列表單選框複選框內的值

PHP獲取單選下拉列表,多選下拉列表,單選框,複選框內的值,此例將當前頁作為提交資料的頁面。 <form action=" " method="post" accept-charset="utf-8"> <!--單選下拉 學歷--> <selec

單行居中顯示文字行居左顯示兩行超過用省略號結尾

轉——https://www.cnblogs.com/vanstrict/p/5923633.html   首先是單行居中,多行居左 居中需要用到 text-align:center,居左是預設值也就是text-align:left。如合讓兩者結合起來達到單行居中,多

虛擬記憶體與swap使用者與單使用者64位32位

一、虛擬記憶體和swap分割槽: 這兩個概念分別對應windows和linux: windows:虛擬記憶體 linux:swap 在windows中即使實體記憶體沒有用完也會去用到虛擬記憶體,而Linux不一樣 Linux只有在實體記憶體用完的時候才

38_javaWeb介面個排序欄位使用者隨機選一個

0.可排序欄位:id,age,income 1.查詢介面中,有一個orderBy引數 2.如果使用者選擇的age,那麼就把orderBy引數的值設定成age 3.java中,虛擬碼如下(因為第4步中,我們會用$符號取值,在這裡防止sql注入): if(or

在搭建Hadoop 分散式叢集的時候次格式化檔案系統啟動hdfs,yarn後jps 發現datanode為啟動

可以參考:https://www.cnblogs.com/dxwhut/p/5679501.html https://blog.csdn.net/baidu_15113429/article/details/53739734 https://www.cnblogs.com/lishpei/p

防止使用者連續擊鍵次呼叫ajax時即防抖的封裝

在文字框中常常有這樣的需求,鍵入值時,實時呼叫相應的介面,但是每次觸發keydown都觸發,會嚴重消耗網頁的效能 基於此,可以進行封裝,設定鍵入值得間隔在一秒之內只調用一次,程式碼如下 呼叫如下 $("input").on("keydown",debounce(fu

Leetcode 213. House Robber II -打家劫舍每家都有一定數量的錢家組成一個圓形首尾相鄰不能偷盜相鄰的兩家求可偷盜的最大金額

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are&

自定義TreeView列帶有標頭支援選繫結

<Window x:Class="TreeGrid.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsof

Android通訊模組(單執行緒執行緒通訊方式Handler 與UI Thread的互動Handler接合子執行緒的使用)

一丶概述 本週的學習計劃是Android通訊模組,內容:單執行緒,多執行緒通訊方式,Handler 與UI Thread的互動,Handler接合子執行緒的使用。 二丶效果演示(原始碼連結見文末) 三丶實現功能 1.演示使用Handler常見崩潰 2.handler更新