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

OSCHINA-MIRROR/chejiangyi-free-bsf-all

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 14 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 10:17 704b62b

apiRegistry Api注册中心

Простой api-реестр, имитирующий реализацию Eureka. Совместим с устаревшим Feign. Поддерживает переключение при отказе, балансировку нагрузки, регистрацию в центре и вызовы RPC. Код в целом прост и легко настраивается.

Технические характеристики

  • Поддержка соединений пула, созданных через HttpUrlConnection и HttpClient, а также их расширения.
  • Поддержка режима циклического перебора для балансировки нагрузки и его расширения.
  • Потребительская сторона обнаруживает отказы, временно переключается на доступные сервисы и возвращается к исходному вызову после восстановления сервиса.
  • Поддерживаются Redis/Nacos в качестве реестра и их расширения, а также архитектура без реестра.
  • Протоколы Protobuf обеспечивают значительное повышение производительности RPC.

Документы по дизайну и предыстории

Самостоятельно разработанная высокопроизводительная практика распределённого сервисного центра

Схема архитектуры

Схема архитектуры

Жизненный цикл RPC-потребителя

Схема жизненного цикла

Зависимости

Добавьте модуль bsf в зависимости проекта.

<dependency>
    <artifactId>free-bsf-api</artifactId>
    <groupId>com.free.bsf</groupId>
    <version>2.2-SNAPSHOT</version>
</dependency>
<dependency>
    <artifactId>free-bsf-core</artifactId>
    <groupId>com.free.bsf</groupId>
    <version>2.2-SNAPSHOT</version>
</dependency>
<dependency>
    <artifactId>free-bsf-apiregistry</artifactId>
    <groupId>com.free.bsf</groupId>
    <version>2.2-SNAPSHOT</version>
</dependency>

Введение

Конфигурация bsf

spring.application.name=free-demo-provider
# Включение одним ключом, по умолчанию false, вступает в силу после перезапуска
bsf.apiRegistry.enabled=false

# Включить поддержку перехвата вызовов Rpc с аннотациями ApiClient/FeignClient, вступает в силу после перезапуска
bsf.apiRegistry.apiClientAspect.enabled=false

# Уведомления об ошибках вызовов rpc, таких как отправка сообщений в Feishu или DingTalk
bsf.apiRegistry.warn.enabled=false

# Поддержка принудительного определения маршрутов для сервисов rpc, обратите внимание, что после настройки соответствующая информация о узлах регистрации в сервисах будет недействительной и больше не будет использоваться, appName — это имя сервиса
bsf.apiRegistry.{appName}.hosts=

# Реализация клиента rpc, поддерживает HttpUrlConnectionRpcClient и HttpClientRpcClient
bsf.apiRegistry.rpcClient.type=HttpUrlConnectionRpcClient

# Клиент rpc сканирует пакеты с аннотациями @ApiClient/@FeignClient, разделяя несколько [вызовы rpc обязательны] через запятую
bsf.apiRegistry.rpcClient.basePackages=

# Переименовать beanName в тип полного пути, решить проблему конфликта имён при внедрении bean
bsf.apiRegistry.rpcClient.typeBeanName.enabled=true

# Количество повторных попыток при ошибке вызова rpc
bsf.apiRegistry.rcpClient.failRetryTimes=3

# Интервал времени ожидания при восстановлении после отказа rpc-вызова
bsf.apiRegistry.rcpClient.failRetryTimeSpan=30000

# Запустить ли пул соединений для httpUrlConnection rpcClient
bsf.apiRegistry.rpcClient.httpUrlConnection.poolEnabled=true

# Время ожидания чтения для httpUrlConnection rpcClient
bsf.apiRegistry.rpcClient.httpUrlConnection.readTimeOut=60000

# Тайм-аут соединения для httpUrlConnection rpcClient
bsf.apiRegistry.rpcClient.httpUrlConnection.connectTimeOut=3000

# Тип реализации реестра, в настоящее время поддерживается RedisRegistry и NacosRegistry
bsf.apiRegistry.registry.type=RedisRegistry

# Регистрировать ли текущий сервис в реестре
bsf.apiRegistry.registry.clientRegistered=true

# Алгоритм балансировщика нагрузки, в настоящее время поддерживает только RoundRobinLoadBalance
bsf.apiRegistry.loadBalance.type=RoundRobinLoadBalance

# Кодировка, поддержка json и protobuf
bsf.apiRegistry.code.type=json

# Модуль здоровья реестра, поддерживает просмотр состояния здоровья и отключение сервисов
bsf.apiRegistry.health.enabled=true

############ Другие конфигурации ############
# Можно исключить IP-адреса других сегментов сети при регистрации сервисов, используется для отладки при наличии нескольких сетевых карт, обратитесь к информации о конфигурации в bsf-core
bsf.util.ip.exclude.regex=
bsf.util.ip.include.regex=

################# Конфигурация реестра Redis #################
# Реализован реестр redis, формат адреса redis: 127.0.0.1:6379
bsf.apiRegistry.registry.redis.host=

# Реализованный реестр redis, время обновления пульса экземпляра
bsf.apiRegistry.registry.redis.heartBeatTime=3000

