用户您好!请先登录!

分类目录技术空间

CAS的深度解析及在Java中的运用

CAS

CAS:Compare and Swap, 翻译成比较并交换。

java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。

CAS应用

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

非阻塞算法 (nonblocking algorithms)

一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。

现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。

拿出AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。

private volatile int value;

在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。

这样才获取变量的值的时候才能直接读取。

阅读更多

Java8中对ConcurrentHashMap的实现

jdk8对ConcurrentHashMap做了很大的调整,首先因为HashMap在jdk8已经做了数据结构上的优化,增加了红黑树。所以,jdk7针对ConcurrentHashMap的改进,主要是增加了分段锁Segment对HashEntity的控制,完美的解决了HashMap的安全问题,在JMM中有个名称叫安全发布,已经不适用了。

那么,在jdk8如果保持性能的情况下对其进行修改了?它到底做了那些事情呢?

1. Java8中 ConcurrentHashMap的结构

我们将数组称之为表,将数组中每个链表或红黑树称之为桶,将数组中的每个结点称之为槽,也就是说“槽”存储了链表的头结点或者红黑树的根结点。源代码中用内部类Node表示链表中的每个结点。

阅读更多

知识图谱在美团智能场景下的应用与实践

导读:目前为止 IT 产业经历了六次浪潮,分别为:大型机时代,小型机时代,个人电脑时代,桌面互联网时代,移动互联网时代和 AIOT 时代。在这些时代背后可以发现是人机交互方式的变化:从鼠键交互,到触控交互,再到语音智能交互,可以看到人机交互的方式在向更自然更直接化的方式演进。今天会和大家分享基于知识图谱的问答在美团智能交互场景中的应用和演进。

今天的介绍会围绕下面三点展开:

  • 智能交互背景介绍
  • 受限场景问答应用和演进
  • 复杂场景问答应用和演进

智能交互背景介绍

1. 智能交互的划分

知识图谱在美团智能场景下的应用于实践

智能交互的划分基本上是根据人类需求拆分:

  • 检索式交互—信息获取,比较经典的方法 FAQ:QA 匹配,QQ 匹配;
  • 任务式交互—执行任务,比如订机票 ( 酒店 ) 的特定任务;
  • 闲聊式交互—娱乐与休闲,基于深度学习的端到端的学习系统。

阅读更多

Google Container Tools: Skaffold

Skaffold is a command line tool that facilitates continuous development for Kubernetes applications. You can iterate on your application source code locally then deploy to local or remote Kubernetes clusters. Skaffold handles the workflow for building, pushing and deploying your application. It also provides building blocks and describe customizations for a CI/CD pipeline.

20个月测试,40次迭代,这款谷歌Kubernetes自动化开源工具通用了

Features

  • Fast local Kubernetes Development
    • optimized source-to-k8s – Skaffold detects changes in your source code and handles the pipeline to buildpush, and deploy your application automatically with policy based image tagging and highly optimized, fast local workflows
    • continuous feedback – Skaffold automatically manages logging and port-forwarding
  • Skaffold projects work everywhere
    • share with other developers – Skaffold is the easiest way to share your project with the world: git clone and skaffold run
    • context aware – use Skaffold profiles, user level config, environment variables and flags to describe differences in environments
    • CI/CD building blocks – use skaffold run end-to-end or just part of skaffold stages from build to deployment in your CI/CD system
  • skaffold.yaml – a single pluggable, declarative configuration for your project
    • skaffold init – Skaffold discovers your files and generates its own config file
    • multi-component apps – Skaffold supports applications consisting of multiple components
    • bring your own tools – Skaffold has a pluggable architecture to allow for different implementations of the stages
  • Lightweight
    • client-side only – Skaffold does not require maintaining a cluster-side component, so there is no overhead or maintenance burden to your cluster.
    • minimal pipeline – Skaffold provides an opinionated, minimal pipeline to keep things simple

Installing Skaffold

Stable binary

For the latest stable release download and place it in your PATH:

https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64

Run these commands to download and place the binary in your /usr/local/bin folder:

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin

Latest bleeding edge binary

