瀏覽代碼

网关服务

zhoutg 6 年之前
父節點
當前提交
5ebc369b26

+ 1 - 1
diagbotman-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -25,7 +25,7 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
         http
                 .csrf().disable()
                 .authorizeRequests()
-                .regexMatchers(".*swagger.*",".*v2.*",".*webjars.*","/druid.*","/actuator.*","/hystrix.*").permitAll()
+                .regexMatchers(".*swagger.*",".*v2.*",".*webjars.*","/druid.*","/actuator.*","/hystrix.*","/service_filter/getAll").permitAll()
                 .antMatchers("/**").authenticated();
 //        .antMatchers("/**").permitAll();
     }

+ 1 - 0
diagbotman-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -34,6 +34,7 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                     || matchers("/druid/**", request)
                     || matchers("/actuator/**", request)
                     || matchers("/hystrix/**", request)
+                    || matchers("/service_filter/getAll", request)
                     || matchers("/", request)){
                 return;
             } else {

+ 64 - 0
diagbotman-service/src/main/java/com/diagbot/entity/ServiceFilter.java

@@ -0,0 +1,64 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:35
+ */
+@TableName("diag_service_filter")
+@Getter
+@Setter
+public class ServiceFilter implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除 N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private LocalDateTime gmtCreate;
+
+    /**
+     * 记录修改时间
+     */
+    private LocalDateTime gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+
+}

+ 16 - 0
diagbotman-service/src/main/java/com/diagbot/entity/wrapper/ServiceTokenWrapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.entity.wrapper;
+
+import com.diagbot.entity.ServiceToken;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:35
+ */
+@Getter
+@Setter
+public class ServiceTokenWrapper extends ServiceToken {
+    private String url;
+}

+ 20 - 0
diagbotman-service/src/main/java/com/diagbot/facade/ServiceFilterFacade.java

@@ -0,0 +1,20 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.service.ServiceFilterServiceImpl;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description: 品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:45
+ */
+@Component
+public class ServiceFilterFacade extends ServiceFilterServiceImpl {
+
+    public RespDTO<List<String>> getServiceFilter() {
+        return this.getAll();
+    }
+}

+ 31 - 0
diagbotman-service/src/main/java/com/diagbot/mapper/ServiceFilterMapper.java

@@ -0,0 +1,31 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.ServiceFilter;
+import com.diagbot.entity.wrapper.ServiceTokenWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:38
+ */
+public interface ServiceFilterMapper extends BaseMapper<ServiceFilter> {
+
+    /**
+     * @Description: 获取所有的过滤服务
+     * @Author: ztg
+     * @Date: 2018/9/18 14:57
+     */
+    public List<ServiceFilter> getAll();
+
+    /**
+     * @Description: 根据Map中的参数取值
+     * @Author: ztg
+     * @Date: 2018/9/18 14:57
+     */
+    public List<ServiceTokenWrapper> getPermissionUrl(Map map);
+
+}

+ 22 - 0
diagbotman-service/src/main/java/com/diagbot/service/ServiceFilterService.java

@@ -0,0 +1,22 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.ServiceFilter;
+
+import java.util.List;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:39
+ */
+public interface ServiceFilterService extends IService<ServiceFilter> {
+
+    /**
+     * @Description: 根据Map中的参数取值
+     * @Author: ztg
+     * @Date: 2018/9/18 14:57
+     */
+    public RespDTO<List<String>> getAll();
+}

+ 44 - 0
diagbotman-service/src/main/java/com/diagbot/service/ServiceFilterServiceImpl.java

@@ -0,0 +1,44 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.ServiceFilter;
+import com.diagbot.mapper.ServiceFilterMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:39
+ */
+@Service
+public class ServiceFilterServiceImpl extends ServiceImpl<ServiceFilterMapper, ServiceFilter> implements ServiceFilterService {
+
+    @Autowired
+    ServiceFilterMapper serviceFilterMapper;
+
+    @Override
+    public RespDTO<List<String>> getAll() {
+        List<ServiceFilter> list = serviceFilterMapper.getAll();
+        List<String> service = new ArrayList<>();
+        for(ServiceFilter bean : list) {
+            service.add(bean.getName());
+        }
+        return RespDTO.onSuc(service);
+    }
+
+
+    public RespDTO<List<String>> getPermissonUrl(String appkey, String secret) {
+        List<ServiceFilter> list = serviceFilterMapper.getAll();
+        List<String> service = new ArrayList<>();
+        for(ServiceFilter bean : list) {
+            service.add(bean.getName());
+        }
+        return RespDTO.onSuc(service);
+    }
+
+}

