我们目前的规范是公共参数和业务参数不放在一起。因为公共参数和业务参数一般不会在一起使用,如果只是为了获取公共参数就要将业务参数也一起反序列化有点浪费,而且涉及加签,如果将签名放在报文里势必要规定加密时的拼接规则等,而单独出来的公共参数可以直接使用。加签时直接将业务参数的字符串做签名即可。
而由于我们与前端交互时使用的是JWT,JWT虽然在扩展性上有优势,可以让我们方便的对接其他系统,但是在同一个业务集群内部如果每次服务间的调用都传递JWT会带来一些不必要的损耗,例如:JWT往往很长,而且每个服务都需要对JWT进行验签和解析。所以我们在网关上对JWT做验证和解析后将信息保存到Redis中,在后续的服务调用中仅传递JWT中的JIT,这样其他服务需要JWT参数时可以直接通过JIT从Redis中获取对应的参数。
JIT是指一个JWT对应的唯一id,一般是一个uuid字符串。
# platform-module/platform-module-starter/platform-module-starter-web/src/main/java/com/tinem/platform/module/starter/web/filter/GatewayFilter.java
package com.tinem.platform.module.starter.web.filter;
import com.tinem.platform.module.starter.web.context.GatewayContext;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author fengzhihao
* @version v1
* @program: platform
* @className GatewayFilter
* @description TODO
* @site
* @company
* @create 2020-07-04 10:09
*/
public class GatewayFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
GatewayContext.REQUEST_LOCAL.set(request);
GatewayContext.RESPONSE_LOCAL.set(response);
try {
filterChain.doFilter(request,response);
}finally {
GatewayContext.REQUEST_LOCAL.remove();
GatewayContext.RESPONSE_LOCAL.remove();
}
}
}
# platform-module/platform-module-starter/platform-module-starter-web/src/main/java/com/tinem/platform/module/starter/web/config/FeignConfiguration.java
package com.tinem.platform.module.starter.web.config;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.IoUtil;
import com.alibaba.fastjson.JSON;
import com.tinem.platform.module.pojo.co.GatewayHeadName;
import com.tinem.platform.module.pojo.co.RedisKeyEnum;
import com.tinem.platform.module.pojo.vo.error.SystemException;
import com.tinem.platform.module.starter.sdk.MessageCode;
import com.tinem.platform.module.starter.web.context.GatewayContext;
import feign.FeignException;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.Response;
import feign.codec.Decoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpStatus;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author fengzhihao
* @version v1
* @program: platform
* @className FeignConfiguration
* @description TODO
* @site
* @company
* @create 2020-07-12 18:33
*/
@Slf4j
@Configuration
public class FeignConfiguration implements RequestInterceptor, Decoder {
public static final ThreadLocal
页面更新:2024-04-23
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号