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

OSCHINA-MIRROR/liju023-spring-cloud-invoker-parent

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

spring-cloud-invoker-parent

Введение

spring boot обязательно 3.0.0 + версия, jdk 17 +

Это простой и лёгкий RPC-фреймворк, который можно использовать без какого-либо реестра или с одним из следующих реестров: * eureka; * nacos; * consul; * прямое IP-соединение; * прямое соединение через redis; * прямое соединение через rabbitmq; * прямое соединение через webSocket.

Spring-cloud-starter-invoker поддерживает сериализацию с использованием jdk и json и использует http для реализации функции удалённого вызова сервиса. Он основан на модуле spring cloud loadbalancer и получает IP-адрес сервиса из реестра. Также он поддерживает проекты без реестра.

Invoker похож на openfeign — инструмент для удалённого вызова. Многие разработчики сталкиваются с проблемами при использовании openfeign, когда прямой вызов контроллера приводит к некоторым преобразованиям и конфликтам с дизайном. Кроме того, такой подход неудобен в обслуживании. Invoker решает эти проблемы, позволяя напрямую вызывать сервис с помощью аннотации @RemoteClient без вмешательства в проект.

Обновление

  1. Поддержка spring boot 3.0+ и jdk 17.

application.yml конфигурация

spring:
  invoker:
    connectionRequestTimeout: 15000 # время ожидания запроса
    connectTimeout: 20000   # время ожидания соединения
    readTimeout: 15000  # время чтения
    serializable: json,jdk # по умолчанию используется json для сериализации
    request:
      client: httpClient || okHttp
      # максимальное количество соединений
      maxConnections: 100 
      # максимальный срок жизни соединения, в миллисекундах
      timeToLive: 1000 * 30
    server:
      # глобальный адрес сервера
      address: 127.0.0.1:9092
    webSocket: 
      # в режиме webSocket, адрес рукопожатия
      endpoint: httpInvoker
    hystrix:
      enabled: true # включить обработку отказов и понижения нагрузки, по умолчанию true
      command:
        # конфигурация hystrix
      thread: 
        coreSize = 10;
        maximumSize = 10;
        keepAliveTimeMinutes = 1;
        maxQueueSize = -1;
        queueSizeRejectionThreshold = 5;
        allowMaximumSizeToDivergeFromCoreSize = false;
        rollingStatisticalWindowInMilliseconds = 10000;
        rollingStatisticalWindowBuckets = 10;

Maven

Зависимость Версия Описание
spring-boot-invoker-core 3.0.0 ядро invoker
spring-boot-invoker-hystrix 3.0.0 обработка отказов
spring-boot-invoker-security 3.0.0 безопасность invoker
spring-boot-starter-invoker 3.0.0 spring boot
spring-boot-starter-redis-invoker 3.0.0 spring redis
spring-boot-starter-amqp-invoker 3.0.0 spring rabbitmq
spring-boot-starter-websocket-invoker 3.0.0 spring websocket
spring-cloud-starter-invoker 3.0.0 spring микросервисы
spring-invoker-dependencies 3.0.0 зависимости

Добавьте следующий код в pom.xml:

<!-- https://mvnrepository.com/artifact/com.i360day/spring-cloud-starter-invoker -->
<dependency>
    <groupId>com.i360day</groupId>
    <artifactId>spring-boot-starter-invoker</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.i360day</groupId>
    <artifactId>spring-boot-starter-redis-invoker</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.i360day</groupId>
    <artifactId>spring-boot-starter-amqp-invoker</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.i360day</groupId>
    <artifactId>spring-boot-starter-websocket-invoker</artifactId>
    <version>${project.version}</version>
</dependency>

<dependency>
    <groupId>com.i360day</groupId>
    <artifactId>spring-cloud-starter-invoker</artifactId>
    <version>${project.version}</version>
</dependency>

Использование

  1. Добавьте аннотацию invoker в класс запуска:
@EnableRemoteDiscoveryClient//spring boot режим автоматического обнаружения @RemoteCLient
@EnableAmqpDiscoveryClient//rabbitmq режим автоматического обнаружения @RemoteCLient
@EnableRedisDiscoveryClient//redis режим автоматического обнаружения @RemoteCLient
@EnableWebSocketeDiscoveryClient//webSocket режим автоматического обнаружения @RemoteCLient
public class TestBootstrap {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(TestBootstrap.class);
    }
}
  1. Выставьте сервис:
