Architecture
文章平均质量分 91
carl-zhao
I never grew up, but i never stop growing.
展开
-
微服务链路追踪原理
在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而错失了止损的黄金时机。而链路追踪的出现正是为了解决这种问题,它可以在复杂的服务调用中定位问题,还可以在新人加入后台团队之后,让其清楚地知道自己所负责的服务在哪一环。除此之外,如果某个接口突然耗时增加,也不必再逐个服务查询耗时情况,我们可以直观地分析出服务的性能瓶颈,方便在流量激增的情况下精准合理地扩容。......转载 2022-08-17 10:39:55 · 393 阅读 · 0 评论 -
Spring 集成嵌入式数据库方便单元测试
``org.springframework.jdbc.datasource.embedded `` 包提供了对嵌入式 Java 数据库引擎的支持。本机提供了对HSQL、H2 和 Derby 的支持。还可以使用可扩展API插入新的嵌入式数据库类型和 DataSource 实现。嵌入式数据库在项目的开发阶段非常有用,因为它具有轻量级的特性。优点包括易于配置、快速启动时间、可测试性以及在开发期间快速演变SQL的能力。...原创 2022-07-30 10:23:30 · 798 阅读 · 0 评论 -
4、Nacos 配置中心源码解析之 服务端启动
上一篇文章中我们使用 ``-Dnacos.standalone=true``本地启动了 Nacos 服务器,并且可以在 ``http://localhost:8848/nacos`` 通过 ``nacos/nacos`` 用户名密码就可以访问 nacos 控制页面。下面我们就来大体看一下 Nacos 在启动的时候干了哪些核心的事。...原创 2022-07-22 08:26:49 · 1486 阅读 · 0 评论 -
支付系统 - 对账系统
在支付系统中,资金对账在对账中心进行,将系统保存的账务流水与银行返回的清算流水和清算文件进行对账,核对系统账务数据与银行清算数据的一致性,保证支付机构各备付金银行账户每日的预计发生额与实际发生额一致。...转载 2022-07-19 23:18:59 · 1210 阅读 · 0 评论 -
3、Nacos 配置中心源码解析之 项目结构
Nacos 的 github 地址为:https://github.com/alibaba/nacos/。以下分析基于: Nacos 版本号:。Nacos 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos提供四个主要功能。服务发现和服务运行状况检查Nacos简化了服务注册和通过DNS或HTTP接口发现其他服务的过程。Nacos还提供服务的实时运行状况检查,以防止向不健康的主机或服务实例发送请求。动态配置管理Dynamic Configuration Service允许您跨所原创 2022-07-13 23:41:23 · 584 阅读 · 0 评论 -
1、Nacos 配置中心源码解析之 Hello World
在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效。当应用程序实例比较少的时候还可以维护。如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本。.........原创 2022-07-13 00:06:31 · 629 阅读 · 0 评论 -
8、RocketMQ 源码解析之消息发送
当我们启动了元数据管理 NameServer 以及 消息管理 Broker。下面我们就可以进行消息发送了。RocketMQ 支持三种消息发送方式:同步消息发送(sync):当 Producer 发送消息到 Broker 时会同步等待消息处理结果异步消息发送(async):当 Producer 发送消息到 Broker 时会指定一个消息发送成功的回调函数,调用消息发送后立即返回不会阻塞。消息发送成功或者失败会在一个新的线程中进行处理。单向消息发送(oneway):当 Producer 发送消息到 Br原创 2022-05-04 00:10:03 · 886 阅读 · 0 评论 -
7、RocketMQ 源码解析之 Broker 启动(下)
在前面的一篇文章 -- [6、RocketMQ 源码解析之 Broker 启动(上),分析了一下 Broker 在启动的时候他自身做了哪些事,以及把 Broker 相关的信息注册到 NameServer 中去,下面我们就通过 Broker 把元信息注册到 NameServer 来了解一下 RocketMQ 是如何进行网络间通信的。原创 2022-04-03 20:48:48 · 817 阅读 · 0 评论 -
6、RocketMQ 源码解析之 Broker 启动(上)
上面一篇我们介绍了 RocketMQ 的元数据管理,它是通过自定义一个 KV 服务器。并且其它服务在 NameServer 注册服务信息的时候都是全量注册。如果 RocketMQ 的拓扑图当中有多台 NameServer 的时候,只要有一台存活的话 RocketMQ 集群就可以正常工作。当 RocketMQ 作为消息队列要向外提供服务的时候,除了需要第一步启动 NameServer 用来保存元数据,还需要启动 RocketMQ 的 Broker。这样才能 Producer 才能发现消息到 Broke原创 2022-04-02 14:06:34 · 2940 阅读 · 0 评论 -
1、Google Grpc 框架源码解析 之 Hello World
由于最近换了一份工作,新公司使用 RPC 框架使用的是 Google 开源的 RPC 框架 grpc。对于 grpc 之前只是听说过,在真实的项目当中并没有使用过。为了能够更好的使用 grpc (当遇到问题,能够快速发现并解决问题),所以准备写一个系列来研究 grpc 。gRPC是一个现代的开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内和跨数据中心的服务,支持负载均衡、跟踪、健康检查和身份验证。它也适用于分布式计算的最后一英里,将设备、移动应用程序和浏览器连接到后端原创 2022-02-26 18:49:08 · 955 阅读 · 2 评论 -
4、RocketMQ 源码解析之 网络通信 Netty
可以看到 RocketMQ 里面有消息发送方(Producer)、配置中心(NameServer)、消息存储中心(Broker) 以及消息消费方(Consumer)。而且它们之间也需要相互通信的,那么它们是怎么通信的呢?因为 RocketMQ 是通过 Java 语言编写的,对于网络通信它就选择了 Netty 并且通过自定义协议来完成各个角色之间的高效的网络通信。原创 2021-12-26 14:06:47 · 1067 阅读 · 0 评论 -
嵌套模板设计模式优雅解决通用调用第三方服务方案
最近公司正在服务化,因为公司是建筑行业的产业互联网。所以对于工人进出场考勤或者核心链路上都是需要用户进行证明“我是我”这个问题。那么就涉及到调用 ``实名认证``、``人脸比对``、``人脸质量``、``身份证OCR`` 等第三方服务。原创 2021-12-24 23:50:27 · 1115 阅读 · 0 评论 -
通过 MDC 让你方便的跟踪你的定时任务日志
当我们程序出现了 debug 的时候,我们一般的解决方法就是查看日志。在开发环境还好,我们本地启动服务一般只会有一个请求,查看日志或者本地 debug 都非常方便。但是如果我们是线上发生了问题,这个时候请求量就比较多。如果我们的调用链比较长的话,要把整个日志关联起来就不太方便。这个时候我们就需要使用到日志当中的 MDC 了。原创 2021-11-30 23:20:12 · 1416 阅读 · 0 评论 -
让定时任务 xxl job 里面的任务灵活起来
在项目当中使用定时任务进行业务补偿是一种很常见的需求。对于一个任务,我们常常把开始时间或者结束时间固定在代码里面。如果出现了定时任务漏掉了数据。比如:定时任务:查询 1 天前到当前系统时间遗漏的数据:在 3 天前有一些数据还没有执行完成如果你没有把开始时间设置成动态变量这个问题就无法解决。你可以通过把开始时间配置在注册中心当中,查询时间就是:3天前 ~ 系统当前时间。这个 SQL 的查询系统就比较低下了。还有一种方式就是开始时间与结束时间都设置成变量配置在注册中心当中,这样就可以动态定制你的任务原创 2021-06-30 21:11:15 · 1753 阅读 · 0 评论 -
Spring Boot 项目通过 Maven profiles 使用 -P 支持项目多环境配置打包
在我们进行项目开发的时候,都会把一些固定的值添加到配置文件当中进行集中管理。如果更近一步就是通过配置中心进行管理,但是配置中心的地址也是需要配置在项目中的配置文件当中的。一般在项目当中分为不同的环境,比如:local 环境:本地环境,一般是开发人员在本地进行开发测试的环境dev 环境:开发环境,外部用户无法访问,开发人员使用,版本变动很大。test 环境:测试环境,外部用户无法访问,专门给测试人员使用的,版本相对稳定。uat 环境:User Acceptance Test 用户验收测试,一般用于商原创 2021-05-09 19:53:11 · 1504 阅读 · 0 评论 -
二维码扫码登录是什么原理
转载地址:二维码扫码登录是什么原理前几天看了 极客时间一个二维码的视频,写的不错,这里总结下:在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二维码,防止上当受骗。二维码,大家再熟悉不过了购物扫个码,吃饭扫个码,坐公交也扫个码在扫码的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?更深度的用户还会考虑:我的系统是不是也可以搞一个转载 2021-05-08 22:49:05 · 521 阅读 · 0 评论 -
11、Eureka 源码解析 之 Eureka Server 覆盖状态
下面是官方提供的 Eureka 架构图:1、Eureka Server 覆盖状态概述在 InstanceInfo 服务应用信息对象里面不仅有状态status ,还有覆盖状态 overriddenStatus。InstanceInfopublic class InstanceInfo { // 服务应用信息状态 private volatile InstanceStatus status = InstanceStatus.UP; // 服务应用信息覆盖状态 private原创 2021-01-11 23:08:28 · 1013 阅读 · 0 评论 -
12、Eureka 源码解析 之 Eureka Client 增量拉取注册表
在之前的博客当中 6、Eureka 源码解析 之 Eureka Server 多级缓存 已经详细说明了在 Eureka Client 启动的时候会去 Eureka Server 里面全量的拉取一下注册到里面的服务信息列表。并且 Eureka Server 里面是使用了多级缓存来保存全量的注册信息列表。Eureka Client 在启动时获取 Eureka Server 中的注册信息,但是作为分布式环境服务随时时可进行上线、下线操作。所以作为注册中心它需要有服务自动上下线发现的功能。原创 2021-01-10 18:59:27 · 1035 阅读 · 0 评论 -
10、Eureka 源码解析 之 Eureka Server 自我保护机制
下面是官方提供的 Eureka 架构图:1、什么是自我保护机制默认情况下,如果Eureka Server在一定时间内(默认 90 秒,其实不止 90 秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。...原创 2021-01-07 22:20:41 · 1149 阅读 · 1 评论 -
9、Eureka 源码解析 之 Eureka Server 服务过期
下面是官方提供的 Eureka 架构图:1、Eureka Server 为什么要服务过期正常情况下,应用实例下线时候会主动向 Eureka-Server 发起下线请求,也就是我们之前分析的 – 8、Eureka 源码解析 之 Eureka Client 服务下线。但实际情况下,应用实例可能异常崩溃,又或者是网络异常等原因,导致下线请求无法被成功提交。这种情况之后,需要 Eureka Client 定时向 Eureka Server 发送续约配合 Eureka Client 通过定时任务清理超时的租约原创 2021-01-06 23:21:22 · 562 阅读 · 0 评论 -
8、Eureka 源码解析 之 Eureka Client 服务下线
下面是官方提供的 Eureka 架构图:1、Eureka Client 服务下线当 Eureka Client 服务关闭之前会调用 DiscoveryClient#shutdown 方法。因为这个方法上面标注了 @PreDestroy 在对象销毁之前这个方法就会被调用。 @PreDestroy @Override public synchronized void shutdown() { if (isShutdown.compareAndSet(false,原创 2021-01-06 12:59:29 · 617 阅读 · 1 评论 -
7、Eureka 源码解析 之 Eureka Client 续约
下面是官方提供的 Eureka 架构图:1、Eureka Client 续约机制在 Eureka Client 需要定时的向注册中心 Eureka Server 发送续约信息,告诉注册中心当前的微服务处于可用状态,这样注册中心在服务剔除的时候才不会把当前服务实例从注册表中删除。在 DiscoveryClient 进行初始化的时候,会调用 DiscoveryClient#initScheduledTasks 方法。在这个方向当中不仅会启动定时任务调用 CacheRefreshThread 线程定时从原创 2021-01-05 13:21:42 · 374 阅读 · 0 评论 -
6、Eureka 源码解析 之 Eureka Server 多级缓存
下面是官方提供的 Eureka 架构图:1、Eureka Client 全量拉取注册表在微服务中是嵌入了 Eureka Client 的,当服务启动的时候就会从 Eureka Server 中拉取注册的服务信息列表。在微服务中嵌入的 EurekaClient 的实现类 DiscoveryClient 在初始化的时候会通过调用 EurekaHttpClient 去 Eureka Server 拉取全量服务信息列表。在 DiscoveryClient#initScheduledTasks 会启动定原创 2021-01-04 22:14:56 · 660 阅读 · 0 评论 -
5、Eureka 源码解析 之 Eureka Client 服务注册流程
下面是官方提供的 Eureka 架构图:对于 Eureka 而言,微服务的提供者和消费者都是它的客户端,其中服务提供者关注服务注册、服务续约 和 服务下线等功能,而服务消费者关注于 服务信息的获取。下面我们来看一下 Eureka Client 的服务注册流程。1、Eureka Client 注册流程...原创 2020-12-30 13:20:41 · 621 阅读 · 0 评论 -
13、Nepxion Discovery 之 全链路调用链监控
在进行微服务调用的时候,为了系统的高可用性,不仅需要进行灰度发布验证服务的可用性。同时对于服务健康的监控也是很重要的一环。Nepxion Discovery 在这方面也有监控方面的集成,包含以下几个方面:蓝绿灰度埋点调用链监控全链路日志监控全链路指标监控1、蓝绿灰度埋点调用链监控1.1 蓝绿灰度埋点调用链监控关于 蓝绿灰度埋点调用链监控 官网描述得很清楚,它内置蓝绿灰度埋点,包括如下:1. n-d-service-group - 服务所属组或者应用2. n-d-service-type原创 2020-12-27 15:48:28 · 998 阅读 · 0 评论 -
4、Eureka 源码解析 之 Eureka Client 启动原理分析
在前面的一篇文章 3、Eureka 源码解析 之 Eureka Server 启动原理分析当中我们分析了一下 Eureka Server 的启动。在集群环境下 Eureka Server 相互之前需要同步注册表信息。所以不管是微服务当中还是 Eureka Server 当中都需要依赖 eureka-client 这个 Jar 包。它封装 Eureka Server 提供的 Restful 服务,依赖方可以以接口方法的方式方便的进行调用。下面是 Eureka 官网提供的系统架构图。在这个图中有以下几个角色原创 2020-12-27 12:09:32 · 539 阅读 · 1 评论 -
3、Eureka 源码解析 之 Eureka Server 启动原理分析
Eureka 是 Netflix 开源的一款注册中心,下面就是 eureka 的架构图。在这个图中有以下几个角色:Eureka Server:Eureka 服务器,它是注册中心提供接口给应用把服务实例的信息注册上来Eureka Client:Eureka 客户端,Eureka 包装好了微服务访问 Eureka 服务器的一系列接口。比如:注册,心跳,服务下线等。Application Server:微服务应用服务器,一个单体服务可以按照不同的领域拆分为多个微服务。微服务可以依赖 Eureka 客户原创 2020-12-24 23:02:19 · 485 阅读 · 1 评论 -
2、Eureka 源码解析 之 服务配置文件管理解析
Eureka 服务在进行配置管理的时候使用的是接口进行管理。对于 Eureka 服务它提供了很多自定义参数用于服务器上面的各种管理。其实对于 Eureka 来说:它即是一个服务器,因为它是一个注册中心,需要对外部微服务提供服务注册与服务发现;同时它又是一个 Client,因为对于分步式环境当中存在单点故障,为了解决这个功能 Eureka 提供了集群部署功能。那么不同的 Eureka 服务之间就面临微服务注册的注册表信息同步问题。所以 Eureka 也是一个 Eureka Client 它会拉取配置上面的其它原创 2020-12-22 23:08:00 · 507 阅读 · 0 评论 -
12、Nepxion Discovery 之 Discovery Agent 解决异步场景线程 ThreadLocal 上下文丢失问题
在进行微服务调用的时候,不管是服务之间(A 服务调用 B 服务)还是服务内部调用(服务 A 某个方法进行里有异步)都存在异步调用。但是 ``Nepxion Discovery`` 在进行参数传递的时候很多情况是使用的是基于 ``ThreadLocal``。原创 2020-12-21 00:28:19 · 1797 阅读 · 1 评论 -
11、Nepxion Discovery 之全链路界面操作蓝绿灰度发布
在之前的文章中讲过,用户可以通过 URL 请求以及配置中心进行灰度发布的操作,而且支持配置中心的灰度发布参数的动态变更。如果用户不希望使用上面的两种方式,Nepxion Discovery 框架还支持图形化进行灰度化配置。支持...原创 2020-12-18 22:45:22 · 1443 阅读 · 0 评论 -
1、Eureka 源码解析 之 调试环境搭建
Eureka ( 是一个基于 REST (Representational State Transfer)的服务,主要用于AWS云中定位服务,以实现中间层服务器的负载平衡和故障转移。在Netflix, Eureka 除了在中间层负载平衡中扮演关键角色外,还用于以下目的。帮助Netflix Asgard - 一个开源服务,使云部署更容易,在快速回滚版本,以防出现问题,避免重新启动100个实例,这可能会花费很长时间。在滚动推送中,为了避免在出现问题的情况下向所有情况传播新版本。对于我们的原创 2020-12-16 07:20:58 · 571 阅读 · 0 评论 -
10、Nepxion Discovery 之对网关和微服务三大模式的支持
``Nepxion Discovery`` 对于服务灰度发布参数支持:外置``Header``、 ``Parameter``、``Cookie``、``域名``规则策略驱动。并且还内置本地和远程、局部和全局规则策略驱动。并且还支持正则表达式以及通配表达式支持。并且``Nepxion Discovery``支持``Spring Cloud Gateway``、``Zuul网关``和``微服务``三大模式的灰度发布和路由等一系列功能。 所以``Nepxion Discovery`` 对于灰度发布的支持场景还是很原创 2020-12-13 13:40:18 · 1769 阅读 · 0 评论 -
9、Nepxion Discovery 之服务灰度发布参数的支持
``Nepxion Discovery`` 对于服务灰度发布参数支持:外置``Header``、 ``Parameter``、``Cookie``、``域名``规则策略驱动。并且还内置本地和远程、局部和全局规则策略驱动。并且还支持正则表达式以及通配表达式支持。并且``Nepxion Discovery``支持``Spring Cloud Gateway``、``Zuul网关``和``微服务``三大模式的灰度发布和路由等一系列功能。 所以``Nepxion Discovery`` 对于灰度发布的支持场景还是很原创 2020-12-10 23:47:56 · 1304 阅读 · 2 评论 -
8、Nepxion Discovery 之配置中心支持灰度配置
``Nepxion Discovery`` 对于服务灰度发布参数支持:外置``Header``、 ``Parameter``、``Cookie``、``域名``规则策略驱动。并且还内置本地和远程、局部和全局规则策略驱动。并且还支持正则表达式以及通配表达式支持。并且``Nepxion Discovery``支持``Spring Cloud Gateway``、``Zuul网关``和``微服务``三大模式的灰度发布和路由等一系列功能。 所以``Nepxion Discovery`` 对于灰度发布的支持场景还是很原创 2020-12-10 00:01:26 · 1992 阅读 · 1 评论 -
7、Nepxion Discovery 之 对 Spring Cloud 负载均衡扩展支持服务灰度发布
在之前的文章之中我们解析了一下 Spring Cloud 只需要在 ``RestTemplate`` 类型的 Spring Bean 上面添加一个 ``@LoadBalanced`` 注解,并且通过 ``RestTemplate`` 以 ``http://serviceId/访问路径`` 就可以访问真实服务的地址 ``http://lolcahost:端口/访问路径``。同样的 ``Nepxion Discovery`` 需要实现服务的灰度发布,也对 Spring Cloud 的负载均衡进行了扩展。原创 2020-12-08 08:53:58 · 1890 阅读 · 11 评论 -
6、Nepxion Discovery 之 Spring Cloud 负载均衡处理
在之前的文章中只是简单的讲解了一下 Nepxion Discovery 服务注册添加元数据到注册中心里面以及服务注册与发现 Listener 的扩展。其实在服务发现的时候 Nepxion Discovery 进行了自己的扩展才能做到通过 restful header 传入以及配置中心配置的灰度参数再获取到某个服务的列表的时候,才能够选择灰度合适的服务实例。要理解 Nepxion Discovery 框架是如何进行灰度服务中进行服务实例选择的,我们先来理解一下 Spring Cloud 是如何对负载均衡进行抽原创 2020-12-06 22:49:35 · 1025 阅读 · 1 评论 -
Spring Cloud Feign 记录单个服务耗时并解决 Hystrix 线程隔离模式
随着公司业务的增长,系统的调用量也越来越多。对于第三方公司的我们,如何提高系统的稳定性是摆在我们面前的一个问题。为了解决系统稳定性问题,决定把整个服务的日志通过日志跟踪号(traceNo) 以及一次调用链中每一个单个服务的调用时间打印到每个服务特定的目录中。 单个服务打印的数据运维会记录到 ES 里面,提供大盘给各个业务系统 owner 优化服务。分析这个需求,里面包含以下几个需求:解析上游传递过来的跟踪号,添加到 MDC 中记录整个日志,并且记录在当前服务当中调用的整个耗时把上游传递过来的跟踪号原创 2020-12-04 21:02:54 · 2040 阅读 · 12 评论 -
1、Nepxion Discovery:Spring Cloud灰度发布神器
原文地址:http://dockone.io/article/8149Nepxion Discovery是一款对Spring Cloud服务注册发现和负载均衡的增强中间件,其功能包括灰度发布(包括切换发布和平滑发布),黑/白名单的IP地址过滤,限制注册,限制发现等,支持Eureka、Consul和Zookeeper,支持Spring Cloud Api Gateway(Finchley版)、Zuul网关和微服务的灰度发布,支持用户自定义和编程灰度路由策略,支持多数据源的数据库灰度发布等客户特色化灰度发布,转载 2020-11-18 22:13:23 · 3992 阅读 · 2 评论 -
Spring Boot 中使用 MDC 追踪一次请求全过程
MDC 的全称是 Mapped Diagnostic Context,映射诊断上下文(MDC)。本质上是由日志框架维护的映射,其中应用程序代码提供键-值对,然后日志框架可以在日志消息中插入这些键-值对。MDC数据在过滤消息或触发某些操作方面也非常有用。管理开销。SLF4J支持MDC,即映射的诊断上下文。如果底层日志框架提供MDC功能,那么SLF4J将委托给底层框架的MDC。注意,此时,只有log4j和logback提供MDC功能。如果底层框架不提供MDC,例如java.util。日志记录后,SLF4J仍将原创 2020-10-31 22:16:13 · 11767 阅读 · 0 评论 -
通过 Spring Event 方式优雅的抽象策略模式解决 if else 问题
策略模式是设计模式中非常常用的一种设计模式。它对修改关闭,对扩展开放。而且通过策略模式还可以减少项目中一系列的 ``if else`` 代码块。常见的策略模式也很多种写法。比如:定义一个接口,接口有不同的实现,然后定义一个工厂,把这个接口的实现以对应不同的 Key 保存到这个工厂里面,然后通过传入不同的 key 从定义好的 Map 中获取到对应接口的实例,如果需要新添加策略就直接添加新的实现就可以了。原创 2020-09-26 00:08:36 · 831 阅读 · 0 评论