AG-Merge: Spring Cloud — фреймворк для агрегации данных между сервисами
Решение проблемы
Решение проблемы с разделением сервисов Spring Cloud и разбивкой на страницы атрибутов объектов или атрибутов отдельных объектов. Поддержка автоматического внедрения и преобразования статических данных (данные словаря) и динамических первичных ключей. Статические данные, которые агрегируются, будут проходить через «одноуровневое кэширование» (guava).
Пример
Пример можно посмотреть в модуле 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 помечает объектные данные для агрегации)
Аннотация @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;
}
Пользовательский класс User с двумя свойствами, которые должны быть объединены: city и sex.
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;
}
...
}
Требуется, чтобы входные параметры были строкой, а возвращаемое значение — картой <String, String>. Возвращаемое значение состоит из ключа и значения свойств объекта.
@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;
}
}
@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--) {
...
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )