¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.terra.gateway.config; |
| | | |
| | | import com.alibaba.nacos.client.naming.event.InstancesChangeEvent; |
| | | import com.alibaba.nacos.common.notify.Event; |
| | | import com.alibaba.nacos.common.notify.NotifyCenter; |
| | | import com.alibaba.nacos.common.notify.listener.Subscriber; |
| | | import com.terra.gateway.utils.StringUtils; |
| | | import org.springdoc.core.AbstractSwaggerUiConfigProperties; |
| | | import org.springdoc.core.SwaggerUiConfigProperties; |
| | | import org.springframework.beans.factory.InitializingBean; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
| | | import org.springframework.cloud.client.discovery.DiscoveryClient; |
| | | import org.springframework.context.annotation.Configuration; |
| | | |
| | | import java.util.Set; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * SpringDocé
置类 |
| | | * |
| | | * @author admin |
| | | */ |
| | | @Configuration(proxyBeanMethods = false) |
| | | @ConditionalOnProperty(value = "springdoc.api-docs.enabled", matchIfMissing = true) |
| | | public class SpringDocConfig implements InitializingBean |
| | | { |
| | | @Autowired |
| | | private SwaggerUiConfigProperties swaggerUiConfigProperties; |
| | | |
| | | @Autowired |
| | | private DiscoveryClient discoveryClient; |
| | | |
| | | /** |
| | | * å¨åå§ååè°ç¨çæ¹æ³ |
| | | */ |
| | | @Override |
| | | public void afterPropertiesSet() |
| | | { |
| | | NotifyCenter.registerSubscriber(new SwaggerDocRegister(swaggerUiConfigProperties, discoveryClient)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Swaggerææ¡£æ³¨åå¨ |
| | | */ |
| | | class SwaggerDocRegister extends Subscriber<InstancesChangeEvent> { |
| | | @Autowired |
| | | private SwaggerUiConfigProperties swaggerUiConfigProperties; |
| | | |
| | | @Autowired |
| | | private DiscoveryClient discoveryClient; |
| | | |
| | | private final static String[] EXCLUDE_ROUTES = new String[]{"se-gateway"}; |
| | | |
| | | public SwaggerDocRegister(SwaggerUiConfigProperties swaggerUiConfigProperties, DiscoveryClient discoveryClient) { |
| | | this.swaggerUiConfigProperties = swaggerUiConfigProperties; |
| | | this.discoveryClient = discoveryClient; |
| | | } |
| | | |
| | | /** |
| | | * äºä»¶åè°æ¹æ³ï¼å¤çInstancesChangeEventäºä»¶ |
| | | * |
| | | * @param event äºä»¶å¯¹è±¡ |
| | | */ |
| | | @Override |
| | | public void onEvent(InstancesChangeEvent event) { |
| | | Set<AbstractSwaggerUiConfigProperties.SwaggerUrl> swaggerUrlSet = discoveryClient.getServices() |
| | | .stream() |
| | | .flatMap(serviceId -> discoveryClient.getInstances(serviceId).stream()) |
| | | .filter(instance -> !StringUtils.equalsAnyIgnoreCase(instance.getServiceId(), EXCLUDE_ROUTES)) |
| | | .map(instance -> { |
| | | AbstractSwaggerUiConfigProperties.SwaggerUrl swaggerUrl = new AbstractSwaggerUiConfigProperties.SwaggerUrl(); |
| | | swaggerUrl.setName(instance.getServiceId()); |
| | | swaggerUrl.setUrl(String.format("/%s/v3/api-docs", instance.getServiceId())); |
| | | return swaggerUrl; |
| | | }) |
| | | .collect(Collectors.toSet()); |
| | | |
| | | swaggerUiConfigProperties.setUrls(swaggerUrlSet); |
| | | } |
| | | |
| | | /** |
| | | * 订é
ç±»åæ¹æ³ï¼è¿å订é
çäºä»¶ç±»å |
| | | * |
| | | * @return 订é
çäºä»¶ç±»å |
| | | */ |
| | | @Override |
| | | public Class<? extends Event> subscribeType() { |
| | | return InstancesChangeEvent.class; |
| | | } |
| | | } |