For the latest bleeding edge build, download and place it in your PATH:

https://storage.googleapis.com/skaffold/builds/latest/skaffold-linux-amd64

Run these commands to download and place the binary in your /usr/local/bin folder:

curl -Lo skaffold https://storage.googleapis.com/skaffold/builds/latest/skaffold-linux-amd64
chmod +x skaffold
sudo mv skaffold /usr/local/bin

 

A Glance at Skaffold Workflow and Architecture

Skaffold simplifies your development workflow by organizing common development stages into one simple command. Every time you run skaffold dev, the system

  1. Collects and watches your source code for changes
  2. Syncs files directly to pods if user marks them as syncable
  3. Builds artifacts from the source code
  4. Tests the built artifacts using container-structure-tests
  5. Tags the artifacts
  6. Pushes the artifacts
  7. Deploys the artifacts
  8. Monitors the deployed artifacts
  9. Cleans up deployed artifacts on exit (Ctrl+C)

What’s more, the pluggable architecture is central to Skaffold’s design, allowing you to use the tool you prefer in each stage. Also, Skaffold’s profiles feature grants you the freedom to switch tools as you see fit depending on the context.

For example, if you are coding on a local machine, you can configure Skaffold to build artifacts with local Docker daemon and deploy them to minikube using kubectl, the Kubernetes command-line interface and when you finalize your design, you can switch to the production profile and start building with Google Cloud Build and deploy with Helm.

Skaffold supports the following tools:

  • Build
    • Dockerfile locally
    • Dockerfile in-cluster (kaniko)
    • Dockerfile on cloud (Google Cloud Build)
    • Bazel locally
    • Jib Maven/Gradle locally
  • Test
    • with container-structure-test
  • Tag
    • tag by git commit
    • tag by current date&time
    • tag by environment variables based template
  • Push
    • don’t push – keep the image on the local daemon
    • push to registry
  • Deploy
    • Kubernetes Command-Line Interface (kubectl)
    • Helm
    • kustomize

architecture

Besides the above steps, skaffold also automatically manages the following utilities for you:

  • forwards container ports to your local machine using kubectl port-forward
  • aggregates all the logs from the deployed pods

Documentation

Documentation for latest release: https://skaffold.dev

Documentation for latest build: https://skaffold-latest.firebaseapp.com

 

饿了么推荐系统的0到1

随着移动互联网的发展,用户使用习惯日趋碎片化,如何让用户在有限的访问时间里找到想要的产品,成为了搜索/推荐系统演进的重要职责。作为外卖领域的独角兽, 饿了么拥有百万级的日活跃用户,如何利用数据挖掘/机器学习的方法挖掘潜在用户、增加用户粘性,已成为迫切需要解决的问题。

个性化推荐系统通过研究用户的兴趣偏好,进行个性化计算,发现用户的兴趣点,从而引导用户发现自己的信息需求。一个好的推荐系统不仅能为用户提供个性化的服务,还能和用户之间建立密切关系,让用户对推荐产生依赖。

本次分享介绍饿 了么如何从0到1构建一个可快速迭代的推荐系统,从产品形态出发,包括推荐模型与特征工程、日志处理与效果评估,以及更深层次的场景选择和意图识别

在携程个性化推荐与人工智能meetup上,已经就以上几部分做了整体上的说明,本文将就其中模型排序与特征计算的线上实现做具体说明,同时补充有关业务规则相关的洗牌逻辑说明,力图从细节上还原和展示饿了么美食推荐系统。

一、模型排序

1.设计流程

对于任何一个外部请求, 系统都会构建一个QueryInfo(查询请求), 同时从各种数据源提取UserInfo(用户信息)、ShopInfo(商户信息)、FoodInfo(食物信息)以及ABTest配置信息等, 然后调用Ranker排序。以下是排序的基本流程(如下图所示):

  • 调取RankerManager, 初始化排序器Ranker:
  • 根据ABTest配置信息, 构建排序器Ranker;
  • 调取ScorerManger, 指定所需打分器Scorer(可以多个); 同时, Scorer会从ModelManager获取对应Model, 并校验;
  • 调取FeatureManager, 指定及校验Scorer所需特征Features。
  • 调取InstanceBuilder, 汇总所有打分器Scorer的特征, 计算对应排序项EntityInfo(餐厅/食物)排序所需特征Features;
  • 对EntityInfo进行打分, 并按需对Records进行排序。
