предисловие
Микросервисы — основная современная тенденция. Шлюзы API уступают только реестру (в предыдущей статье уже упоминался реестр). Шлюзы API могут уменьшить управление доменными именами, унифицированную аутентификацию служб, служебный журнал traceId и т. д. Большинство задач были предварительно распределены в группу, поэтому результаты были разделены.
текст
Текущие параметры исследования компонентов шлюза API следующие: экологическая популярность сообщества, простота использования, производительность маршрутизации и фильтрации, текущее состояние и характеристики обслуживания и т. д.
Введение компонента
- springcloudgateway, официальный API-шлюз Springcloud, основан на springboot2.0 и springcloud2.0 и интегрирован в компоненты springcloud;
- Zuul, шлюз API, созданный netflex, springcloud интегрирует zuul1.x, а 1.x больше не поддерживает обновления, а springcloud больше не интегрирует zuul2.
Использование компонентов
1. springcloudgateway
pom引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
yml配置路由转发
spring:
application:
name: gateway-demo
cloud:
gateway:
routes:
- id: path_route
uri: lb://demo(业务路径)
order: 0
predicates:
- Path=/exercise/**
filters:
- StripPrefix=1
- TokenCheck
配置局部过滤器
public class TokenCheckGatewayFilterFactory extends AbstractGatewayFilterFactory<TokenCheckGatewayFilterFactory.Config> {
public TokenCheckGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
System.out.println("Welcome to AuthFilter.");
String token = exchange.getRequest().getHeaders().getFirst("token");
if (Config.authToken.equals(token)) {
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
};
}
static class Config {
static String authToken = "12345";
}
}
2. zuul
pom引用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
配置路由转发
zuul:
routes:
api-a:
path: /gate/**
serviceId: service-demo1
#具体注册到注册中心的服务如service2
service2:
path: /service2/**
serviceId: service2
配置全局过滤器(zuul只有全局过滤器)
@Component
public class PreFilter extends ZuulFilter {
Logger logger = LoggerFactory.getLogger(PreFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
HttpServletResponse response = requestContext.getResponse();
String requestURI = request.getRequestURI();
logger.info("[ValidateConfigurerAdapter.preHandle] request handle uri is {}", requestURI);
response.setCharacterEncoding("utf-8");
String token = request.getHeader("token");
if (!StringUtils.isEmpty(token) && token.equals("123456")) {
return null;
}
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
return null;
}
}
использовать контраст
измерение | springcloudgateway | zuul |
---|---|---|
Экология сообщества | высокая популярность сообщества | Низкая популярность в сообществе и много китайских документов |
Простота использования | Интеграция облачных компонентов Spring, основанная на springboot 2.0, необходимо обновить проект до springboot2.X | Компонент Spring Cloud netflix интегрирует версию zuul1.x, версия 1.x основана на блокировке ввода-вывода, версия 2.X — это netty, асинхронный неблокирующий ввод-вывод, поддерживает длительное соединение, но Springcloud пока не интегрирован. Версия zuul 1.x основана на springboot1.x. |
представление | nacos+весенний облачный шлюз+сервис; персональный локальный стресс-тест; параллелизм 100: 3 мс; параллелизм 500: 3 мс; параллелизм 5000: 320 мс. Информация, связанная с данной: В случае с низким уровнем параллелизма они одинаковы, а для Springcloudgateway с высоким уровнем параллелизма в 1,6 раза больше, чем для zuul1.x. | эврика+зуул+сервис. Персональный локальный стресс-тест: 100 параллельных операций: 3 мс, 500 параллельных операций: 5 мс, 5000 параллельных операций: 267 мс |
состояние обслуживания | Компонент springcloud, постоянно обновляемый, версия начинается с 2.0.0 | Компонент springcloud поддерживает только 1.X, а ядро zuul продолжает поддерживать 2.1.4 до сих пор. |
Ключевые особенности, особенности | Фильтры включают в себя глобальный фильтр и фильтр шлюза, которые делятся на глобальные и локальные на основе сетевой переадресации. | Фильтры — это только глобальные фильтры; синхронная блокировка пересылки на основе сервлета. |
разное
В настоящее время в основном используются функции раздачи маршрутизации и аутентификации, большой разницы между zuul и springcloudgateway в раздаче маршрутизации нет. При использовании проверки подлинности с фильтром zuul в настоящее время может использовать только глобальные фильтры, в то время как springcloudgateway может выбирать как глобальные фильтры, так и локально указанные фильтры маршрутов.
zuul1.X использует переадресацию сервлетов, не поддерживает длинные соединения и не может пересылать веб-сокеты;
Springcloudgateway основан на неблокирующем вводе-выводе netty и поддерживает длинные соединения.
резюме
По сравнению с zuul1.X, springcloudgateway лидирует по ключевым функциям, состоянию обслуживания, производительности и т. д. В настоящее время существует только проблема обновления совместимости проекта springboot2.0.Если вы можете напрямую обновиться до springboot2.0 или в настоящее время используйте springboot2.0, рекомендуется использовать springcloudgateway.