@Service
public class TestService implements TestServiceFacade {
   public String test(){
    return "ok";
   }
}
Примечание: класс TestServiceFacade должен быть помечен аннотацией @RemoteClient, иначе это не сработает.
  1. Добавление интерфейса и разрыва, а также указание на адрес регистрационного центра для удалённого доступа

3.1) При использовании регистрационного центра, если нет имени проекта (contextPath), оно должно быть пустым или не заполняться:

Способ 1:
@RemoteClient(name = "cx-test", fallback = TestServiceFacadeHystrix.class, contextPath = "/projectName")
public interface TestServiceFacade {
   public String test();
}

public class TestServiceFacadeHystrix implements TestServiceFacade{
   public String test(){
    return "ok";
   }
}
Способ 2:
# Вызов со стороны клиента
@RemoteClient(fallback = TestServiceFacadeHystrix.class, contextPath = "/projectName")
public interface TestServiceFacade extends TestServiceModule {
   public String test();
}
# Обратный вызов при ухудшении качества обслуживания
public class TestServiceFacadeHystrix реализует TestServiceFacade{
   public String test(){
    return "ok";
   }
}
# Модуль независим, доступен для наследования подклассами
@RemoteModule(name = "cx-test", address = "127.0.0.1:9092")
public interface TestServiceModule {
}

Способ 3: @RemoteClient(name = "cx-test", FallbackFactory = TestServiceFacadeHystrix.class, contextPath = "/projectName") public interface TestServiceFacade { public String test(); }

@Component public class SpringInvokerSampleServiceHystrix реализует FallbackFactory { @Override public Object create(Throwable var1) { return new SpringInvokerSampleServiceFacade() { @Override public String test() { return null; } }; } }

Способ 4: @RemoteClient(FallbackFactory = TestServiceFacadeHystrix.class, contextPath = "/projectName") public interface TestServiceFacade расширяет TestServiceModule{ public String test(); }

@Component public class SpringInvokerSampleServiceHystrix реализует FallbackFactory { @Override public Object create(Throwable var1) { return new SpringInvokerSampleServiceFacade() { @Override public String test() { return null; } }; } } #Модуль независим, доступен для наследования подклассами @RemoteModule(name = "cx-test", address = "127.0.0.1:9092") public interface TestServiceModule { }

3.2) При отсутствии регистрационного центра, если нет имени проекта (contextPath), оно должно быть пустым или не заполняться:

@RemoteModule(name = "cx-test", contextPath = "/projectName")
public interface TestModuleFacade {
   public String test();
}

@RemoteClient(fallback = TestServiceFacadeHystrix.class)
public interface TestServiceFacade расширяет TestModuleFacade{
   public String test();
}
  1. Использование интерфейса на стороне клиента:
@RestController
@RequestMapping("/test")
public class ChatController {

    @Autowired
    private TestServiceFacade testServiceFacade;


    @RequestMapping("/test")
    public String test(){
        return testServiceFacade.test();
    }
}
  1. Проверка подлинности службы безопасности OAuth2:
Игнорирование удалённой службы
@IgnoreRemoteService
public class TestService{
    ...
}
Добавление заголовка запроса
@Component
public class RequestInterceptor реализует HttpInvokerRequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if ((authentication instanceof AbstractAuthenticationToken)) {
            AbstractAuthenticationToken aat = (AbstractAuthenticationToken)authentication;
            if ((aat.getDetails() instanceof OAuth2AuthenticationDetails)) {
                OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails)aat.getDetails();
                requestTemplate.addHeaders("Authorization", new String(String.format("%s %s", new Object[] { details.getTokenType(), details.getTokenValue() })));
            }
        }
    }
}

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

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

1
https://api.gitlife.ru/oschina-mirror/liju023-spring-cloud-invoker-parent.git
git@api.gitlife.ru:oschina-mirror/liju023-spring-cloud-invoker-parent.git
oschina-mirror
liju023-spring-cloud-invoker-parent
liju023-spring-cloud-invoker-parent
v3.0.0