饿了么推荐系统:从0到1(天天外卖,你可不知道的程序里面原理)

阅读更多

HBase架构简析

物理上,Hbase 是由三种类型的 server 组成的的主从式(master-slave)架构:

  • Region Server,负责处理数据的读写请求,客户端请求数据时直接和 Region Server 交互。
  • HBase Master,负责 Region 的分配,DDL(创建,删除 table)等操作。
  • Zookeeper,作为 HDFS 的一部分,负责维护集群状态。

当然底层的存储都是基于 Hadoop HDFS 的:

  • Hadoop DataNode 负责存储 Region Server 所管理的数据。所有的 HBase 数据都存储在 HDFS 文件中。Region Server 和 HDFS DataNode 往往是分布在一起的,这样 Region Server 就能够实现数据本地化(data locality,即将数据放在离需要者尽可能近的地方)。HBase 的数据在写的时候是本地的,但是当 region 被迁移的时候,数据就可能不再满足本地性了,直到完成 compaction,才能又恢复到本地。
  • Hadoop NameNode 维护了所有 HDFS 物理 data block 的元信息。
这可能是最容易理解的Hbase架构全解,10分钟学会,建议收藏

阅读更多

浏览器的工作原理

0. 序言

这是一篇全面介绍 WebKit 和 Gecko 内部操作的入门文章,是以色列开发人员塔利·加希尔大量研究的成果。在过去的几年中,她查阅了所有公开发布的关于浏览器内部机制的数据,并花了很多时间来研读网络浏览器的源代码。她写道:

“在 IE 占据 90% 市场份额的年代,我们除了把浏览器当成一个“黑箱”,什么也做不了。但是现在,开放源代码的浏览器拥有了过半的市场份额,因此,是时候来揭开神秘的面纱,一探网络浏览器的内幕了。呃,里面只有数以百万行计的 C++ 代码…”

塔利在她的网站上公布了自己的研究成果,但是我们觉得它值得让更多的人来了解,所以我们在此重新整理并公布。

 

作为一名网络开发人员,学习浏览器的内部工作原理将有助于您作出更明智的决策,并理解那些最佳开发实践的个中缘由。尽管这是一篇相当长的文档,但是我们建议您花些时间来仔细阅读;读完之后,您肯定会觉得所费不虚。保罗·爱丽诗 (Paul Irish),Chrome 浏览器开发人员事务部

阅读更多

如何实现一个RPC框架

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。现在业界有很多开源的优秀 RPC 框架,例如 Spring Cloud、Dubbo、Thrift 等。

RPC 起源

RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 “Implementing Remote Procedure Calls” 中他提到了几点:

  • 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
  • 高效:过程调用看起来十分简单而且高效。
  • 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。

阅读更多

Dubbo服务调用过程代码分析

1. 简介

Dubbo 服务调用过程比较复杂,包含众多步骤,比如发送请求、编解码、服务降级、过滤器链处理、序列化、线程派发以及响应请求等步骤。限于篇幅原因,本篇文章无法对所有的步骤一一进行分析。本篇文章将会重点分析请求的发送与接收、编解码、线程派发以及响应的发送与接收等过程,至于服务降级、过滤器链和序列化大家自行进行分析,也可以将其当成一个黑盒,暂时忽略也没关系。

2. 源码分析

在进行源码分析之前,我们先来通过一张图了解 Dubbo 服务调用过程。

首先服务消费者通过代理对象 Proxy 发起远程调用,接着通过网络客户端 Client 将编码后的请求发送给服务提供方的网络层上,也就是 Server。Server 在收到请求后,首先要做的事情是对数据包进行解码。然后将解码后的请求发送至分发器 Dispatcher,再由分发器将请求派发到指定的线程池上,最后由线程池调用具体的服务。

阅读更多