# Срок действия экземпляра в реестре redis
bsf.apiRegistry.registry.redis.expireTime=5

################# Конфигурация реестра Nacos #################
# Обновление времени пульса сервера в списке служб реестра nacos
bsf.apiRegistry.registry.nacos.serverListCache.heartBeatTime=10000

Подробное описание конфигурации реестра Nacos

Поддержка протокола protobuf

# Серверный вывод protobuf (поддержка анализа протокола в заголовке HTTP Content-Type:application/x-protobuf)
bsf.web.serialize.protostuff.enabled=false

# Протокольный кодировщик клиента rpc, после включения заголовок запроса rpc будет содержать Content-Type: application/x-protobuf
bsf.apiRegistry.code.type=protostuff

Пример использования (совместимый с FeignClient)

// Совместимость с @FeignClient
@ApiClient(name = "lmc-test-provider",path = "/")
public interface  CustomerProvider {
    /* Определение протокола интерфейса */
    // Поддержка GetMapping, PostMapping
    @PostMapping("/test")
    // Поддержка @RequestParam, @RequestBody
    ApiResponseEntity<String>  test(@RequestParam("str") String str);
}
@Autowired(required = false)
CustomerProvider customerProvider;
public void test(){
    customerProvider.test("测试");
}

@ApiIgnore игнорирует метод

// Совместимость с @FeginClient
@ApiClient(name = "lmc-test-provider",path = "/")
public interface  CustomerProvider {
    /* Использование реализации интерфейса по умолчанию */
    @ApiIgnore
    default ApiResponseEntity<String>  skipMethod() {
        val result = HttpClientUtils.Default().get("http://www.baidu.com/");
        return ApiResponseEntity.success(result);
    }
} **CoreRequestInterceptor запросный перехватчик (аналогично feign запросный перехватчик)**

public class ApiRegistryRequestInterceptor implements CoreRequestInterceptor { @Override public void append(RequestInfo request) { val header = newHeader(); if(header!=null){ for(val kv:header.entrySet()){ request.getHeader().put(kv.getKey(),kv.getValue()); } } } }


**Разработчик обращается к списку регистрационного центра:**

```bsf.apiRegistry.health.enabled=true```

Доступ к актуальному списку сервисов можно получить следующими способами:
1. Любой сервис (потребитель/производитель) обращается по адресу: ```http://localhost:{本地端口}/bsf/apiRegistry/```.
2. Подобно eureka, создаётся пустой сервис в качестве сервера eureka.
3. Прямой доступ к redis или другому регистрационному центру.

### Другие сценарии
Совместимое использование встроенного балансировщика нагрузки k8s в качестве шлюза и пересылки (без регистрационного центра).

Поддержка rpc для нескольких сервисов с принудительным определением маршрута. Обратите внимание, что после настройки соответствующая информация о узлах регистрационного центра сервиса будет недействительной и больше не будет использоваться.

bsf.apiRegistry.{appName}.hosts=

Тип реализации регистрационного центра, использование пустого регистрационного центра для реализации.

bsf.apiRegistry.registry.type=NoneRegistry


Локальная отладка, регистрация на удаленной отладке:

bsf.util.ip.include.regex={本地ip} bsf.apiRegistry.registry.clientRegistered=true


Локальная отладка, удаленная отладка конкретного сервиса, без регистрации собственного сервиса:

#Поддержка rpc для множества сервисов с принудительным определением маршрутов. Обратите внимание, что после конфигурации соответствующая информация об узлах регистрационного центра сервисов станет недействительной и не будет использоваться в дальнейшем. bsf.apiRegistry.{appName}.hosts={远程iphost,如http://aaa/bbb/или127.0.0.1:8080} bsf.apiRegistry.registry.clientRegistered=false


Бесшовное перемещение регистрационного центра eureka (одновременное использование eureka и apiRegistry):

Можно реализовать одновременный вызов eureka и rpc, вернуть результат вызова eureka и сравнить с результатом rpc (если они не совпадают, будет выдано предупреждение), чтобы реализовать стабильное бесшовное перемещение.

Поддерживает внутренние тестовые проверки вызовов eureka и rpc, используется только временно.

bsf.apiRegistry.test.enabled=false

Пропустить часть методов rpc. Поддерживает префиксные и постфиксные *нечёткие совпадения, поддерживает разделение нескольких методов через запятую, по умолчанию пусто.

bsf.apiRegistry.test.skipMethods=


### FeignClient совместимость
Переход от spring cloud eureka к apiRegistry совместимому feignClient. Частичная запись изменений кода:
* @SpringBootApplication(exclude = {FeignAutoConfiguration.class}) — исключить автоматическую конфигурацию feign spring cloud.
* Включить аннотацию EnableFeignClients в классе запуска — исключить аннотации запуска feignClient (включая некоторые автоматические конфигурации и сканирование компонентов).

### Дальнейшее расширение
1. Поддержка других реализаций регистрационных центров.

by 车江毅

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/chejiangyi-free-bsf-all.git
git@api.gitlife.ru:oschina-mirror/chejiangyi-free-bsf-all.git
oschina-mirror
chejiangyi-free-bsf-all
chejiangyi-free-bsf-all
3.4-SNAPSHOT