+ 35 - 0
diagbotman-service/src/main/java/com/diagbot/web/ServiceFilterController.java

@@ -0,0 +1,35 @@
+package com.diagbot.web;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.ServiceFilterFacade;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Description: 产品服务过滤
+ * @Author: ztg
+ * @Date: 2018/9/18 14:40
+ */
+@RestController
+@RequestMapping("/service_filter")
+public class ServiceFilterController {
+
+    @Autowired
+    ServiceFilterFacade serviceFilterFacade;
+
+    @RequestMapping("/getAll")
+    public RespDTO<List<String>> getServiceFilter() {
+        return serviceFilterFacade.getAll();
+    }
+
+
+    @RequestMapping("/getPermissonUrl")
+    public RespDTO<List<String>> getPermissonUrl(String appkey, String secret) {
+        return serviceFilterFacade.getPermissonUrl(appkey, secret);
+    }
+
+}
+

+ 21 - 0
diagbotman-service/src/main/resources/mapper/ServiceFilterMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.ServiceFilterMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.ServiceFilter">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="name" property="name" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <select id="getAll" resultMap="BaseResultMap">
+        select a.* from diag_service_filter a where is_deleted = 'N'
+    </select>
+
+</mapper>

+ 16 - 1
docs/002.数据库设计/sys-diagbotman.sql

@@ -37,4 +37,19 @@ CREATE TABLE `sys_log` (
   `params` varchar(255) NOT NULL DEFAULT '' COMMENT '参数',
   `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
   PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=267 DEFAULT CHARSET=utf8 COMMENT='系统操作日志表';
+) ENGINE=InnoDB AUTO_INCREMENT=267 DEFAULT CHARSET=utf8 COMMENT='系统操作日志表';
+
+
+DROP TABLE IF EXISTS `diag_service_filter`;
+CREATE TABLE `diag_service_filter` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+  `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+  `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+  `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+  `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '名称',
+  `remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `name` (`name`)
+) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='产品网关过滤(需要使用appkey和secret的url地址)';

+ 5 - 0
gateway-service/pom.xml

@@ -86,6 +86,11 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.diagbot</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>

+ 28 - 0
gateway-service/src/main/java/com/diagbot/client/DiagbotmanServiceClient.java

@@ -0,0 +1,28 @@
+package com.diagbot.client;
+
+import com.diagbot.client.hystrix.DiagbotmanServiceHystrix;
+import com.diagbot.dto.RespDTO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+
+import java.util.List;
+
+
+/**
+ * @Description: 产品服务客户端
+ * @Author: ztg
+ * @Date: 2018/9/18 15:19
+ */
+@FeignClient(value = "diagbotman-service",fallback = DiagbotmanServiceHystrix.class )
+public interface DiagbotmanServiceClient {
+
+    @PostMapping("/service_filter/getAll")
+    RespDTO<List<String>> getAll();
+
+    @PostMapping("/service_filter/getPermissonUrl")
+    RespDTO<List<String>> getPermissonUrl(String appkey, String secret);
+
+}
+
+
+

+ 31 - 0
gateway-service/src/main/java/com/diagbot/client/hystrix/DiagbotmanServiceHystrix.java

@@ -0,0 +1,31 @@
+package com.diagbot.client.hystrix;
+
+
+import com.diagbot.client.DiagbotmanServiceClient;
+import com.diagbot.dto.RespDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description: 产品服务客户端(请求失败熔断)
+ * @Author: ztg
+ * @Date: 2018/9/18 15:19
+ */
+@Component
+@Slf4j
+public class DiagbotmanServiceHystrix implements DiagbotmanServiceClient {
+
+    @Override
+    public RespDTO getAll() {
+        log.error("【hystrix】调用{}异常","getAll");
+        return null;
+    }
+
+    @Override
+    public RespDTO<List<String>> getPermissonUrl(String appkey, String secret) {
+        log.error("【hystrix】调用{}异常","getPermissonUrl");
+        return null;
+    }
+}

+ 80 - 0
gateway-service/src/main/java/com/diagbot/exception/CommonExceptionHandler.java

