spring cloud alibaba 学习(三十一)spring cloud gateway InMemoryRouteDefinitionRepository


前言

通过接口注册的路由信息保存在 InMemoryRouteDefinitionRepository 中。


一、引入依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

添加配置:

management.endpoints.web.exposure.include=*

二、ControllerEndpointHandlerMapping

ControllerEndpointHandlerMapping 用于解析 @RestControllerEndpoint类的方法。
类似于 springmvc 中 RequestMappingInfoHandlerMapping 解析 @Controller 的方法

1、ControllerEndpointHandlerMapping 的创建

在WebFluxEndpointManagementContextConfiguration配置类中,定义了 bean ControllerEndpointHandlerMapping

	@Bean
	@ConditionalOnMissingBean
	public ControllerEndpointHandlerMapping controllerEndpointHandlerMapping(
			ControllerEndpointsSupplier controllerEndpointsSupplier, CorsEndpointProperties corsProperties,
			WebEndpointProperties webEndpointProperties) {
		EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
		return new ControllerEndpointHandlerMapping(endpointMapping, controllerEndpointsSupplier.getEndpoints(),
				corsProperties.toCorsConfiguration());
	}
	public ControllerEndpointHandlerMapping(EndpointMapping endpointMapping,
			Collection<ExposableControllerEndpoint> endpoints, CorsConfiguration corsConfiguration) {
		Assert.notNull(endpointMapping, "EndpointMapping must not be null");
		Assert.notNull(endpoints, "Endpoints must not be null");
		this.endpointMapping = endpointMapping;
		this.handlers = getHandlers(endpoints);
		this.corsConfiguration = corsConfiguration;
		setOrder(-100);
	}

2、在父类AbstractHandlerMethodMapping 的 afterPropertiesSet( ) 方法中,会调用 initHandlerMethods( )

	public void afterPropertiesSet() {
		initHandlerMethods();

		// Total includes detected mappings + explicit registrations via registerMapping
		int total = getHandlerMethods().size();
		if ((logger.isTraceEnabled() && total == 0) || (logger.isDebugEnabled() && total > 0) ) {
			logger.debug(total + " mappings in " + formatMappingName());
		}
	}

(3)initHandlerMethods( )

获取到 @RestControllerEndpoint 标识的类的方法,注册到 ControllerEndpointHandlerMapping 中

三、GatewayControllerEndpoint

类上加了注解 @RestControllerEndpoint(id = “gateway”) , 会被上面的 ControllerEndpointHandlerMapping 类解析。

类中主要的一些方法如下:

1、获取所有路由

访问路径: /actuator/gateway/routes

	@GetMapping("/routes")
	public Flux<Map<String, Object>> routes() {
		return this.routeLocator.getRoutes().map(this::serialize);
	}

2、获取单个路由

访问路径: /actuator/gateway/routes/{id}

	@GetMapping("/routes/{id}")
	public Mono<ResponseEntity<Map<String, Object>>> route(@PathVariable String id) {
		// @formatter:off
		return this.routeLocator.getRoutes()
				.filter(route -> route.getId().equals(id))
				.singleOrEmpty()
				.map(this::serialize)
				.map(ResponseEntity::ok)
				.switchIfEmpty(Mono.just(ResponseEntity.notFound().build()));
		// @formatter:on
	}

3、刷新路由

访问路径: /actuator/gateway/refresh

发布RefreshRoutesEvent事件,会出重新从nacos等地方获取路由

	@PostMapping("/refresh")
	public Mono<Void> refresh() {
		this.publisher.publishEvent(new RefreshRoutesEvent(this));
		return Mono.empty();
	}

4、获取 globalfilters、routefilters、routepredicates

	@GetMapping("/globalfilters")
	public Mono<HashMap<String, Object>> globalfilters() {
		return getNamesToOrders(this.globalFilters);
	}

	@GetMapping("/routefilters")
	public Mono<HashMap<String, Object>> routefilers() {
		return getNamesToOrders(this.GatewayFilters);
	}

	@GetMapping("/routepredicates")
	public Mono<HashMap<String, Object>> routepredicates() {
		return getNamesToOrders(this.routePredicates);
	}

5、新增路由

访问路径: /actuator/gateway/routes/{id}

请求方式是 @PostMapping

会调用 InMemoryRouteDefinitionRepository 的 save( ) 保存路由信息

	@PostMapping("/routes/{id}")
	@SuppressWarnings("unchecked")
	public Mono<ResponseEntity<Object>> save(@PathVariable String id, @RequestBody RouteDefinition route) {

		return Mono.just(route).filter(this::validateRouteDefinition)
				.flatMap(routeDefinition -> this.routeDefinitionWriter.save(Mono.just(routeDefinition).map(r -> {
					r.setId(id);
					log.debug("Saving route: " + route);
					return r;
				})).then(Mono.defer(() -> Mono.just(ResponseEntity.created(URI.create("/routes/" + id)).build()))))
				.switchIfEmpty(Mono.defer(() -> Mono.just(ResponseEntity.badRequest().build())));
	}

6、删除路由

访问路径: /actuator/gateway/routes/{id}

请求方式是 @DeleteMapping

