zoukankan      html  css  js  c++  java
  • springcloud微服务架构的思考

    在网上找到一张关于微服务体系架构的图

    应用组件:

    首先对于整个程序的入口应该是网关,zuul部分

    这个组件在springcloud中的gateway服务之后,zuul可以进行网关分配,根据想应的路劲进行分到具体的服务,其实zuul就相当于门面模式的设计方法:

    如下是在网上找到的一张图片,可以很清晰的看到门面模式的设计方式,就是一个统一入口,再根据这个入口进行分配到相关的部分去执行相关的服务

    那么存在什么问题呢

    一   用户信息问题,权限问题

    在微服务模块,用户只在一个模块中登录过,所以用户信息只存在一个模块中,那么怎么去解决呢,而且有些模块是需要登录的,有些模块是不需要登录的,怎么去处理这些问题呢,

    其实可以采用单点登录的解决方式,来进行

    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * 描述: 过滤器 token
     *
     **/
    public class TokenFilter extends ZuulFilter {
    
        private final Logger LOGGER = LoggerFactory.getLogger(TokenFilter.class);
    
        @Override
        public String filterType() {
            return "pre"; // 可以在请求被路由之前调用
        }
    
        @Override
        public int filterOrder() {
            return 0; // filter执行顺序,通过数字指定 ,优先级为0,数字越大,优先级越低
        }
    
        @Override
        public boolean shouldFilter() {
            return true; // 是否执行该过滤器,此处为true,说明需要过滤
        }
    
        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
    
            LOGGER.info("--->>> TokenFilter {},{}", request.getMethod(), request.getRequestURL().toString());
    
            String token = request.getParameter("token");// 获取请求的参数
    
            if (StringUtils.isNotBlank(token)) {
                ctx.setSendZuulResponse(true); //对请求进行路由
                ctx.setResponseStatusCode(200);
                ctx.set("isSuccess", true);
                return null;
            } else {
                ctx.setSendZuulResponse(false); //不对其进行路由
                ctx.setResponseStatusCode(400);
                ctx.setResponseBody("token is empty");
                ctx.set("isSuccess", false);
                return null;
            }
        }
    
    }

    看上面就知道整个系统是需要登录携带token的,但是是不可以进行的,并不能对每个接口或者单独的服务进行限制

    可以采用单点登录的方式进行,让用户每次携带token,并在项目中验证token的权限,如果单点登录服务器中有相关的token信息就放置到自己的模块中,生成局部的token信息,就可以解决,只是用户登录第一次之后需要进行相关的信息

    同时也可以采用thradlocal这个类来存储用户信息,避免每次都是需要调取相关的服务进行用户信息的查询。也可以存储相关的权限。

    二 错误排查

      当你一个服务调取了很多的服务,那么一旦当服务出现问题了就会很难进行排查,所以需要我们引入更新的技术去解决这个问题,

     可以引入zipkin这个进行链路追踪

    可以通过这个追踪到相关服务,同时可以查询到相关接口的调用时间,并且对相关接口的优化。

  • 相关阅读:
    CDH5.13 集成Kerberos配置
    使用bash脚本删除文件最后几行
    yolov3模型微调(fine-tune)备忘
    ubuntu 18.04 rsync 命令使用 服务端配置
    python 子包调用 跨目录调用
    [转]命令行界面 (CLI)、终端 (Terminal)、Shell、TTY的联系与区别
    bash shell 判断变量是否在列表中
    TensorFlow 图像分类模型 inception_resnet_v2 模型导出、冻结与使用
    numpy 数组集合运算及下标操作
    Win10 Service'MongoDB Server' failed to start. Verify that you have sufficient privileges to start system services【简记】
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10495173.html
Copyright © 2011-2022 走看看