精华内容
下载资源
问答
  • 下载微服务架构与实践pdf文档下载微服务架构与实践pdf文档
  • 微服务
  • 微服务

    2020-07-12 10:46:02
    什么是微服务微服务(microservices), 一种架构风格,在开发应用时,将应用拆分一系列小服务,通过http方式(还有rpc等)进行互通。 马丁福勒的论文 使用这种架构的好处: 节省了调用资源; 每个功能元素的服务...

    什么是微服务?

    微服务(microservices),一种架构风格,在开发应用时,将应用拆分一系列小服务,通过HTTP方式(还有RPC等)进行互通。

    马丁福勒的论文

    使用这种架构的好处:

    节省了调用资源,每个功能元素的服务都是可替换的,可以独立升级的软件代码。(高内聚低耦合)

    微服务的诟病:

    这种庞大的系统架构给部署和运维带来很大的难度,Spring为我们带来了构建大型发布式微服务的全套,全程产品

    展开全文
  • 微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目微服务项目...
  • OpenFeign实现微服务间的文件下载

    万次阅读 2021-01-18 15:43:50
    微服务通过openfeign获取文件流 问题描述: 微服务通过openfeign获取文件流,消费端获取的inputSteam=null,无法获取到文件流信息 解决方案: file服务(提供者):根据附件id,获取附件路径下载 @ApiOperation...

    项目场景:

    微服务通过openfeign获取文件流

    问题描述:

    微服务通过openfeign获取文件流,消费端获取的inputSteam=null,无法获取到文件流信息


    解决方案:

    file服务(提供者):根据附件id,获取附件路径下载

        @ApiOperation(value = "附件下载")
        @RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
        public void down(HttpServletResponse response,@CustomJSONBody Object object) {
            Map<String, String> map = (Map) object;
            String fileId = map.get("fileId");
            String[] fileInfos = attachmentService.findById(fileId);
            InputStream in = null;
            try {
                String filePath = fileUploadDir + fileInfos[1];
                if (File.separator.equals("/")) {
                    filePath = filePath.replaceAll("\\\\", File.separator);
                } else if (File.separator.equals("\\\\")) {
                    filePath = filePath.replaceAll("/", File.separator);
                }
                in = new FileInputStream(filePath);
                OutputStream out = response.getOutputStream();
                byte buffer[] = new byte[1024];
                int length = 0;
                while ((length = in.read(buffer)) >= 0){
                    out.write(buffer,0,length);
                }
            } catch (Exception e) {
                logger.error("附件下载异常", e);
            } finally {
                if(in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    

    feign:

        @RequestMapping(value = "/file/download/v1", method = RequestMethod.POST,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
        public Response down(@CustomJSONBody Object object);
    

    业务服务(消费者):将附件打包zip文件下载(附全部zip打包相关代码,可直接看最后一个执行压缩的方法)

    public void zipExcelExport(DisasterHistoryExportDTO dto, HttpServletResponse response) {
            List<String> ids = dto.getList().stream().map(DisasterExpandPO::getFileId).collect(Collectors.toList());
            List<AttachmentPO> attachmentPOList = attachmentDao.findAllById(ids);
            if (CollectionUtils.isNotEmpty(attachmentPOList)) {
                try {
                    response.reset();
                    // 设置response的Header
                    String exportName = URLEncoder.encode(dto.getFileName() + ".zip", "utf-8");
                    response.setContentType("application/octet-stream");
                    response.setCharacterEncoding("utf-8");
                    response.setHeader("Content-Disposition", "attachment; filename=" + exportName);
                    response.setHeader("FileName", exportName);
                    response.setHeader("Access-Control-Expose-Headers", "FileName");
                    OutputStream out = response.getOutputStream();
                    excelsToZip(out, attachmentPOList);
                    out.close();
                } catch (IOException ex) {
                    throw new BusinessException("导出压缩包失败");
                }
            }
        }     
        /**
         * 打压缩包导出
         */
        private void excelsToZip(OutputStream out, List<AttachmentPO> list) throws RuntimeException {
            ZipOutputStream zos = null;
            try {
                zos = new ZipOutputStream(out);
                compressExcel(zos, list);
            } catch (Exception e) {
                throw new RuntimeException("zip error from ZipUtils", e);
            } finally {
                if (zos != null) {
                    try {
                        zos.close();
                    } catch (IOException e) {
                        throw new BusinessException("关闭zip输出流失败");
                    }
                }
            }
        }
         /**
         * 执行压缩
         */
        private void compressExcel(ZipOutputStream zos, List<AttachmentPO> list) {
            if (CollectionUtils.isNotEmpty(list)) {
                for (AttachmentPO item : list) {
                    byte[] buf = new byte[BUFFER_SIZE];
                    Map<String, String> map = new HashMap<>();
                    map.put("fileId", item.getAttachId());
                    Response response = attachmentCilent.down(map);
                    Response.Body body = response.body();
                    try {
                        InputStream in = body.asInputStream();
                        zos.putNextEntry(new ZipEntry(item.getOldName()));
                        int len;
                        while ((len = in.read(buf)) != -1) {
                            zos.write(buf, 0, len);
                        }
                        zos.closeEntry();
                        in.close();
                        in.close();
                    } catch (IOException e) {
                        throw new BusinessException("执行压缩失败");
                    }
                }
            }
        }
    

    核心代码:

    提供者:返回void,HttpServletResponse 写入
    feign:应用提供者接口,返回改为Response(用feign.Response来接收)
    消费者:调用feign,转为InputStream

    Response response = attachmentCilent.down(map);
    Response.Body body = response.body();
    InputStream in = body.asInputStream();
    

    参考:
    https://www.jianshu.com/p/eeca093741ef?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    展开全文
  • SpringBoot微服务搭建代码下载,里面包含SpringBoot服务端及一个客户端,是一个简单的实例。
  • 微服务架构如何落地实践 PDF 下载
  • 主要为大家详细介绍了使用Feign实现微服务间文件下载,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 采用SpringCloud+SpringBoot+Netflix+mybatis敏捷框架,同时整合swagger在线文档、oralce/mysql数据库、redis缓存、Ribbon负载均衡、Hystrix熔断、minio文件容器、easypoi导入导出模板等常用组件,并且源码中还提供...
  • SpringCloud与Docker微服务架构实战pdf文档与视频下载SpringCloud与Docker微服务架构实战pdf文档与视频下载
  • 微服务架构

    2018-06-30 14:36:36
    讲述如何搭建java微服务架构;微服务的原理;微服务的架构实战;
  • 微服务实践

    2019-02-01 22:22:27
    近些年来,微服务一直是非常热门的话题,关于微服务架构的讨论也是层出不穷。本书以贯穿整书的示例为出发点,由浅入深地阐述使用微服务的最佳实践,以及如何避免采用微服务架构可能带来的复杂性陷阱。本书从微服务...
  • 微服务教程

    2019-01-21 08:08:49
    微服务搭建教程,欢迎大家下载。跟着文档一步一步搭建就可以。
  • 针对微服务通用文件下载接口文件下载接口FileUtils中的方法前端使用js调用 文件下载接口 /** * @param affixFileUrl 文件下载地址 * @param affixFileName 文件名 * @param response * @param request * @...

    针对微服务通用文件下载接口

    文件下载接口

        /**
         * @param affixFileUrl 文件下载地址
         * @param affixFileName 文件名
         * @param response
         * @param request
         * @return
         */
        @ApiOperation(value = "下载", notes = "下载附件")
        @RequestMapping(value = "/downloadAffix", method = RequestMethod.GET)
        public Result downloadAffix(@RequestParam(value = "affixFileUrl", required = true) String affixFileUrl,
                                    @RequestParam(value = "affixFileName", required = true) String affixFileName,
                                    HttpServletResponse response, HttpServletRequest request) {
            Result<?> result = new Result<>();
            BufferedInputStream bis = null;
            OutputStream os = null;
            try {
                String userAgent = request.getHeader("User-Agent");
                //解决下载时文件名乱码问题
                // 针对IE或者以IE为内核的浏览器:
                if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                    affixFileName = java.net.URLEncoder.encode(affixFileName, "UTF-8");
                } else {
                    // 非IE浏览器的处理:
                    affixFileName = new String(affixFileName.getBytes("UTF-8"), "ISO-8859-1");
                }
    
                FileUtils fileUtils=new FileUtils();
                response.setHeader("content-type", "application/octet-stream");
                response.setContentType("application/octet-stream");
                response.setHeader("Content-Disposition", "attachment;filename=" + affixFileName);
    
                byte[] buff = new byte[1024];
                //因需要这里截掉了服务名,非必须
                affixFileUrl = affixFileUrl.replace("/"+ftpUtil.getServerName()+"/","");
                //文件路径拼接
                String filePath= fileUtils.getFilePath()+affixFileUrl;
                os = response.getOutputStream();
                bis = new BufferedInputStream(new FileInputStream(new File(filePath)));
                int i = bis.read(buff);
                while (i != -1) {
                    os.write(buff, 0, buff.length);
                    os.flush();
                    i = bis.read(buff);
                }
            }catch (Exception e){
                log.error(e.getMessage());
                return Result.error(-1, e.getMessage());
            }finally {
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            log.info("下载附件成功:");
            return result.success("下载成功");
    

    FileUtils中的方法

    /**
    	 * 获取文件当前路径
    	 * @return
    	 */
    	public  String  getFilePath(){
    		ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    		HttpServletRequest request = attr.getRequest();
    		String filePath=request.getSession().getServletContext().getRealPath("/");
    		return filePath;
    	}
    

    前端使用js调用

    //下载附件
            function downloadAffix(affixFileUrl,affixFileName) {
                window.location.href = '/file-server'+'/gjpxfile/downloadAffix?affixFileUrl=' + affixFileUrl+'&affixFileName='+affixFileName;
            }
    
    展开全文
  • 微服务学习

    2018-11-01 23:01:18
    微服务相关文档,华为出品 需要的可以下载过来学习,相当不错的资料
  • 微服务server

    2018-07-12 21:09:51
    微服务分布式架构实践,rpc-server 服务器端,下载即运行[1.3.2]
  • ─第一模块 :微服务安全架构与实践 │ ├─01.第一模块课程介绍.mp4 │ ├─02.微服务安全要解决什么问题.mp4 │ ├─03.白话 OAuth2.mp4 │ ├─04.OAuth2 的正式定义.mp4 │ ├─05.OAuth2 有哪些典型模式.mp4 │...
  • 源码分享:Javaweb练手项目下载 微服务架构是一个庞大复杂的工程,为什么说它庞大复杂呢?因为想要做好微服务,就必须先要建设好微服务所需的一系列基础设施和组件。我在前面的文章《架构设计之「 微服务入门」》中...

    作者:奎哥

    来自公众号:不止思考

    源码分享:Javaweb练手项目下载

    微服务架构是一个庞大复杂的工程,为什么说它庞大复杂呢?因为想要做好微服务,就必须先要建设好微服务所需的一系列基础设施和组件。我在前面的文章《架构设计之「 微服务入门 」》中已经初步介绍过了这些组件,包括:服务注册、服务网关、配置中心、服务框架、服务监控、服务追踪、服务治理等。

    只有将这些基础设施搭建完善了,微服务实践的道路才能走的稳、走的远。后面的文章中会依次把每一个基础组件都详细分析一下。今天我们就先挑选「 服务注册 」聊一聊。

    一、为什么需要「 服务注册 」?

    我们先来举一个生活中的例子:在以前互联网还不够发达的时候,“114号码百事通”大家应该很熟悉,有啥需求就会去打个电话查询一下。比如想知道附近电影院电话是多少,就会先去打114问一下。那114为啥知道这么多信息呢,还不是因为各类服务者(商店、机构等)都已经在114上登记了嘛。所以这里的“114百事通”就相当于一个服务注册中心了,这里的各类商店机构就相当于可以提供不同服务的服务者了,而打电话的我们就是去寻找这些服务的消费者了。

    我们再来回到微服务架构中,一般集群都会部署很多个微服务节点。这些节点一般也具备这2种角色,称为:“服务的提供者” 和 “服务的消费者”。

    “服务消费者”需要调用“服务提供者”的API来获得服务。当“服务提供者”的节点有增加或减少的时候,也得让调用者(“服务消费者”)及时的知晓。而在大规模集群中,一般节点数目都很多,节点变化频繁,通过手动去维护这些节点的状态是不现实的,因此需要一个叫做“服务注册中心”的组件来实现。

    “服务提供者”将自己的服务地址等信息登记到“服务注册中心”中,调用者(“服务消费者”)需要的时候,每次都先去“服务注册中心”查询即可。既解决了人工维护微服务节点状态的问题,也能解决多节点间负载均衡的问题。

    二、「 服务注册 」的实现原理是什么?

    在分析其原理之前,我们先来看一下这里包含的一些角色,有三类:“服务提供者”、“服务消费者”、“服务注册中心”。

    其中“服务提供者”需要将自己的服务信息注册到“服务注册中心”里面。而“服务消费者”需要到“服务注册中心”里面去查询有哪些服务可以调用。因此,我们可以分为两个视角去分析原理:

    • 从“服务提供者”的视角, “服务提供者”向“服务注册中心”进行注册:

      登记注册具体的也有为两种方式,一种是 自己注册,另一种是 第三方注册

    1. 自己注册:

      微服务架构之「 服务注册 」

      如图,自己注册就是指微服务节点在启动的时候,自己去服务注册中心登记注册了,把自己的信息和状态传过去。这种方式整体结构比较简单,对于注册中心而言也比较省事,但是对于微服务节点而言,每个微服务都得包含这么一段注册的逻辑代码,架构上看起来不是很优美。

      再拿114百事通的例子解释一遍,自己注册就表示这是商家开店之后自己跑去告诉114电话台,说自己商店开业了,目前在经营着哪些服务,请求114登记下来。

    2. 第三方注册:

      微服务架构之「 服务注册 」

      如图,第三方注册就是指有一个“服务管理器”(图中的Service Manager),这个“服务管理器”会去管理所有的微服务和进程,以轮询或其它方式去检查有哪些微服务实例正在运行,会将这些微服务实例自动更新到服务注册中心。这是目前比较常用的方式,例如Eureka就是采用这个模式。

      如果再拿114百事通的例子来讲,就相当于114中心安排了一个管理员,这个管理员会定期的到街上去看一看有哪些新开的商店就把它登记下来,有哪些关闭了的商店就从注册中心删除掉。

    • 从“服务消费者”的视角,“服务消费者”向“服务注册中心”查询和调用服务:

      对于服务的查询和调用,也分为两种模式:客户端模式 和 代理模式

    1. 客户端模式

      微服务架构之「 服务注册 」

      在客户端模式下,“服务消费者”(图中的Client)在向“服务注册中心”查询到自己需要调用的“服务提供者”的地址之后,“服务消费者”(客户端)就会自己根据地址去访问微服务(图中的第3步 API Gateway是可选项,有API Gateway的情况下,API Gateway起到负载均衡作用,没有第3步的话,那就是Client直接调用Microservice,需要Client自己写负载均衡逻辑)。

      客户端模式在实现上比较简单。

    2. 代理模式

      微服务架构之「 服务注册 」

      在代理模式下,“服务消费者”(图中的Client)与 微服务、“服务注册中心”中间有一个 API Gateway组件相隔着。“服务消费者”只管去找API Gateway访问即可。至于去注册中心查询服务地址,以及访问服务地址的动作都由API Gateway效劳了,最后API Gateway在把结果返回给“服务消费者”即可。

      这种模式,看起来“服务消费者”省事了,但是API Gateway模块却复杂了,因为API Gateway就是整个系统的一个非常核心关键节点了,不仅需要保障自己的稳定性和性能,而且还需要处理一些负载均衡的逻辑。在大型架构中,这种模式用的还比较多。

    三、「 服务注册 」如何实践?

    讲完了服务注册中心的必要性和原理,我们再来看一下在实际应用中应该如何去应用。虽然我们可以根据原理自己去开发一套服务注册中心,但是如果没有特殊需求,还是不建议重复造轮子了,市面上有很多成熟的方案可以直接使用。

    • Eureka

      Eureka是由Netflix开源,其架构如下图:

      微服务架构之「 服务注册 」

      从图中可以看到,我们的服务(图中Application Clinet与Application Service)要使用Eureka就需要集成它的SDK(图中Eureka Client)。图中的Eureka部署在了三个异地机房,也就是说Eureka是支持多中心部署的。

      服务提供者(Application Service)通过Eureka Client实现服务的注册、更新和注销等。服务消费者(Application Clinet)通过Eureka Client实现服务的查询和调用。

      Eureka支持了与Spring Cloud的集成,所以使用起来也非常方便,目前属于比较流行的方案。

    • Consul

      Consul是另外一个非常流行的开源组件,如下图:

      微服务架构之「 服务注册 」

      Consul是在服务外进行完成一系列动作的,也就是说并不需要服务节点去依赖它的SDK,没有侵入性,所以跨语言的解决能力更强一些。它一般是在服务节点外通过一些探针的方法去检查应用是否存活,是否需要注册或注销。

      Consul也支持Spring Cloud集成,所以使用起来也很方便,也属于比较流行的方案。

    • Etcd、Zookeeper

      这两个也有一些公司基于它们来实现服务注册,也集成了Spring Cloud,不过不算非常广泛。

    以上,就是对微服务架构中「 服务注册 」的一些思考。

     

    扫码关注后端技术精选,回复“学习资料”,领取100套小程序源码+小程序开发视频和基本Java经典书籍电子版 

    展开全文
  • 微服务文件上传下载方案

    千次阅读 2018-11-14 19:47:04
      具体需求: 一 文件上传: ... 上传成功后需要服务端返回成功标识...(4) 上传下载的表本身与具体业务没有关系   (5) 前端先调上传服务,再调业务服务来完成整个业务   二 文件下载: (1) 前端给后端提供...
  • Dubbo的原理以及组件说明Dubbo支持哪些协议zookeeper注册中心介绍CAP原则Dubbo的注册中心zooker的调用原理zookeeper下载安装Zookeeper集群安装 什么是微服务微服务架构是一种架构风格和架构思想,它倡导我们在...
  • 微服务介绍

    2018-11-04 09:03:51
    微服务的简介 微服务的设计原则 微服务的常用能力及其技术栈 案例
  • 微服务 & 微服务架构

    千次阅读 多人点赞 2020-08-05 23:47:40
    微服务 & 微服务架构 单体架构 VS 微服务架构 单体架构 一个工程对应一个归档包(war),这个war包 包含了该工程的所有功 能。我们成为这种应用为单体应用,也就是我们常说的单体架构(一个 war包打天下)。 具体...
  • Feign实现微服务间文件下载

    千次阅读 2018-09-15 09:31:14
    在使用Feign做服务间调用的时候,当下载大的文件会出现堆栈溢出的情况。另外,文件管理服务(服务提供者)文件下载接口无返回值,是通过HttpServletRespoonse传输的流数据来响应,那么服务消费者该如何接受下载的数据...
  • Spring Cloud微服务

    2018-03-08 15:06:06
    Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务Spring Cloud微服务
  • hy.microservice.file 文件(图片,视频)上传,下载微服务
  • 微服务SpringCloud入门

    万次阅读 多人点赞 2020-11-26 16:08:36
    文章目录Spring Cloud介绍SpringCloud架构微服务开发三要素dubbo发布的服务的三个要素SpringCloud发布的服务三个要素微服务入门工程实例1. 创建微服务父工程 Spring Cloud介绍 Spring cloud微服务是一种架构方式,...
  • 1年前就听说Spring Cloud微服务,但是工作中也用不到,一直也没有深入了解、学习一下。...在网上找到了Spring Cloud微服务实战视频教程的百度网盘下载链接Spring Cloud微服务实战视频教程百度网盘下载 ...
  • .Net微服务课件

    2018-08-16 15:13:06
    .Net微服务课件 .net微服务实践 .Net微服务课件 .net微服务实践
  • 文件中是视频教程的网盘地址与密码;视频主要是深度解析SpringCloud微服务技术及在项目中的实战运用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,905
精华内容 21,162
关键字:

下载微服务