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 - 配置檔案,多環境配置(dev,qa,online) 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更新