会调用 InMemoryRouteDefinitionRepository 的 delete( ) 删除路由信息

	@DeleteMapping("/routes/{id}")
	public Mono<ResponseEntity<Object>> delete(@PathVariable String id) {
		return this.routeDefinitionWriter.delete(Mono.just(id))
				.then(Mono.defer(() -> Mono.just(ResponseEntity.ok().build())))
				.onErrorResume(t -> t instanceof NotFoundException, t -> Mono.just(ResponseEntity.notFound().build()));
	}

四、InMemoryRouteDefinitionRepository

public class InMemoryRouteDefinitionRepository implements RouteDefinitionRepository {

	//路由信息保存在map中
	private final Map<String, RouteDefinition> routes = synchronizedMap(new LinkedHashMap<String, RouteDefinition>());
	//保存路由
	@Override
	public Mono<Void> save(Mono<RouteDefinition> route) {
		return route.flatMap(r -> {
			if (ObjectUtils.isEmpty(r.getId())) {
				return Mono.error(new IllegalArgumentException("id may not be empty"));
			}
			routes.put(r.getId(), r);
			return Mono.empty();
		});
	}
	//删除路由
	@Override
	public Mono<Void> delete(Mono<String> routeId) {
		return routeId.flatMap(id -> {
			if (routes.containsKey(id)) {
				routes.remove(id);
				return Mono.empty();
			}
			return Mono.defer(() -> Mono.error(new NotFoundException("RouteDefinition not found: " + routeId)));
		});
	}
	//获取路由
	@Override
	public Flux<RouteDefinition> getRouteDefinitions() {
		return Flux.fromIterable(routes.values());
	}

}

总结

1、ControllerEndpointHandlerMapping 解析 @ControllerEndpoint 和 @RestControllerEndpoint,构建路径访问信息;

2、GatewayControllerEndpoint 和 父类 AbstractGatewayControllerEndpoint 提供了对路由的http请求接口;

3、InMemoryRouteDefinitionRepository 用于保存http方式新增的路由。

这种方式新增的路由保存在内存中,在系统重启后就丢失了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Cloud Alibaba Gateway是一个基于Spring Cloud Gateway的网关,它提供了一些额外的功能,例如动态路由、限流、熔断、安全控制等。它可以帮助开发人员快速构建微服务架构中的网关,提高系统的可靠性和可扩展性。同时,它还提供了一些与阿里云相关的功能,例如阿里云API网关的集成。 ### 回答2: Spring Cloud Alibaba Gateway是一款能够帮助开发者快速构建微服务网关的工具,它基于Spring Cloud Gateway开发,同时结合了Alibaba的Nacos、Sentinel等组件,可以为用户提供高可用、高性能的网关服务。 Spring Cloud Alibaba Gateway主要功能包括请求转发、路由控制、安全认证、限流、熔断等。而其中最重要的功能就是路由控制,开发者可以通过配置路由表,将请求转发到不同的服务节点,支持灰度发布、蓝绿发布等策略,同时也可以动态修改路由表,保证服务节点的动态变化。 此外,Spring Cloud Alibaba Gateway还支持全局限流、API限流、参数限流等多种限流方式,能够保证服务的稳定性和安全性。而在熔断方面,Spring Cloud Alibaba Gateway也提供了多种熔断策略,支持自定义熔断逻辑等功能,可以有效避免服务节点因故障而导致的级联故障。 总体来说,Spring Cloud Alibaba Gateway让微服务架构变得更加简单,同时提高了系统的可靠性、可扩展性和可维护性。如果你对微服务网关感兴趣,那么Spring Cloud Alibaba Gateway是一款值得尝试的工具。 ### 回答3: Spring Cloud Alibaba GatewaySpring Cloud Alibaba家族中的一员,它是一个基于Spring Cloud Gateway,并集成了阿里巴巴相关组件的API网关。Spring Cloud Alibaba Gateway作为微服务架构中的一个重要组件,可以帮助实现应用程序的路由和负载均衡。它为用户提供多种转发、路由、限流、熔断等策略,同时支持Web Sockets、MQTT等通信协议,可满足各种用户需求。Spring Cloud Alibaba Gateway优点如下: 1. 高可用性:Spring Cloud Alibaba Gateway通过实现多个节点组成的集群来保证其高可用性,当某个节点故障时,集群中的其他节点可以接管其工作,保证服务的持续性。 2. 路由代理:Spring Cloud Alibaba Gateway支持多种路由代理策略,支持通过URI、Header、Cookie、QueryParam等基于多种条件进行路由的功能。 3. 熔断降级:通过集成Sentinel,Spring Cloud Alibaba Gateway能够实现对服务的熔断降级,进而实现故障的快速恢复,保证服务的高可靠性。 4. 限流控制:Spring Cloud Alibaba Gateway可以对API进行限流控制,通过限制每秒钟的请求数量,防止请求过多导致系统崩溃。 5. 自定义插件:Spring Cloud Alibaba Gateway提供了多个可扩展插件,可以实现更好的自定义功能,如身份验证、请求转换、请求重定向等。 总之,Spring Cloud Alibaba Gateway是一个功能强大的API网关,它提供了丰富的路由、限流、熔断降级等策略,可以满足不同类型的业务需求。同时,通过架构高可用性,Spring Cloud Alibaba Gateway能够实现对服务的快速恢复,保证服务的稳定性和可靠性。显然,Spring Cloud Alibaba Gateway适合各种企业级应用,特别是基于云计算、微服务架构的企业。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_lrs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值