Dubbo Load Balance代码分析

1. 简介

LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载“均摊”到不同的机器上。避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况。通过负载均衡,可以让每台服务器获取到适合自己处理能力的负载。在为高负载服务器分流的同时,还可以避免资源浪费,一举两得。

负载均衡可分为软件负载均衡和硬件负载均衡。在我们日常开发中,一般很难接触到硬件负载均衡。但软件负载均衡还是可以接触到的,比如 Nginx。在 Dubbo 中,也有负载均衡的概念和相应的实现。Dubbo 需要对服务消费者的调用请求进行分配,避免少数服务提供者负载过大。服务提供者负载过大,会导致部分请求超时。因此将负载均衡到每个服务提供者上,是非常必要的。

Dubbo 提供了4种负载均衡实现,分别是基于权重随机算法的 RandomLoadBalance、基于最少活跃调用数算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加权轮询算法的 RoundRobinLoadBalance。这几个负载均衡算法代码不是很长,但是想看懂也不是很容易,需要大家对这几个算法的原理有一定了解才行。如果不是很了解,也没不用太担心。我们会在分析每个算法的源码之前,对算法原理进行简单的讲解,帮助大家建立初步的印象。

阅读更多

JVM CPU Profiler技术原理

研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程序运行行为和性能瓶颈。Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段,常用的JVM Profiler可以从多个方面对程序进行动态分析,如CPU、Memory、Thread、Classes、GC等,其中CPU Profiling的应用最为广泛。CPU Profiling经常被用于分析代码的执行热点,如“哪个方法占用CPU的执行时间最长”、“每个方法占用CPU的比例是多少”等等,通过CPU Profiling得到上述相关信息后,研发人员就可以轻松针对热点瓶颈进行分析和性能优化,进而突破性能瓶颈,大幅提升系统的吞吐量。

本文介绍了JVM平台上CPU Profiler的实现原理,希望能帮助读者在使用类似工具的同时也能清楚其内部的技术实现。

CPU Profiler简介

社区实现的JVM Profiler很多,比如已经商用且功能强大的JProfiler,也有免费开源的产品,如JVM-Profiler,功能各有所长。我们日常使用的Intellij IDEA最新版内部也集成了一个简单好用的Profiler,详细的介绍参见官方Blog

阅读更多

动态演示Raft分布式一致性协议

Raft作为一种比较好理解的分布式一致性算法(相对于paxos来说,其实要理解还是有点难度的!),是通过选举机制,日志复制来保证发布式系统数据的一致性。

相对于Paxos算法,Raft引入主节点,通过竞选。其中节点类型:

  • Follower
  • Candidate
  • Leader

Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。

1. 无Leader阶段(系统初始阶段)

流程:

① 下图表示一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。

阅读更多

Dubbo Cluster代码分析

1. 简介

为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。

为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。

Dubbo 提供了多种集群实现,包含但不限于 Failover Cluster、Failfast Cluster 和 Failsafe Cluster 等。每种集群实现类的用途不同,接下来会一一进行分析。

阅读更多

Dubbo – 框架设计

整体设计

Dubbo整体框架可以参考下图

/dev-guide/images/dubbo-framework.jpg

图例说明:

  • 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
  • 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
  • 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
  • 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。

阅读更多

Dubbo SPI 代码分析

1. 简介

SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。

在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。如果大家想要学习 Dubbo 的源码,SPI 机制务必弄懂。接下来,我们先来了解一下 Java SPI 与 Dubbo SPI 的用法,然后再来分析 Dubbo SPI 的源码。

需要特别说明的是,本篇文章以及本系列其他文章所分析的源码版本均为 dubbo-2.6.4。因此大家在阅读文章的过程中,需注意将代码版本切换到 dubbo-2.6.4 tag 上。

阅读更多

Java 动态调试技术原理及实践

1. 动态调试要解决的问题

断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径。但断点调试会在断点位置停顿,使得整个应用停止响应。在线上停顿应用是致命的,动态调试技术给了我们创造新的调试模式的想象空间。

