From 6bf4233c2c2557f2cc546ca91e234b383be0e77a Mon Sep 17 00:00:00 2001 From: starrier Date: Sat, 2 Jan 2021 21:01:02 +0800 Subject: [PATCH 1/5] add codecov --- .travis.yml | 31 +++++++++++++++++++++++++++++++ pom.xml | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 .travis.yml 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/pom.xml b/pom.xml index fcdf498..490a1a4 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,7 +129,8 @@ package build - push + + From 00a8476589261eb2a3a36e96265d6c7f8ee05eca Mon Sep 17 00:00:00 2001 From: starrier Date: Thu, 7 Jan 2021 10:19:21 +0800 Subject: [PATCH 2/5] optimize code --- .github/workflows/maven.yml | 14 ++-- pom.xml | 2 +- .../imperator/controller/RouteController.java | 6 +- .../UnifiedRouteRepositoryImpl.java | 1 - .../route/RouteApplicationService.java | 20 ++++++ ...pl.java => RouteRepresentApplication.java} | 72 +++---------------- src/main/resources/bootstrap.yml | 2 - .../route/RouteRepresentApplicationTest.java | 70 ++++++++++++++++++ 8 files changed, 112 insertions(+), 75 deletions(-) create mode 100644 src/main/java/org/starrier/imperator/route/RouteApplicationService.java rename src/main/java/org/starrier/imperator/route/{DynamicRouteServiceImpl.java => RouteRepresentApplication.java} (50%) create mode 100644 src/test/java/org/starrier/imperator/route/RouteRepresentApplicationTest.java 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/pom.xml b/pom.xml index 490a1a4..2bd993f 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ html xml - + 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 From b2ce661a090f16e5174c690f7726422364ef9831 Mon Sep 17 00:00:00 2001 From: starrier Date: Thu, 7 Jan 2021 10:53:36 +0800 Subject: [PATCH 3/5] add icons --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 942df0c..c8f96fc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ +# 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) + 全局性流控 负载均衡 From 3f98a05e2b36d7e1b994c81dda214b2343f34515 Mon Sep 17 00:00:00 2001 From: starrier Date: Thu, 7 Jan 2021 10:59:04 +0800 Subject: [PATCH 4/5] add MIT License --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c8f96fc..0f29512 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # 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) From 1f36d01581072876d30f8519b9a745f2e4c838eb Mon Sep 17 00:00:00 2001 From: starrier Date: Thu, 7 Jan 2021 13:15:10 +0800 Subject: [PATCH 5/5] modify readme.md --- README.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0f29512..762ee34 100644 --- a/README.md +++ b/README.md @@ -1,31 +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 地址才可以访问。