文章 62
浏览 15135
自研网关day08-高可用

自研网关day08-高可用

高可用技术方案 首先,我们来看看,什么叫高可用,高可用(High availability,即 HA)的主要目的是为了保障「业务的连续性」,即在用户眼里,业务永远是正常(或者说基本正常)对外提供服务的。高可用主要是针对架构而言,那么要做好高可用,就要首先设计好架构, 第一步我们一般会采用分层的思想将一个庞大的 IT 系统拆分成为应用层,中间件,数据存储层等独立的层,每一层再拆分成为更细粒度的组件, 第二步就是让每个组件对外提供服务,毕竟每个组件都不是孤立存在的,都需要互相协作,对外提供服务才有意义。要保证架构的高可用,就要保证架构中所有组件以及其对外暴露服务都要做高可用设计,任何一个组件或其服务没做高可用,都意味着系统存在风险。 那么这么多组件该怎么做高可用设计呢,其实任何组件要做高可用,都离不开「冗余」和「自动故障转移」,众所周知单点是高可用的大敌,所以组件一般是以集群(至少两台机器)的形式存在的,这样只要某台机器出现问题,集群中的其他机器就可以随时顶替,这就是「冗余」。简单计算一下,假设一台机器的可用性为 90%,则两台机器组成的集群可用性为 1-0.1*0.1 = 99%,所以....

自研网关day07-实现过滤器链

自研网关day07-实现过滤器链

过滤器类型 按照作用区域划分,它可以划分为全局过滤以及局部过滤器 全局过滤器的作用是处理一切进入网关的请求和微服务响应,与 GatewayFilter 的作用一样。 区别在于 GatewayFilter 通过配置定义,处理逻辑是固定的;而 GlobalFilter 的逻辑需要自己写代码实现。 Gateway 内部有一个接口 名为 GlobalFilter,这个就是 Gateway 的全局过滤器接口,只要在应用中实现此接口后注册为 Spring 的 Bean,它就会就会帮我们将这个实现注册到全局过滤器链条里边去。 在执行路由过滤器的前面可以有多个过滤器,最后一个一定是路由过滤器,有且只有一个,然后开启一个异步的线程去对下游服务发起请求下游服务响应之后,直接调用 ctx.writeAndFlush 方法写回数据;如果中间出现任何异常,都进行执行异常逻辑,直接调用 ctx.writeAndFlush 方法写回数据最后最后执行一系列回调函数,这个我们也可以组成一个过滤器链条 **由此可见,当请求经过网关转发路由到下游服务器的时候,需要经过一系列网关过滤器,最终成功校验才会放行到开启异步线程访问....

自研网关06 -实现负载均衡策略

自研网关06 -实现负载均衡策略

nacos 注册中心一个服务,会存在多个实例,这时候网关就不是很清楚最终需要向那个实例节点发送请求,所以需要一个负载均衡测试算法 通过工厂 + 策略模式 当网关执行请求的时候,从自己的注册器,本地缓存获取到了 nacos 的服务元数据信息,一个服务存在多个节点的时候,根据客户端 SDK 服务自己配置的策略方式,进行均衡 BalanceType balanceType = BalanceType.valueOf(serviceDefinition.getRobinType()); Set<ServiceInstance> serviceInstances = instance.getServiceInstanceByUniqueId(gateWayRequest.getUniqueId(), false); ServiceInstance serviceInstance = BalanceManger.getInstance().getIBalance(balanceType, new ArrayList<>(serviceInstances)).select()....

自研网关05-接入nacos服务注册和客户端集成

自研网关05-接入nacos服务注册和客户端集成

