Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
31 changes: 31 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -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
33 changes: 22 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -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 地址才可以访问。
33 changes: 33 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,39 @@
</dependencyManagement>

<build>
<sourceDirectory>src/main/java</sourceDirectory>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
<configuration>
<formats>
<format>html</format>
<format>xml</format>
</formats>
<check/>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
Expand Down Expand Up @@ -97,6 +129,7 @@
<phase>package</phase>
<goals>
<goal>build</goal>
<!--custom hub.docker.io info -->
<!--<goal>push</goal>-->
</goals>
</execution>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
* @author Starrier
* @date 2019/4/14
*/

public class UnifiedRouteRepositoryImpl implements RouteDefinitionRepository {

private final Map<String, RouteDefinition> routes = synchronizedMap(Maps.newLinkedHashMap());
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String, String> 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<String, String> 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;
}

/**
Expand All @@ -101,17 +57,17 @@ 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 {
routeDefinitionWriter.save(Mono.just(definition)).subscribe();
this.publisher.publishEvent(new RefreshRoutesEvent(this));
return "success";
} catch (Exception e) {
LOGGER.error("update route fail:[{}]", e.toString(), e);
return "update route fail";
}


}

/**
Expand All @@ -126,10 +82,4 @@ public String delete(String id) {
return "delete success";
}

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.publisher = applicationEventPublisher;
}


}
2 changes: 0 additions & 2 deletions src/main/resources/bootstrap.yml
Original file line number Diff line number Diff line change
@@ -1,2 +0,0 @@
server:
port: 9911
Original file line number Diff line number Diff line change
@@ -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<String, String> 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<String, String> 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));
}


}