spring-cloud-invoker-parent
Spring-cloud-starter-invoker поддерживает сериализацию с использованием jdk и json и использует http для реализации функции удалённого вызова сервиса. Он основан на модуле spring cloud loadbalancer и получает IP-адрес сервиса из реестра. Также он поддерживает проекты без реестра.
Invoker похож на openfeign — инструмент для удалённого вызова. Многие разработчики сталкиваются с проблемами при использовании openfeign, когда прямой вызов контроллера приводит к некоторым преобразованиям и конфликтам с дизайном. Кроме того, такой подход неудобен в обслуживании. Invoker решает эти проблемы, позволяя напрямую вызывать сервис с помощью аннотации @RemoteClient без вмешательства в проект.
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;
Зависимость | Версия | Описание |
---|---|---|
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>
@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);
}
}
@Service
public class TestService implements TestServiceFacade {
public String test(){
return "ok";
}
}
Примечание: класс TestServiceFacade должен быть помечен аннотацией @RemoteClient, иначе это не сработает.
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();
}
@RestController
@RequestMapping("/test")
public class ChatController {
@Autowired
private TestServiceFacade testServiceFacade;
@RequestMapping("/test")
public String test(){
return testServiceFacade.test();
}
}
Игнорирование удалённой службы
@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 )