精华内容
下载资源
问答
  • Spark-Streaming获取kafka数据的两种消费模式、三种消费语义
    千次阅读
    2019-01-08 00:01:27

    两种消费模式

    一、基于Receiver的方式

           Receiver是使用Kafka的高层次Consumer API来实现的。receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming启动的job会去处理那些数据。

           然而,在默认的配置下,这种方式可能会因为底层的失败而丢失数据。如果要启用高可靠机制,让数据零丢失,就必须启用Spark Streaming的预写日志机制(Write Ahead Log,WAL)。该机制会同步地将接收到的Kafka数据写入分布式文件系统(比如HDFS)上的预写日志中。所以,即使底层节点出现了失败,也可以使用预写日志中的数据进行恢复,但是效率底下,并且容易导致executor内存溢出,不推荐使用。

    注意点: 

          1、Kafka中topic的partition,与Spark中的RDD的partition是没有关系的。所以,增加kafka中topic的分区数,只会增加receiver的个数,就是读取topic的线程数量,并不会增加spark处理数据的并行度。    
          2、如果基于容错的文件系统,比如HDFS,启用了预写日志机制,接收到的数据都会被复制一份到预写日志中。因此,在KafkaUtils.createStream()中,设置的持久化级别是StorageLevel.MEMORY_AND_DISK_SER。

    更多相关内容
  • 常见的认证方式

    千次阅读 2019-07-04 15:24:09
    那么我们常见的认证机制都有哪些呢? 这里我总结了几个。 1:HTTP Basic Auth (这种是非常古老的,现在几乎没人用了) 它的逻辑是:每次一过来访问,都得带上你自己的用户名和密码这两个参数。 这种是傻瓜式的...

    首先说明一下什么是认证:

    认证其实就是登录,只不过官方的叫法为认证,这个不用太过纠结。

    那么我们常见的认证机制都有哪些呢?

    这里我总结了几个。

    1:HTTP Basic Auth (这种是非常古老的,现在几乎没人用了)

    它的逻辑是:每次一过来访问,都得带上你自己的用户名和密码这两个参数。

    这种是傻瓜式的验证,操作很明显,效率很低。

    但是,虽然他的效率很低,但是注意:它是无状态的,

    虽然他很垃圾,但是它的思想很先进,无状态的这个思想很重要。

    我们项目追求的就是无状态。

    官方文档:

    HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,

    简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名密码即可,

    但由于有把用户名密码暴露给第三方客户端的风险,在生产环境下被使用的越来越少。

    因此,在开发对外开放的RESTful API时,尽量避免采用HTTP BasicAuth。

    不建议使用,过时。

    说明一点:可能有的人不清楚有状态和无状态的区别:

    简单理解:

    有状态:就是你的服务器,要保存登录信息

    无状态:不用存

    因为这个不好用,后来就出了下面这个

    2:Cookie Auth (就是我们常用的cookie)

    它的逻辑是:要把登录的信息在浏览器端存到cookie中,服务器端存到session中。

    然后cookie和session能对上,就认为你是登录的。

    这种方式比前一个稍微有点复杂,服务端和客户端都存了用户的登录信息,得保存。

    而且它依赖于cookie。

    因为cookie我们知道它是个双刃剑。

    首先:cookie能帮我们简化很多操作,但随之而来的就是它不安全。

    其次:cookie还有另外一个不好的地方就是,他的局限性很强。

    就是它只局限于浏览器,像android和ios等其他移动端就不适用了。

    所以,这种cookie的认证方式,现在也不怎么用。

    尤其在分布式项目尤为不适用。

    官方文档:

    Cookie认证机制就是为一次请求认证在服务端创建一个Session对象,同时在客户端的浏览器端创建了一个Cookie对象;

    通过客户端带上来Cookie对象来与服务器端的session对象匹配来实现状态管理的。

    默认的,当我们关闭浏览器的时候,cookie会被删除。

    但可以通过修改cookie 的expire time使cookie在一定时间内有效。

    3:Oauth(第三方登录)

    这是一个第三方的。

    也不是有多适用。一般产品推广的时候,为了更多的获取流量获取用户,就用这种方式,

    直接或间接的使用qq或者微信的这个用户群。就可以很快的为新产品拉来很多用户。

    这个也是一种认证机制,但是他借助于第三方平台。

    官方文档:

    OAuth(开放授权)是一个开放的授权标准,

    允许用户让第三方应用访问该用户在某一web服务上存储的私密的资源(如照片,视频,联系人列表),

    而无需将用户名和密码提供给第三方应用。

    OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。

    每一个令牌授权一个特定的第三方系统(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。

    这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

    这种基于OAuth的认证机制适用于个人消费者类的互联网产品,

    如社交类APP等应用,但是不太适合拥有认证权限管理的企业应用。

    4:Token Auth(令牌)

    它的逻辑是:这个token令牌就相当于古代的尚方宝剑,不管谁拥有了它,哪怕你长的特别搓,我也认为你牛逼。

    因为见尚方宝剑,如同面见皇上,牛逼到不行,至高无上的权利。

    简单理解:只要用户一登录,服务器端就生成一个令牌。

    但是此时我服务器端不会保存这个令牌,将令牌返回给你,你自己想办法保存。

    用户想访问我的接口,拿上你的令牌就行了。

    那有的人就问了,你服务端不存,那我怎么知道这个令牌对不对呢?(令牌也有可能伪造啊)

    其实我们服务器端有一个算法,生成令牌的时候,就是靠这个算法来生成的。

    所以在验证的时候,服务器端也用这个算法来验证。

    那又有人问了,你用这个算法来验证和我之前用session验证有区别吗?

    其实区别就在于服务器端用算法来验证还是运行在Java虚拟机内部,并没有跨平台,而且速度快。

    但是在session中取的话,就算存在redis中也算是跨平台了,也需要耗费额外的资源。

    所以说,验证token的真假,就是用一个简单的算法,验证一下就行了。

    注意:

    token的生成里面,也需要加一个唯一的标识,一般就是公司的一个唯一标识,或者项目的标识,这个自己界定。

    官方文档:

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。

    大概的流程是这样的:

    1. 客户端使用用户名跟密码请求登录

    2. 服务端收到请求,去验证用户名与密码

    3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

    4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里

    5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

    6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

    最后在整理下token机制和cookie机制的优缺点?

    1:token支持跨域访问

    cookie是不支持跨域的,所以说token在分布式项目中有很好的作用。

    2:无状态

    Token机制在服务端不需要存储session信息,因为Token 自身包含了所有登录用户的信息,

    只需要在客户端的cookie或本地介质存储状态信息.

    服务器端没有存登录信息的这样一个压力,

    你存一两人好说啊,那我要存上亿个人,redis服务器就受不了了。

    3:更适用于移动应用:

    当你的客户端是一个原生平台(iOS, Android,Windows 8等)时,

    Cookie是不被支持的(你需要通过Cookie容器进行处理),这时采用Token认证机制就会简单得多。

    4:CSRF:

    因为不再依赖于Cookie,所以就不需要考虑对CSRF(跨站请求伪造)的防范。

    因为CSRF攻击就是利用cookie,具体怎么弄的,我也不是很清楚。

    5:性能:

    一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算的Token验证和解析要费时得多。

    其实这个性能也很好理解:

    之前从session中取信息,跟现在用一个算法去验证,那算法肯定要快啊。

    6:标准化

    一般API可以采用标准化的JSON Web Token (JWT)来实现,

    这个标准已经存在多个后端库(.NET, Ruby, Java,Python, PHP)和多家公司的支持(如:Firebase,Google, Microsoft)

    展开全文
  • Spring RestTemplate中几种常见的请求方式

    万次阅读 多人点赞 2017-09-11 11:57:19
    在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个...

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!


    Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,当时我们只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@LoadBalanced注解开启客户端负载均衡,RestTemplate的功能不可谓不强大,那么今天我们就来详细的看一下RestTemplate中几种常见请求方法的使用。


    本文是Spring Cloud系列的第六篇文章,了解前五篇文章的内容有助于更好的理解本文:

    1.使用Spring Cloud搭建服务注册中心
    2.使用Spring Cloud搭建高可用服务注册中心
    3.Spring Cloud中服务的发现与消费
    4.Eureka中的核心概念
    5.什么是客户端负载均衡


    本文主要从以下四个方面来看RestTemplate的使用:

    • GET请求
    • POST请求
    • PUT请求
    • DELETE请求

    OK,开始吧。

    环境搭建

    首先我们要搭建一个测试环境,方便我们一会验证相应的API。
    服务注册中心我就直接使用前文(使用Spring Cloud搭建服务注册中心)中创建的服务注册中心。
    服务提供者和服务消费者我创建在一个maven工程中,如果小伙伴对IntelliJ IDEA中创建maven多模块项目还不了解的话,可以参考IntelliJ IDEA中创建Web聚合项目(Maven多模块项目)。创建好的maven项目如下图所示:

    这里写图片描述

    其中commons是一个公共模块,是一个普通的JavaSE工程,我们一会主要将实体类写在这个模块中,provider和consumer是两个spring boot项目,provider将扮演服务提供者的角色,consumer扮演服务消费者的角色。

    commons模块主要用来提供实体类,内容如下:

    这里写图片描述

    然后在provider和consumer模块中添加对commons的依赖,依赖代码如下:

    <dependency>
        <groupId>org.sang</groupId>
        <artifactId>commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    

    provider和consumer的开发小伙伴们可以参考使用Spring Cloud搭建服务注册中心Spring Cloud中服务的发现与消费,我这里就不再赘述了。下文中我只列出provider和consumer的核心代码,文末可以下载源码。

    GET请求

    在RestTemplate中,发送一个GET请求,我们可以通过如下两种方式:

    第一种:getForEntity

    getForEntity方法的返回值是一个ResponseEntity<T>ResponseEntity<T>是Spring对HTTP请求响应的封装,包括了几个重要的元素,如响应码、contentType、contentLength、响应消息体等。比如下面一个例子:

    @RequestMapping("/gethello")
    public String getHello() {
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class);
        String body = responseEntity.getBody();
        HttpStatus statusCode = responseEntity.getStatusCode();
        int statusCodeValue = responseEntity.getStatusCodeValue();
        HttpHeaders headers = responseEntity.getHeaders();
        StringBuffer result = new StringBuffer();
        result.append("responseEntity.getBody():").append(body).append("<hr>")
                .append("responseEntity.getStatusCode():").append(statusCode).append("<hr>")
                .append("responseEntity.getStatusCodeValue():").append(statusCodeValue).append("<hr>")
                .append("responseEntity.getHeaders():").append(headers).append("<hr>");
        return result.toString();
    }
    

    关于这段代码,我说如下几点:

    • getForEntity的第一个参数为我要调用的服务的地址,这里我调用了服务提供者提供的/hello接口,注意这里是通过服务名调用而不是服务地址,如果写成服务地址就没法实现客户端负载均衡了。
    • getForEntity第二个参数String.class表示我希望返回的body类型是String
    • 拿到返回结果之后,将返回结果遍历打印出来

    最终显示结果如下:

    这里写图片描述

    有时候我在调用服务提供者提供的接口时,可能需要传递参数,有两种不同的方式,如下:

    @RequestMapping("/sayhello")
    public String sayHello() {
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={1}", String.class, "张三");
        return responseEntity.getBody();
    }
    @RequestMapping("/sayhello2")
    public String sayHello2() {
        Map<String, String> map = new HashMap<>();
        map.put("name", "李四");
        ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/sayhello?name={name}", String.class, map);
        return responseEntity.getBody();
    }
    
    • 可以用一个数字做占位符,最后是一个可变长度的参数,来一一替换前面的占位符
    • 也可以前面使用name={name}这种形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值

    第一个调用地址也可以是一个URI而不是字符串,这个时候我们构建一个URI即可,参数神马的都包含在URI中了,如下:

    @RequestMapping("/sayhello3")
    public String sayHello3() {
        UriComponents uriComponents = UriComponentsBuilder.fromUriString("http://HELLO-SERVICE/sayhello?name={name}").build().expand("王五").encode();
        URI uri = uriComponents.toUri();
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
        return responseEntity.getBody();
    }
    

    通过Spring中提供的UriComponents来构建Uri即可。

    当然,服务提供者不仅可以返回String,也可以返回一个自定义类型的对象,比如我的服务提供者中有如下方法:

    @RequestMapping(value = "/getbook1", method = RequestMethod.GET)
    public Book book1() {
        return new Book("三国演义", 90, "罗贯中", "花城出版社");
    }
    

    对于该方法我可以在服务消费者中通过如下方式来调用:

    @RequestMapping("/book1")
    public Book book1() {
        ResponseEntity<Book> responseEntity = restTemplate.getForEntity("http://HELLO-SERVICE/getbook1", Book.class);
        return responseEntity.getBody();
    }
    

    运行结果如下:

    这里写图片描述

    第二种:getForObject

    getForObject函数实际上是对getForEntity函数的进一步封装,如果你只关注返回的消息体的内容,对其他信息都不关注,此时可以使用getForObject,举一个简单的例子,如下:

    @RequestMapping("/book2")
    public Book book2() {
        Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
        return book;
    }
    

    getForObject也有几个重载方法,如下:

    这里写图片描述

    这几个重载方法参数的含义和getForEntity一致,我就不再赘述了。

    POST请求

    在RestTemplate中,POST请求可以通过如下三个方法来发起:

    第一种:postForEntity

    该方法和get请求中的getForEntity方法类似,如下例子:

    @RequestMapping("/book3")
    public Book book3() {
        Book book = new Book();
        book.setName("红楼梦");
        ResponseEntity<Book> responseEntity = restTemplate.postForEntity("http://HELLO-SERVICE/getbook2", book, Book.class);
        return responseEntity.getBody();
    }
    
    • 方法的第一参数表示要调用的服务的地址
    • 方法的第二个参数表示上传的参数
    • 方法的第三个参数表示返回的消息体的数据类型

    我这里创建了一个Book对象,这个Book对象只有name属性有值,将之传递到服务提供者那里去,服务提供者代码如下:

    @RequestMapping(value = "/getbook2", method = RequestMethod.POST)
    public Book book2(@RequestBody Book book) {
        System.out.println(book.getName());
        book.setPrice(33);
        book.setAuthor("曹雪芹");
        book.setPublisher("人民文学出版社");
        return book;
    }
    

    服务提供者接收到服务消费者传来的参数book,给其他属性设置上值再返回,调用结果如下:

    这里写图片描述

    postForEntity的其他重载方法如下:

    这里写图片描述

    这些方法的参数含义和getForEntity参数的含义一致,不再赘述。

    第二种:postForObject

    如果你只关注,返回的消息体,可以直接使用postForObject。用法和getForObject一致。

    第三种:postForLocation

    postForLocation也是提交新资源,提交成功之后,返回新资源的URI,postForLocation的参数和前面两种的参数基本一致,只不过该方法的返回值为Uri,这个只需要服务提供者返回一个Uri即可,该Uri表示新资源的位置。

    PUT请求

    在RestTemplate中,PUT请求可以通过put方法调用,put方法的参数和前面介绍的postForEntity方法的参数基本一致,只是put方法没有返回值而已。举一个简单的例子,如下:

    @RequestMapping("/put")
    public void put() {
        Book book = new Book();
        book.setName("红楼梦");
        restTemplate.put("http://HELLO-SERVICE/getbook3/{1}", book, 99);
    }
    

    book对象是我要提交的参数,最后的99用来替换前面的占位符{1}

    DELETE请求

    delete请求我们可以通过delete方法调用来实现,如下例子:

    @RequestMapping("/delete")
    public void delete() {
        restTemplate.delete("http://HELLO-SERVICE/getbook4/{1}", 100);
    }
    

    delete方法也有几个重载的方法,不过重载的参数和前面基本一致,不赘述。

    OK,以上就是我们对RestTemplate能够发送的请求的一个详细介绍,有问题欢迎留言讨论。

    本文案例地址:https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate

    更多JavaEE资料请关注公众号:

    这里写图片描述

    以上。

    展开全文
  • 所以除此之外,小编另多介绍一本地支付的收款方式,就是用各国家当地流行的支付工具进行收款,类似于中国人最常用的“支付宝”“微信支付”,如:俄罗斯电子钱包Webmoney、QiWi Wallet;德国的Sofortbanking;荷兰...

    在欧洲,许多外贸商家大多会选择PayPal和国际信用卡支付,但从安全角度来看,不管是PayPal还是信用卡都是会有拒付风险。所以除此之外,小编另多介绍一种本地支付的收款方式,就是用各国家当地流行的支付工具进行收款,类似于中国人最常用的“支付宝”“微信支付”,如:俄罗斯电子钱包Webmoney、QiWi Wallet;德国的Sofortbanking;荷兰的iDEAL等;

    这个方式已经逐渐普及,很多大的电商平台,例如速卖通、敦煌还是棒谷、兰亭集势都已经接入,一方面可以补充信用卡覆盖不到的那部分人群,提升成交率;另一方面本地支付不支持拒付,对商家来说安全性有所保障。

    1、PayPal
    在这里插入图片描述
    是目前全球最大的在线支付提供商,全球203个国家和地区拥有超过1.5亿用户,是跨国交易中最有效的付款方式。 任何人只要有一个电子邮件地址,都可以使用PayPal 在线发送和接收付款。支持信用卡,余额,外币银行卡,电子支票等主流的付款方式。但由于PayPal基于信用卡,会存在拒付的风险,增加了交易的不安全性;而且在信用卡覆盖率不高的国家,会损失部分的潜在客户。

    2、国际信用卡收款
    在这里插入图片描述
    国际信用卡收款是指通过第三方信用卡支付公司集成Visa、MasterCard、JCB、美国运通(American Express)等国际信用卡支付网关来收款。信用卡收款通道也有Chargeback风险且需预留10%保证金,收费较高昂,对于做外贸的门槛比较高,适合于有经济实力的人使用。

    3、Webmoney 俄罗斯—电子钱包
    在这里插入图片描述
    WebMoney是由成立于1998年的WebMoney Transfer Techology公司开发的一种在线电子商务支付系统,WebMoney可以在包括中国在内的全球70个国家使用, WebMoney提供安全性,转账需要手机短信验证,异地登录IP保护等多重保护功能,即时到账。

    案例:速卖通、敦煌网、棒谷、环球易购

    4、Qiwi俄罗斯—电子钱包
    在这里插入图片描述
    俄罗斯最大的支付服务商之一,创立于2007年,业务涉及亚、欧、美、非洲。每天有超过40万笔交易。Qiwi的成功之处在于结合了当地人偏爱使用现金消费的习惯和只有5%的消费者拥有银行账户的现状。用户可以通过Qiwi Wallet即刻支付购买产品,Qiwi wallet拥有较完善的风险保障机制,不会产生买家撤款。因此买家使用Qiwi wallet付款的订单,没有24小时的审核期限制,支付成功后卖家可立刻发货。

    案例:速卖通、敦煌网、环球易购、棒谷

    5、Sofortbanking德国—在线网银转账
    在这里插入图片描述
    SOFORT 成立于2005年,总部位于德国慕尼黑,Sofortbanking又被称作sofortüberweisung,是欧洲一种在线银行转账支付方式,支持德国,奥地利,比利时,荷兰,瑞士,波兰,英国以及意大利等国家的银行转账支付。Sofortbanking 通过集成各个国家的银行支付系统,为电子商务提供了一个便捷、安全、创新的在线支付解决方案。

    案例:速卖通、敦煌网、环球易购、棒谷、环球易购

    6、Giropay 德国—在线网银转账
    在这里插入图片描述
    Giropay是一种利用网银的网上付款方式,简单、快速且安全。Giropay可提供德国境内1500多家银行的在线支付,安全可靠。使用 Giropay 付款时,系统会通过安全连接定向到您在银行开设的网上银行帐户,然后您可使用 PIN 码登录并使用交易密码确认付款。Giropay 由 Postbank、Sparkassen-Finanzgruppe 和 Volksbanken-Raiffeisenbanken 联合成立。

    截至目前已有2100万的网银用户使用Giropay支付;数据显示有80%的德国网银终端用户使用Giropay。

    案例:速卖通、敦煌网、棒谷、环球易购

    7、EPS 奥地利—在线网银转账
    在这里插入图片描述
    2005年由奥地利几个主要银行共同建立,目前已有300多万终端用户,已成为当地最受欢迎的网上支付方式。

    EPS 电子支付是奥地利推出的一种新支付标准。EPS电子支付与奥地利银行的在线支付系统相连,可以提供便捷、安全的在线支付解决方案

    案例:速卖通、敦煌网、棒谷、环球易购

    8、iDEAL荷兰—在线网银转账
    在这里插入图片描述
    2005年荷兰的几大标志性银行一起提出并开发,iDEAL已经是荷兰最受欢迎的一种支付方式,在荷兰,超过1300万参与银行的客户使用iDEAL, 无需注册,使用iDEAL,用户只要拥有银行的账户便可以直接网上操作。

    案例:速卖通、敦煌网、环球易购、棒谷

    9、P24(Przelewy24) 波兰—在线网银转账
    在这里插入图片描述
    Przelewy24是波兰最普遍的网上支付方式,有超过95%的网银用户使用,用户可以简便安全地在互联网上进行交易。截至目前,Przelewy24已有35000个合作伙伴,覆盖超过25家当地银行、30多家金融机构,95%以上的波兰本地银行都支持Przelewy24支付。

    案例:速卖通、敦煌网

    10、Multibanco 葡萄牙—在线网银转账
    在这里插入图片描述
    Multibanco是葡萄牙本地的一种主流支付方式,付款形式可以是在线银行转账,也可以是线下ATM机转账,Multibanco它连接了葡萄牙27家银行总共12700台ATM机器,同时,它还有完整的EFTPOS网络,可以通过tele Multibanco和mbnet为移动电话和在线银行提供服务。

    这10种方法都列举出来,不过,小编根据自身的经验,建议商家在支付选择上,最好是兼容多种支付方式,不要把鸡蛋放在一个篮子里,现在很多商家都选择本地支付+信用卡的方式,一是给消费者更多的选择,二是当某种支付方式出问题的时候,消费者还可以继续尝试其他的支付方式进行支付。 三是减少拒付的风险,不至于钱被套牢。

    展开全文
  • 耦合的三种形式

    千次阅读 2019-06-14 10:20:50
    耦合的三种形式 不透明耦合, 部件A直接或通过代理B驱动部件C,部件A知道部件C的存在 单边透明耦合, 部件A驱动代理B,代理B驱动部件C,部件A不知道部件C的存在,部件C知道部件A的存在 双边透明耦合。 部件A...
  • 聊聊Kafka()Kafka消费者与消费

    千次阅读 2021-01-07 19:30:35
    Kafka消费者与消费组简介消费者概念入门消费者、消费组心跳机制消息接收必要参数配置订阅反序列化位移提交消费者位移管理再均衡避免重平衡消费者拦截器消费组管理什么是消费者组消费者位移(consumer position)位移...
  • 点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!问题分析导致kafka的重复消费问题...
  • 常见扫码支付方式

    千次阅读 2021-04-20 20:55:02
    1.扫码转账 支付流程 用户点击支付宝扫一扫,扫码商家事先准备好的二维码(收款码),识别出来后选择转账。 扫码分析 此扫码支付的本质其实还是转账,只是通过扫码的方式定位到... 参考文章常见的扫码支付方式详解
  • 三种分布式爬虫系统的架构方式

    千次阅读 2019-01-31 21:48:56
    分布式系统的核心在于通信,介绍三种分布式爬虫系统的架构思路,都是围绕通信开始,也就是说有多少分布式系统的通信方式就有多少分布式爬虫系统的架构思路。   Redis 利用redis做分布式系统,最经典的就是scrapy...
  • 消息队列的三种模式

    千次阅读 2017-12-13 13:34:32
    Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台...这两模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅) 1、定义 JMS规范目前支持两消息模型:点对点(point to poin
  • 常见的几消息中间件

    千次阅读 2020-05-15 14:41:20
    消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息...消息消费者,业务的处理方,负
  • 根据智能锁行业发展的情况,给大家介绍一下智能锁的8开门方式。 一、智能锁手机开门 现在的智能锁一般都可以通过手机远程开启。采用加密物联网卡传输数据,对信息安全严谨严苛,如忠犬般可靠。 ...
  • https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消费端去调用服务提供者的服务的时候,使用了一个很好用的对象,叫做RestTemplate,...
  • 微服务思想 ...微服务: 架构设计采用分布式思想,当服务器发生故障时,可以实现自动化的故障迁移.无需人为干预. ...ZK工作原理说明 Zookeeper集群中leader负责监控集群状态同步...当客户端(消费者)启动时,首先会链接注册中心
  • 常见的4线程池

    千次阅读 2018-08-12 23:00:51
    转载自:线程池 ... 线程的创建和销毁的开销是巨大的,而通过线程池的重用大大减少了这些不必要的开销,当然既然少了这么多消费内存的开销,其线程执行速度也是突飞猛进的提升。 2、控制线程池的...
  • Java--反射机制原理、几Class获取方式及应用场景

    万次阅读 多人点赞 2021-08-22 11:26:31
    1.1 反射原理1.2 举例说明二、Java反射机制中获取Class的三种方式及区别?2.1 三种方式及区别2.2 代码演示区别、Java反射机制的应用场景有哪些?3.1 应用场景3.2 应用场景实现3.2.1 简单工厂模式3.2.2 简单工厂...
  • 10种常见的移动端App广告展现形式

    万次阅读 2019-06-27 14:07:36
    何为App广告? App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第方应用程序内置广告,属于移动广告的子类别。 App广告兴起得益于其载体—App的风行。...对于App开发者,需要一种方式将...
  • 云服务的三种模式

    千次阅读 2020-05-19 10:20:29
    云服务的三种模式 IaaS(基础设施即服务)IaaS(Infrastructure as a Service), 即基础设施即服务。提供给消费者的服务是对所有计算基础设施的利用,包 括处理CPU、内存、存储、网络和其它基本的计算资源,用户...
  • 种常见加密算法

    万次阅读 2019-06-27 09:36:02
    其中一种方式就是使用Base64。 Base64特点 可逆 ,后一两位可能有“=”,生成的编码都是ascii字符。 优点 :速度快,ascii字符,肉眼不可理解 缺点 :编码比较长,非常容易被破解,仅适用于 加密非关键信息 的...
  • 由队列的监听消费者接收消息消费 在我的理解看来就是routing查询的一模糊匹配,就类似sql的模糊查询方式 24、RabbitMQ基本概念 1、 Broker: 简单来说就是消息队列服务器实体 2、 Exchange: 消息交换机,它指定...
  • 三种常见的API设计错误及解决方案

    万次阅读 2018-01-17 10:48:45
    原文:Three common API design mistakes and how to overcome them 作者:Jennifer Riggins ...作者在本文介绍了三种,也给出了相应的解决方案,不妨一起来看一下吧!以下为译文。 作为表单工具Typeform
  • 面渣逆袭:RocketMQ二十

    千次阅读 多人点赞 2022-04-06 19:57:05
    RocketMQ二十问,这下通透了!
  • 【MQ】常见的几消息队列及其特点

    千次阅读 2020-12-10 17:37:07
    常见的几消息队列及其特点 当前生产环境,使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。 1. ActiveMQ: ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且它一...
  • 种常见的消息中间件对比

    千次阅读 2019-02-20 10:18:00
    消费者采用Pull方式获取消息。消息有序,通过控制能够保证所有消息被消费且仅被消费一次; 有优秀的第方KafkaWeb管理界面Kafka-Manager; 在日志领域比较成熟,被多家公司和多个开源项目使用。 缺点 ...
  • 常见手机定位方式浅谈

    千次阅读 2017-01-07 10:44:04
    前段时间在知乎上回答了一个关于手机定位相关的问题,被...地理位置是一很隐私的信息,严重关系到个人的生命财产安全,当然一些设备也有很好的隐私保护政策,在未经用户允许的情况下,位置信息是不会被窃取的。但,现
  • 架构师职位常见面试题

    万次阅读 多人点赞 2019-06-06 11:04:29
    rocketmq一般是不会丢消息,所谓的rocketmq丢消息,有两种常见的原因,1、开发童鞋写的消费者代码逻辑有bug,比如,消费消息的代码逻辑有异常,却把异常吃掉了,且返回成功的状态,人为的导致丢消息。2、运维层面有...
  • 消息中间件学习总结(18)——MQ常见面试题总结

    千次阅读 多人点赞 2019-08-07 10:00:16
    一、为什么使用 MQ? 好的架构不是设计出来的,是演进出来的,使用 MQ 必定有其道理,是用来解决实际问题的。其实使用 MQ 的场景挺多的,但是比较核心...假设自己本地写库要 3ms,调用 BCD 个系统分别要 300ms、45...
  • 当服务消费端去调用服务提供者的服务的时候,已经封装了一个模板类,叫做RestTemplate,当时只使用了RestTemplate中最简单的一个功能getForEntity发起了一个get请求去调用服务端的数据,同时,我们还通过配置@...
  • 种常见的嵌入式操作系统

    万次阅读 多人点赞 2018-10-09 14:21:29
    μClinux是一优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植...
  • 理解云计算三种服务模式——IaaS、PaaS和SaaS

    万次阅读 多人点赞 2018-03-20 10:12:32
    云计算的服务模式仍在不断进化,但业界普遍接受将云计算按照服务的提供方式划分为个大类:SaaS(Software as a Service–软件即服务) PaaS(Platform as a Service–平台即服务) IaaS(Infrastructure as a ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,797
精华内容 39,118
关键字:

常见的三种消费方式