nacos 核心特性 服务注册及其元数据管理 Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据 服务发现和服务健康监测 Nacos 支持基于 DNS 和基于 RPC 的服务发现 Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求 动态配置服务 动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置 bootStrap 集成注册中心 当网关 bootstrap 启动的时候,需要收集 nacos 的服务注册中心相关客户端元数据配置,放在本地缓存 map,进行后续的网关路由等等操作,所以需要从注册中心 poll 操作,并且也需要将自己注册到服务中心 实现集成 nacos 服务注册中心 接口类图 通过该接口主要是控制客户端注册到 nacos 服务,以及相关初始化工作,注销等相关的生命周期活动,其中 subscribeAllServices 方法就是从 nacos 服务端拉取所以组,服务名对应的客户端元数据信息,存到网关一个 serviceInstanceMap 中,后续网关路由转发等操作就是从 serviceInsta....

自研网关day04-集成netty和容器启动

自研网关day04-集成netty和容器启动

Netty Netty 简单介绍 Netty 是一个 NIO 客户端服务器框架,它可以快速轻松地开发网络应用程序,如协议服务器和客户端。它极大地简化了网络编程,如 TCP 和 UDP 套接字服务器。 “快速和简单”并不意味着最终的应用程序将遭受可维护性或性能问题。Netty 经过精心设计,从许多协议(如 FTP,SMTP,HTTP 和各种二进制和基于文本的遗留协议)的实现中获得了经验。因此,Netty 成功地找到了一种方法,可以在不妥协的情况下实现开发的轻松性、性能、稳定性和灵活性。 Netty 特征 设计 用于各种传输类型的统一 API-阻塞和非阻塞套接字 基于灵活和可扩展的事件模型,允许明确的关注点分离 高度可定制的线程模型-单线程,一个或多个线程池,如 SEDA 真正的无连接数据报套接字支持(自 3.1 起) Netty 架构 Netty 核心概念 bootstrap、serverBootstrap:bootstrap 的意思是引导,其主要作用是配置整个 Netty 程序,将各个组件整合起来。serverBootstrap 是服务器端的引导类。 eventLoop:eventLo....

自研网关day03-加载核心配置

自研网关day03-加载核心配置

当 core 模块中 BootStra 启动,需要加载环境的核心配置信息,比如网关核心配置,包括配置类默认值,配置文件,环境变量,jvm 参数,运行参数,还需要加载配置中心的配置(Nacos)和注册中心相关配置 加载网关核心配置 初始化核心配置 config 类作为配置文件加载的核心配置类,后续想当于集成 Spring 环境作为加载 spring,yaml 的一些配置信息类 public class Config { private int port = 8888; private String applicationName = "api-gateway"; private String registryAddress = "127.0.0.1:8848"; private String env = "dev"; private int eventLoopGroupBossNum = 1; private int eventLoopGroupWorkerNum = Runtime.getRuntime().availableProcessors(); private int maxC....

自研二次开发gateway(day 02)

自研二次开发gateway(day 02)

网关架构图 从自定向上 **common ** ** 主要存储模块需要的公共类,例如,枚举,工具类等** client 二方库,接收其他服务访问网关 register center 注册中心,注册服务注册中心 config center 配置中心,服务相关配置 core 核心模块 container 容器 context 上下文对象,封装 http,response,规则等 filterChain 责任过滤链表,包含一系列的责任脸 ** nettyHttpServer 接收其他服务请求,封装到 processor 流转** processor 处理器处理其他服务端请求 flusher,mpmc 解决串行化请求性能 loader 封装相关外置扩展 网关处理流程图

自研开发网关(day01)

自研开发网关(day01)

背景 通过 netty+nacos+disruptor 自研 gateway 网关 1.概念 1.访问数据,业务逻辑或者功能的“前门” 2.负责处理接收和处理调用过程中所有的任务 2.优势 1.简化客户端的工作 2.降低系统之间的耦合度 3.解放开发人员把精力专注于业务逻辑开发 3.劣势 ** 1. 因为是微服务各个系统'前面' 在微服务这种中心化架构中,容易成为瓶颈点** 服务如果不是异步或者同步非阻塞,耦合度高,性能也会有影响 网关作用 路由转发、协议转换、服务监控统计、熔断降级、限流、安全控制、负载均衡等 业界常见方案: 网关处理请求流程 网关异步化 1.插件过滤使用单异步模式 2.请求响应使用双异步模式

人民有信仰 民族有希望 国家有力量