Простой api-реестр, имитирующий реализацию Eureka. Совместим с устаревшим Feign. Поддерживает переключение при отказе, балансировку нагрузки, регистрацию в центре и вызовы 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 в качестве шлюза и пересылки (без регистрационного центра).
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):
bsf.apiRegistry.test.enabled=false
bsf.apiRegistry.test.skipMethods=
### FeignClient совместимость
Переход от spring cloud eureka к apiRegistry совместимому feignClient. Частичная запись изменений кода:
* @SpringBootApplication(exclude = {FeignAutoConfiguration.class}) — исключить автоматическую конфигурацию feign spring cloud.
* Включить аннотацию EnableFeignClients в классе запуска — исключить аннотации запуска feignClient (включая некоторые автоматические конфигурации и сканирование компонентов).
### Дальнейшее расширение
1. Поддержка других реализаций регистрационных центров.
by 车江毅
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )