diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index c8aeb3a..4140568 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -15,10 +15,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build with Maven - run: mvn -B package --file pom.xml + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Build with Maven + run: mvn -B package --file pom.xml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..5d9db3a --- /dev/null +++ b/.travis.yml @@ -0,0 +1,31 @@ +language: java + +jdk: + - openjdk8 + +cache: + directories: + - '$HOME/.m2/repository' + +before_install: + +script: + - mvn cobertura:cobertura + +after_success: + - bash <(curl -s https://codecov.io/bash) + - cd ./target + - git init + - git config user.name "Starrier" + - git config user.email "starrier@starrier.com" + - git add . + - git commit -m "travis-ci" + - git push --force --quiet "https://${GITHUB_TOKEN}@${GH_REF}" master:master + +branches: + only: + - master + +env: + global: + - GH_REF=https://github.com/Starrier/imperator-gateway.git \ No newline at end of file diff --git a/README.md b/README.md index 942df0c..762ee34 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,34 @@ +# Imperator Gateway + +![LICENSE](https://img.shields.io/github/license/Starrier/imperator-gateway) [![Build Status](https://www.travis-ci.org/Starrier/imperator-gateway.svg?branch=master)](https://www.travis-ci.org/Starrier/imperator-gateway) +[![Maintainability](https://api.codeclimate.com/v1/badges/70c48a9d62bb0a126934/maintainability)](https://codeclimate.com/github/Starrier/imperator-gateway/maintainability) + +> [Docker Image Link](https://hub.docker.com/repository/docker/starrier/gateway-dev) + +## 功能 +> Features + +### 1. 全局性流控 -全局性流控 +### 2. 负载均衡 -负载均衡 +### 3. 动态路由 -动态路由 +### 4. 访问控制 -访问控制 +### 5. 权限校验 -权限校验 +### 6. 限流熔断 -限流熔断 +### 7. 埋点监控 -埋点监控 +### 8. 日志收集统计 -日志收集统计 +### 9. A|B测试 -A|B测试 +### 10. 安全 -安全 +### 11. 黑白名单控制 -黑白名单控制 +风控接口,只有不在黑名单中的 ip 地址才可以访问。 diff --git a/pom.xml b/pom.xml index c5549cc..2bd993f 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,39 @@ + src/main/java + + org.jacoco + jacoco-maven-plugin + 0.8.6 + + + + prepare-agent + + + + report + test + + report + + + + + + org.codehaus.mojo + cobertura-maven-plugin + 2.7 + + + html + xml + + + + org.apache.maven.plugins maven-surefire-plugin @@ -97,6 +129,7 @@ package build + diff --git a/src/main/java/org/starrier/imperator/controller/RouteController.java b/src/main/java/org/starrier/imperator/controller/RouteController.java index 7e8d9bc..356e505 100644 --- a/src/main/java/org/starrier/imperator/controller/RouteController.java +++ b/src/main/java/org/starrier/imperator/controller/RouteController.java @@ -16,7 +16,7 @@ import org.springframework.web.util.UriComponentsBuilder; import org.starrier.imperator.model.GatewayPredicateDefinition; import org.starrier.imperator.model.GatewayRouteDefinition; -import org.starrier.imperator.route.DynamicRouteServiceImpl; +import org.starrier.imperator.route.RouteRepresentApplication; import java.net.URI; import java.util.List; @@ -30,9 +30,9 @@ @RequestMapping("/api/v1/router") public class RouteController { - private final DynamicRouteServiceImpl dynamicRouteService; + private final RouteRepresentApplication dynamicRouteService; - public RouteController(DynamicRouteServiceImpl dynamicRouteService) { + public RouteController(RouteRepresentApplication dynamicRouteService) { this.dynamicRouteService = dynamicRouteService; } diff --git a/src/main/java/org/starrier/imperator/repository/UnifiedRouteRepositoryImpl.java b/src/main/java/org/starrier/imperator/repository/UnifiedRouteRepositoryImpl.java index 8aec8d3..1584936 100644 --- a/src/main/java/org/starrier/imperator/repository/UnifiedRouteRepositoryImpl.java +++ b/src/main/java/org/starrier/imperator/repository/UnifiedRouteRepositoryImpl.java @@ -15,7 +15,6 @@ * @author Starrier * @date 2019/4/14 */ - public class UnifiedRouteRepositoryImpl implements RouteDefinitionRepository { private final Map routes = synchronizedMap(Maps.newLinkedHashMap()); diff --git a/src/main/java/org/starrier/imperator/route/RouteApplicationService.java b/src/main/java/org/starrier/imperator/route/RouteApplicationService.java new file mode 100644 index 0000000..68085c5 --- /dev/null +++ b/src/main/java/org/starrier/imperator/route/RouteApplicationService.java @@ -0,0 +1,20 @@ +package org.starrier.imperator.route; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Service; + +/** + * @author starrier + * @date 2021/1/7 + */ +@Service +public class RouteApplicationService implements ApplicationEventPublisherAware { + + private ApplicationEventPublisher publisher; + + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + publisher =applicationEventPublisher; + } +} diff --git a/src/main/java/org/starrier/imperator/route/DynamicRouteServiceImpl.java b/src/main/java/org/starrier/imperator/route/RouteRepresentApplication.java similarity index 50% rename from src/main/java/org/starrier/imperator/route/DynamicRouteServiceImpl.java rename to src/main/java/org/starrier/imperator/route/RouteRepresentApplication.java index c09548f..fa07446 100644 --- a/src/main/java/org/starrier/imperator/route/DynamicRouteServiceImpl.java +++ b/src/main/java/org/starrier/imperator/route/RouteRepresentApplication.java @@ -1,82 +1,38 @@ package org.starrier.imperator.route; - -import com.alibaba.fastjson.JSON; import lombok.SneakyThrows; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; -import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionWriter; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.stereotype.Service; -import org.springframework.web.util.UriComponentsBuilder; -import org.starrier.imperator.model.GatewayPredicateDefinition; -import org.starrier.imperator.model.GatewayRouteDefinition; import reactor.core.publisher.Mono; -import java.net.URI; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - /** * @author Starrier * @date 2019/4/14 */ @Service -public class DynamicRouteServiceImpl implements ApplicationEventPublisherAware { +public class RouteRepresentApplication implements ApplicationEventPublisherAware { + + private final Logger LOGGER = LoggerFactory.getLogger(RouteRepresentApplication.class); private final RouteDefinitionWriter routeDefinitionWriter; private ApplicationEventPublisher publisher; @Autowired - public DynamicRouteServiceImpl(RouteDefinitionWriter routeDefinitionWriter) { + public RouteRepresentApplication(RouteDefinitionWriter routeDefinitionWriter) { this.routeDefinitionWriter = routeDefinitionWriter; } - /** - * spring: - * cloud: - * gateway: - * routes: #当访问http://localhost:8080/baidu,直接转发到https://www.baidu.com/ - * - id: baidu_route - * uri: http://baidu.com:80/ - * predicates: - * - Path=/baidu - * - * @param args - */ - - public static void main(String[] args) { - GatewayRouteDefinition definition = new GatewayRouteDefinition(); - GatewayPredicateDefinition predicate = new GatewayPredicateDefinition(); - Map predicateParams = new HashMap<>(8); - definition.setId("jd_route"); - predicate.setName("Path"); - predicateParams.put("pattern", "/jd"); - predicate.setArgs(predicateParams); - definition.setPredicates(Arrays.asList(predicate)); - String uri = "http://www.jd.com"; - //URI uri = UriComponentsBuilder.fromHttpUrl("http://www.baidu.com").build().toUri(); - definition.setUri(uri); - System.out.println("definition:" + JSON.toJSONString(definition)); - - - RouteDefinition definition1 = new RouteDefinition(); - PredicateDefinition predicate1 = new PredicateDefinition(); - Map predicateParams1 = new HashMap<>(8); - definition1.setId("baidu_route"); - predicate1.setName("Path"); - predicateParams1.put("pattern", "/baidu"); - predicate1.setArgs(predicateParams1); - definition1.setPredicates(Arrays.asList(predicate1)); - URI uri1 = UriComponentsBuilder.fromHttpUrl("http://www.baidu.com").build().toUri(); - definition1.setUri(uri1); - System.out.println("definition1:" + JSON.toJSONString(definition1)); - + @Override + public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + this.publisher = applicationEventPublisher; } /** @@ -101,6 +57,7 @@ public String update(RouteDefinition definition) { try { this.routeDefinitionWriter.delete(Mono.just(definition.getId())); } catch (Exception e) { + LOGGER.error("update fail,not find route routeId: [{}]", e.toString(), e); return "update fail,not find route routeId: " + definition.getId(); } try { @@ -108,10 +65,9 @@ public String update(RouteDefinition definition) { this.publisher.publishEvent(new RefreshRoutesEvent(this)); return "success"; } catch (Exception e) { + LOGGER.error("update route fail:[{}]", e.toString(), e); return "update route fail"; } - - } /** @@ -126,10 +82,4 @@ public String delete(String id) { return "delete success"; } - @Override - public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { - this.publisher = applicationEventPublisher; - } - - } diff --git a/src/main/resources/bootstrap.yml b/src/main/resources/bootstrap.yml index da1c631..e69de29 100644 --- a/src/main/resources/bootstrap.yml +++ b/src/main/resources/bootstrap.yml @@ -1,2 +0,0 @@ -server: - port: 9911 \ No newline at end of file diff --git a/src/test/java/org/starrier/imperator/route/RouteRepresentApplicationTest.java b/src/test/java/org/starrier/imperator/route/RouteRepresentApplicationTest.java new file mode 100644 index 0000000..113afd8 --- /dev/null +++ b/src/test/java/org/starrier/imperator/route/RouteRepresentApplicationTest.java @@ -0,0 +1,70 @@ +package org.starrier.imperator.route; + +import com.alibaba.fastjson.JSON; +import org.junit.Test; +import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; +import org.springframework.cloud.gateway.route.RouteDefinition; +import org.springframework.web.util.UriComponentsBuilder; +import org.starrier.imperator.model.GatewayPredicateDefinition; +import org.starrier.imperator.model.GatewayRouteDefinition; + +import java.net.URI; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * @author starrier + * @date 2021/1/7 + */ +public class RouteRepresentApplicationTest { + + @Test + public void testAdd() { + } + + @Test + public void testUpdate() { + } + + /** + * spring: + * cloud: + * gateway: + * routes: #当访问http://localhost:8080/baidu,直接转发到https://www.baidu.com/ + * - id: baidu_route + * uri: http://baidu.com:80/ + * predicates: + * - Path=/baidu + */ + @Test + public void testDelete() { + GatewayRouteDefinition definition = new GatewayRouteDefinition(); + GatewayPredicateDefinition predicate = new GatewayPredicateDefinition(); + Map predicateParams = new HashMap<>(8); + definition.setId("jd_route"); + predicate.setName("Path"); + predicateParams.put("pattern", "/jd"); + predicate.setArgs(predicateParams); + definition.setPredicates(Arrays.asList(predicate)); + String uri = "http://www.jd.com"; + //URI uri = UriComponentsBuilder.fromHttpUrl("http://www.baidu.com").build().toUri(); + definition.setUri(uri); + System.out.println("definition:" + JSON.toJSONString(definition)); + + + RouteDefinition definition1 = new RouteDefinition(); + PredicateDefinition predicate1 = new PredicateDefinition(); + Map predicateParams1 = new HashMap<>(8); + definition1.setId("baidu_route"); + predicate1.setName("Path"); + predicateParams1.put("pattern", "/baidu"); + predicate1.setArgs(predicateParams1); + definition1.setPredicates(Arrays.asList(predicate1)); + URI uri1 = UriComponentsBuilder.fromHttpUrl("http://www.baidu.com").build().toUri(); + definition1.setUri(uri1); + System.out.println("definition1:" + JSON.toJSONString(definition1)); + } + + +} \ No newline at end of file