@@ -0,0 +1,80 @@
+package com.diagbot.exception;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.util.GsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @Description: 错误通用处理
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@ControllerAdvice
+@ResponseBody
+@Slf4j
+public class CommonExceptionHandler {
+
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<RespDTO> handleException(Exception e) {
+        RespDTO resp = new RespDTO();
+        if(e instanceof BindException) {
+            BindException ex = (BindException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if(e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+//        if(e instanceof MissingServletRequestParameterException) {
+//            MissingServletRequestParameterException ex = (MissingServletRequestParameterException) e;
+//            Map<String, String> stringMap = new HashMap<>();
+//            stringMap.put(ex.getParameterName(), "不能为null");
+//            String msg = GsonUtil.toJson(stringMap);
+//            log.warn("【参数异常】:{}", msg);
+//            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+//            resp.msg = msg;
+//            return new ResponseEntity(resp, HttpStatus.OK);
+//        }
+        if(e instanceof CommonException) {
+            CommonException taiChiException = (CommonException) e;
+            resp.code = taiChiException.getCode();
+            resp.msg = e.getMessage();
+            log.error("【业务异常】:{}", e.getMessage());
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        resp.code = CommonErrorCode.FAIL.getCode();
+        resp.msg = e.getMessage();
+        log.error("【系统异常】:{}", e.getMessage());
+        e.printStackTrace();
+        return new ResponseEntity(resp, HttpStatus.OK);
+    }
+
+}

+ 21 - 8
gateway-service/src/main/java/com/diagbot/filter/GlobalGatewayFilter.java

@@ -1,7 +1,7 @@
 package com.diagbot.filter;
 
+import com.diagbot.client.DiagbotmanServiceClient;
 import com.diagbot.client.UserServiceClient;
-import com.diagbot.dto.RespDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@@ -13,9 +13,10 @@ import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
 import java.net.URI;
-import java.security.Permission;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
+import java.util.List;
 
 /**
  * @Description: 全局过滤器
@@ -27,9 +28,13 @@ import java.util.LinkedHashSet;
 public class GlobalGatewayFilter implements GlobalFilter {
 
     private static final String GATE_WAY_PREFIX = "/api";
+    private static final Boolean IS_GENERATE = false;
+    private static List<String> SERVICE_FILTER = new ArrayList<>();
 
     @Autowired
     UserServiceClient userServiceClient;
+    @Autowired
+    DiagbotmanServiceClient diagbotmanServiceClient;
 
 
     @Override
@@ -37,10 +42,6 @@ public class GlobalGatewayFilter implements GlobalFilter {
         log.info("check token and url permission....");
         LinkedHashSet requiredAttribute = serverWebExchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ORIGINAL_REQUEST_URL_ATTR);
         ServerHttpRequest request = serverWebExchange.getRequest();
-        String appkey = request.getHeaders().getFirst("appkey");
-        String secret = request.getHeaders().getFirst("secret");
-        //获取appkey,secret对应的
-        RespDTO<Permission> res = userServiceClient.getPermission(appkey, secret);
         String requestUri = request.getPath().pathWithinApplication().value();
         String serviceName = "";
         if (requiredAttribute != null) {
@@ -56,11 +57,23 @@ public class GlobalGatewayFilter implements GlobalFilter {
         log.info("APIURL:{}", requestUri);
         log.info("SERVICENAME:{}", serviceName);
         //
+
+//        if(!IS_GENERATE) {
+//            SERVICE_FILTER = diagbotmanServiceClient.getAll().data;
+//        }
+//        if(SERVICE_FILTER.contains(serviceName)) {
+//            String appkey = request.getHeaders().getFirst("appkey");
+//            String secret = request.getHeaders().getFirst("secret");
+//            //获取appkey,secret对应的
+//            RespDTO<Permission> res = userServiceClient.getPermission(appkey, secret);
+//        }
+//        if(1 == 1) {
+//            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "出错了!");
+//        }
+
         ServerHttpRequest.Builder builder = serverWebExchange.getRequest().mutate();
         builder.header("Authorization","Authorization Bearer token");
         gatewayFilterChain.filter(serverWebExchange.mutate().request(builder.build()).build());
-
-
         return gatewayFilterChain.filter(serverWebExchange.mutate().request(builder.build()).build());
     }
 }