springboot Service的路由

    技术2022-07-10  183

    Spring_Boot专栏上一篇主目录 下一篇

    目录

    【前言】 在springboot项目中,使用GatewayController去统一处理渠道网管的请求服务,如何路由到具体的Service上呢?


    GatewayController

    @Slf4j @RestController public class GatewayController { @Autowired private ApiBaseService apiBaseService; @RequestMapping(value = "/auth/{version:.+}/{method:.+}", method = { RequestMethod.POST }, produces="application/json;charset=UTF-8" ) public String baseController(@RequestBody JSONObject obj, @PathVariable String version, @PathVariable String method){ log.info("调用***服务请求参数打印, version={}, method={}", version, method); ApiReqBaseVo req = JSON.toJavaObject(obj, ApiBaseVo.API_REQUEST_TYPE.get(version + method)); req.setMethod(method); req.setVersion(version); ApiRespBaseVo resp = apiBaseService.handler(req); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new CustomBeanSerializerModifier())); String json = ""; try { json = objectMapper.writeValueAsString(resp); } catch (Exception e) { log.error("数据异常转换异常,userId={}, method={}, token={}, exception={}",req.getUid(), req.getMethod(), req.getToken(), e); } return json; } }

    ApiBaseService

    @Slf4j @Service public class ApiBaseService { @Autowired private UserMapper userMapper; @Autowired private Map<String, ApiAbstractService> apiServiceMap = new HashMap<>(); @Autowired private List<ApiFilterChain> chains = new ArrayList<>(); /** * service 路由方法 * @param req * @return */ public ApiRespBaseVo handler(ApiReqBaseVo req) { ApiRespBaseVo resp = null; try{ doFilter(req); ApiAbstractService service = apiServiceMap.get(req.getMethod() + Constants.UNDERLINE + req.getVersion()); if (validate(req) && service.validate(req)) { PrometheusMetricsInterceptor.localStatus.set(new Span("0000")); resp = service.invoke(req); } log.info("auth-service执行成功,入参={}", JSONObject.toJSONString(req)); }catch(ApiBusinessException e){ log.error("auth-service执行异常,入参={}, exception={}", JSONObject.toJSONString(req),e); throw e; }catch(Exception e){ log.error("auth-service执行异常,入参={},exception={}", JSONObject.toJSONString(req), e); ApiBusinessException ae = new ApiBusinessException(Constants.ApiCommon.API_RESP_CODE_1012, "服务器异常",req.getUid(), req.getMethod(), req.getToken()); throw ae; }catch (Throwable e){ log.error("auth-service执行异常,入参={},exception={}", JSONObject.toJSONString(req), e); ApiBusinessException ae = new ApiBusinessException(Constants.ApiCommon.API_RESP_CODE_1012, "服务器异常",req.getUid(), req.getMethod(), req.getToken()); throw ae; } return resp; } private void doFilter(ApiReqBaseVo req){ for (ApiFilterChain apiFilterChain : chains) { ApiFilterChain chain = apiFilterChain; chain.filter(req); } }

    @Autowired private Map<String, ApiAbstractService> apiServiceMap = new HashMap<>(); 注入apiServiceMap,注入的bean包括继承了ApiAbstractService的所有子类 ApiAbstractService service = apiServiceMap.get(req.getMethod() + Constants.UNDERLINE + req.getVersion()); 这一个是通过@Service(“XXX”)注解中的XXX(key)获得该Service类(value)。例如:

    ApiAbstractService

    public abstract class ApiAbstractService{ }

    Idcard2ServiceImpl

    @Service(Constants.API_METHOD_IDCARD2 + Constants.UNDERLINE + Constants.ApiCommon.VERSION_1_0_0) @Slf4j public class Idcard2ServiceImpl extends ApiAbstractService { }

    通过apiServiceMap.get(Constants.API_METHOD_IDCARD2 + Constants.UNDERLINE + Constants.ApiCommon.VERSION_1_0_0)得到的是Idcard2ServiceImpl 类(ApiAbstractService 的子类)

    这样通过传入的req得到method和version,就可以路由到相应的Service

    Processed: 0.009, SQL: 9