中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud跨服務數據聚合框架的示例分析

發布時間:2021-08-25 10:59:14 來源:億速云 閱讀:112 作者:小新 欄目:編程語言

這篇文章主要介紹了Spring Cloud跨服務數據聚合框架的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

AG-Merge

Spring Cloud 跨服務數據聚合框架

解決問題

解決Spring Cloud服務拆分后分頁數據的屬性或單個對象的屬性拆分之痛, 支持對靜態數據屬性(數據字典)、動態主鍵數據進行自動注入和轉化, 其中聚合的靜態數據會進行 一級混存 (guava).

舉個栗子:

兩個服務,A服務的某張表用到了B服務的某張表的值,我們在對A服務那張表查詢的時候,把B服務某張表的值聚合在A服務的那次查詢過程中

示例

具體示例代碼可以看 ace-merge-demo 模塊

|------- ace-eureka 注冊中心
|------- ace-data-merge-demo 查詢數據,此處聚合示例
|------- ace-data-provider 數據提供者

Maven添加依賴

<dependency>
  <groupId>com.github.wxiaoqi</groupId>
  <artifactId>ace-merge-core</artifactId>
  <version>2.0-SNAPSHOT</version>
</dependency>

推薦倉庫配置

<repositories>
    <repository>
      <id>oss</id>
      <name>oss</name>
      <url>https://oss.sonatype.org/content/groups/public</url>
    </repository>
  </repositories>

啟動類加注解

@EnableAceMerge

application.yml配置

# 跨服務數據合并
merge:
 enabled: true
 guavaCacheNumMaxSize: 1000
 guavaCacheRefreshWriteTime: 10 # min
 guavaCacheRefreshThreadPoolSize: 10
 aop: # 啟動注解的方式,自動聚合
  enabled: true

代碼示例( @MergeField 標志對象的數據需要聚合)

@Retention(RetentionPolicy.RUNTIME)
@Target(value={ElementType.METHOD,ElementType.TYPE,ElementType.FIELD})
public @interface MergeField {
  /**
   * 查詢值
   * @return
   */
  String key() default "";

  /**
   * 目標類
   * @return
   */
  Class<? extends Object> feign() default Object.class;

  /**
   * 調用方法
   * @return
   */
  String method() default "";

  /**
   * 是否以屬性值合并作為查詢值
   * @return
   */
  boolean isValueNeedMerge() default false;
}

聚合對象

public class User {
  private String name;
  // 需要聚合的屬性
  @MergeField(key="test", feign = IService2.class,method = "writeLog")
  private String sex;
  // 需要聚合的屬性
  @MergeField(feign = IService2.class,method = "getCitys",isValueNeedMerge = true)
  private String city;

  public User(String name, String sex, String city) {
    this.name = name;
    this.sex = sex;
    this.city = city;
  }

  public String getCity() {
    return city;
  }

  public void setCity(String city) {
    this.city = city;
  }

  public User(String name) {
    this.name = name;
  }

  public User(String name, String sex) {
    this.name = name;
    this.sex = sex;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }
}

聚合數據來源方法(示例為通過FeignClient,也可以是本地的spring bean對象)

特別要求:入參必須為一個String,返回值必須為Map<String,String>. 其中返回值的構成,就是聚合對象屬性的key和對應的value.

@FeignClient("test")
public interface IService2 {
  @RequestMapping("car/do")
  public Map<String, String> writeLog(String test);

  @RequestMapping("car/city")
  public Map<String, String> getCitys(String ids);
}

對應的遠程服務接口

/**
 * @author ace
 * @create 2017/11/20.
 */
@RestController
@RequestMapping("car")
public class Service2Rest {
  private Logger logger = LoggerFactory.getLogger(Service2Rest.class);

  @RequestMapping("do")
  public Map<String,String> writeLog(String test){
    logger.info("service 2 is writing log!");
    Map<String,String> map = new HashMap<String, String>();
    map.put("man","男");
    map.put("woman","女");
    return map;
  }

  @RequestMapping("city")
  public Map<String,String> getCity(String ids){
    logger.info("service 2 is writing log!"+ids);
    Map<String,String> map = new HashMap<String, String>();
    map.put("1","廣州");
    map.put("2","武漢");
    return map;
  }
}

聚合對象的Biz類(下面的方式是采用aop掃描注解的方式)

@Service
@Slf4j
public class UserBiz {
  @Autowired
  private MergeCore mergeCore;
  /**
   *   aop注解的聚合方式
   *   其中聚合的方法返回值必須為list,
   *   如果為復雜對象,則需要自定義自己的聚合解析器(實現接口IMergeResultParser)
   */
  @MergeResult(resultParser = TestMergeResultParser.class)
  public List<User> getAopUser() {
    ArrayList<User> users = new ArrayList<User>();
    for (int i = 1000; i > 0; i--) {
      users.add(new User("zhangsan" + i, "man", "1"));
      users.add(new User("lisi" + i, "woman", "2"));
      users.add(new User("wangwu" + i, "unkonwn", "2"));
    }
    return users;
  }

  /**
   * 手動聚合方式
   * @return
   */
  public List<User> getUser(){
    ArrayList<User> users = new ArrayList<User>();
    for (int i = 1000; i > 0; i--) {
      users.add(new User("zhangsan" + i, "man", "1"));
      users.add(new User("lisi" + i, "woman", "2"));
      users.add(new User("wangwu" + i, "unkonwn", "2"));
    }
    try {
      // list 聚合
      mergeCore.mergeResult(User.class,users);
      // 單個對象聚合
//      mergeCore.mergeOne(User.class,users.get(0));
    } catch (Exception e) {
      log.error("數據聚合失敗",e);
    }finally {
      return users;
    }
  }
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Spring Cloud跨服務數據聚合框架的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

哈密市| 伊川县| 晋宁县| 新野县| 沁源县| 秦皇岛市| 突泉县| 多伦县| 任丘市| 永济市| 太湖县| 博客| 云阳县| 临澧县| 嵊州市| 马鞍山市| 鹿泉市| 灵武市| 公安县| 天气| 武城县| 景泰县| 栖霞市| 和静县| 固安县| 汪清县| 房产| 石河子市| 博湖县| 龙州县| 清丰县| 泰和县| 海城市| 关岭| 丹江口市| 建瓯市| 望都县| 内黄县| 黄大仙区| 祁阳县| 金平|