本文将研究Java语言中的动态调试技术,首先概括Java动态调试所涉及的技术基础,接着介绍我们在Java动态调试领域的思考及实践,通过结合实际业务场景,设计并实现了一种具备动态性的断点调试工具Java-debug-tool,显著提高了故障排查效率。

图21 JPDA

阅读更多

蚂蚁金服万级规模 K8s 集群管理系统如何设计

Kubernetes 以其超前的设计理念和优秀的技术架构,在容器编排领域拔得头筹。越来越多的公司开始在生产环境部署实践 Kubernetes,在阿里巴巴和蚂蚁金服 Kubernetes 已被大规模用于生产环境。Kubernetes 的出现使得广大开发同学也能运维复杂的分布式系统,它大幅降低了容器化应用部署的门槛,但运维和管理一个生产级的高可用 Kubernetes 集群仍十分困难。本文将分享蚂蚁金服是如何有效可靠地管理大规模 Kubernetes 集群的,并会详细介绍集群管理系统核心组件的设计。

系统概览

Kubernetes 集群管理系统需要具备便捷的集群生命周期管理能力,完成集群的创建、升级和工作节点的管理。在大规模场景下,集群变更的可控性直接关系到集群的稳定性,因此管理系统可监控、可灰度、可回滚的能力是系统设计的重点之一。除此之外,超大规模集群中,节点数量已经达到 10K 量级,节点硬件故障、组件异常等问题会常态出现。面向大规模集群的管理系统在设计之初就需要充分考虑这些异常场景,并能够从这些异常场景中自恢复。

阅读更多

分布式系统架构与实施要点

1. 设计策略

1.1 网关模式,Gateway

功能

  • 请求路由,客户端直接调用 Gateway,Gateway 负责路由转发到注册服务上
  • 服务注册,后端服务将 API 注册,Gateway 负责路由
  • 负载均衡,支持多种负载策略
    • round robin
    • 随机均衡算法
    • 多权重负载
    • session 粘连
    • 其它
  • 安全特性,支持 HTTPS,账户鉴权,及其它安全特性支持
  • 灰度发布,可以针对服务版本或者租户等特性做灰度发布
  • API 聚合,将多个后端接口聚合,减少客户端调用次数
  • API 编排,通过编排来串接多个 API 完成特定业务

设计要点

  • 可用性,必须保证高可用
  • 扩展性,可以灵活扩展以支持特定业务比如特定业务流控
  • 高性能,通常使用异步 IO 模型框架实现,比如 Java netty,Go Channel
  • 安全,如加密通信,鉴权,DDOS 防御等
  • 运维
    • 应用监控,包括容量,性能,异常检测等
    • 弹性伸缩,具备高弹性能力,以低成本应对高峰值
  • 架构
    • 与业务解耦合,提供扩展扩展机制比如 Plugin,Serverless 的思路支持后端业务
    • 服务隔离,可以按照后端服务划分网关,做到不同服务使用不同网关
    • 网关部署靠近后端,保证网络损耗最小,性能最佳

阅读更多

浅析阿里云API网关的产品架构和常见应用场景

什么是API网关

API 网关提供完整的 API 托管服务,辅助用户将能力、服务、数据以 API 的形式开放给合作伙伴,也可以发布到 API 市场供更多的开发者采购使用。

  1. 提供防攻击、防重放、请求加密、身份认证、权限管理、流量控制等多重手段保证 API 安全,降低 API 开放风险。
  2. 提供 API 定义、测试、发布、下线等全生命周期管理,并生成 SDK、API 说明文档,提升 API 管理、迭代的效率。
  3. 提供便捷的监控、报警、分析、API 市场等运维、运营工具,降低 API 运营、维护成本。
    API网关技术解读稿(改)713.png

API托管服务: 为企业与开发者提供低成本、高可用、安全、便捷、易于管理的 API 开发能力。

在 API 的市场里,日均调用次数已经超过1.2亿次,基于此背景,阿里云全新探索了云市场能力中心,建立 API 生态,为企业客户和伙伴提供 API 购买和 API 变现一站式解决方案。API 网关将能力的复用率最大化,让企业之间能够互相借力,企业发展能够专注自身业务,实现共赢。

