1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/geek_qi-Cloud-Merge

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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;
    }

    ...
}
  • Источник данных для агрегации (пример через FeignClient, также может быть локальным spring bean объектом)

Требуется, чтобы входные параметры были строкой, а возвращаемое значение — картой <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;
    }
}
  • Бизнес-класс для агрегированных объектов (способ агрегации использует 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--) {

...

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/geek_qi-Cloud-Merge.git
git@api.gitlife.ru:oschina-mirror/geek_qi-Cloud-Merge.git
oschina-mirror
geek_qi-Cloud-Merge
geek_qi-Cloud-Merge
master