阅读更多

隐藏在Arthas和CAT背后的动态代理技术

了解Spring中AOP的人都知道,其AOP实现原理是基于Java动态代理和CGLIB代理两种方式实现的,其实Java语言中除了上述两种外,还有其它三种实现技术,也是它们支撑着Arthas和CAT的底层核心原理:

  • 静态代理,工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。
  • 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxyInstance动态构建全新的代理类(继承Proxy类,并持有InvocationHandler接口引用 )字节码文件并实例化对象返回。(jdk动态代理是由java内部的反射机制来实例化代理对象,并代理的调用委托类方法)
  • 基于CGlib 动态代理模式 基于继承被代理类生成代理子类,不用实现接口。只需要被代理类是非final 类即可。(cglib动态代理底层是借助asm字节码技术
  • 基于 Aspectj 实现动态代理(修改目标类的字节,织入代理的字节,在程序编译的时候 插入动态代理的字节码,不会生成全新的Class )
  • 基于 instrumentation 实现动态代理(修改目标类的字节码、类装载的时候动态拦截去修改,基于javaagent) -javaagent:spring-instrument-4.3.8.RELEASE.jar (类装载的时候 插入动态代理的字节码,不会生成全新的Class )

阅读更多

什么是Serverless架构?

Serverless(无服务器架构)是指服务端逻辑由开发者实现,运行在无状态的计算容器中,由事件触发,完全被第三方管理,其业务层面的状态则存储在数据库或其他介质中。

Serverless 是云原生技术发展的高级阶段,可以使开发者更聚焦在业务逻辑,而减少对基础设施的关注。

Serverless 在云原生技术中的地位

下图来自谷歌云平台官网,是对云计算的一个很好的分层概括,其中 serverless 就是构建在虚拟机和容器之上的一层,与应用本身的关系更加密切。

阅读更多

基于Istio的灰度发布测试

灰度发布(又名金丝雀发布)介绍

当应用上线以后,运维面临的一大挑战是如何能够在不影响已上线业务的情况下进行升级。做过产品的同学都清楚,不管在发布前做过多么完备的自动化和人工测试,在发布后都会出现或多或少的故障。根据墨菲定律,可能会出错的版本发布一定会出错。

“ANYTHING THAN CAN GO WRONG WILL GO WRONG”

—— MURPHY’S LAW

因此我们不能寄希望于在线下测试时发现所有潜在故障。在无法百分百避免版本升级故障的情况下,需要通过一种方式进行可控的版本发布,把故障影响控制在可以接受的范围内,并可以快速回退。

可以通过灰度发布(又名金丝雀发布)来实现业务从老版本到新版本的平滑过渡,并避免升级过程中出现的问题对用户造成的影响。

阅读更多

推荐系统基础知识

本文主要包括推荐系统的相关概念、推荐系统的架构和流程、常见的推荐算法、挖掘、召回、排序、评估和总结这几部分。

概念部分会简述推荐系统相关的理论知识,架构和流程主要是介绍推荐系统的通用架构和常规的推荐流程。

算法部分主要是一些常见的推荐算法介绍,挖掘》召回》排序主要是基于推荐流程的详细展开。

评估部分指的是如何评估一个推荐系统的好坏,总结部分主要是整体内容的回顾,以及一个真实推荐系统的案例。

1. 相关概念

1.1. 什么是推荐系统

先来看下Wiki的定义:

一种信息过滤系统,用来预测用户对物品的行为和偏好。

按照字面意思理解下来,就是帮助过滤信息,预测用户对物品的行为和偏好。

在今日头条曹欢欢博士的一次分享中提到了这样一个定义:

资讯推荐系统本质上要解决用户,资讯和环境的匹配,y=F(Xi,Xu,Xc)

感觉把这个定义延伸到其他推荐系统上也是成立的,那就是推荐系统本质上要解决用户,物品和环境的匹配问题,帮助建立用户和物品之间的连接。

回到定义本身,理论上说能实现这个功能的系统都可以称之为推荐系统。

阅读更多


1 2 3 4 5 6 7 8 9 10 11 12 13