当前位置:首页 » 数据仓库 » 以下哪个不是分布式配置中心
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

以下哪个不是分布式配置中心

发布时间: 2023-03-14 01:26:05

Ⅰ 求java学习路线图

/*回答内容很长,能看完的少走一个月弯路,绝不抖机灵*/

提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获。

废话不多少了,先了解一下Java零基础入门学习路线:

第一阶段:JavaSE阶段

变量、数据类型、运算符

  • 二进制和十进制的转化

  • 注释、单行注释、多行注释、文本注释、注释内容和字节码的关系

  • 标识符、关键字、驼峰原则

  • 变量的本质、内存画图、变量声明和初始化

  • 变量的分类和作用域(局部变量、成员变量、静态变量)

  • 常量和Final

  • 基本数据类型介绍

  • 整型变量和整型常量

  • 浮点类型、float、double

  • char字符型、转义字符

  • boolean布尔型、if语句使用要点、布尔类型占用空间问题

  • 运算符介绍

  • 算数运算符(二元、自增、自减)

  • 赋值和赋值运算符

  • 关系运算符详解

  • 逻辑运算符、短路运算符详解

  • 位运算符详解

  • 字符串连接符

  • 条件运算符(三元运算符)

  • 运算符优先级问题

  • 自动类型转换详解

  • 强制类型装换详解

  • 基本数据类型装换常见错误、溢出、L问题

  • 使用Scanner获取键盘输入

控制语句

  • 控制语句和实现逻辑对应

  • if单选结构

  • if_elseif_else多选结构

  • switch语句_IDEA更换主题

  • 循环_while

  • 循环_for循环_dowhile

  • 嵌套循环

  • break和continue语句_标签_控制语句底层原理

  • 写一个年薪计算机_网络查问题的秘诀(重要)

  • 个人所得税计算器软件

  • 方法核心详解_天才思维模型教你高手学习思维模式

  • 方法的重载

  • 递归结构讲解_递归头_递归体

面向对象编程-基础

  • 面向过程和面向对象的区别

  • 类和对象的概述

  • 类的属性和方法

  • 创建对象内存分析

  • 构造方法(Construtor)及重载

  • 对象类型的参数传递

  • this关键字

  • static关键字详解

  • 局部代码块、构造代码块和静态代码块

  • package和import详解

  • JavaDoc生成API文档

面向对象编程-进阶

  • 面向对象的三大特性

  • 面向对象之【封装(Encapsulation)】

  • 访问权限修饰符

  • 面向对象之【继承(Inheritance)】

  • Object类

  • 方法重写Override

  • super关键字详解

  • 重写equals()和toString()

  • 继承中对象创建的内存分析

  • 面向对象之【多态(Polymorphism)】

  • 向上转型

  • 向下转型

  • instanceof运算符

  • 编译时和运行时详解

  • final修饰符

  • 抽象类和抽象方法(abstrct)

  • 接口的定义和实现

  • JDK8的接口新特性

  • 接口应用:内部类比较器Comparable

  • 内部类详解

  • Java的内存管理与垃圾回收

异常机制

  • 异常的概述

  • 异常的执行过程与分析

  • try-catch-finally捕捉异常

  • throw抛出异常

  • throws声明异常

  • 异常继承体系

  • 运行时异常和编译异常

  • 自定义异常

Java常用类

Wrapper包装类

  • 自动装箱和自动拆箱

  • 包装类的源码分析

  • String类的使用与内存原理

  • String类的源码分析

  • StringBuffer

  • StringBuilder

  • 字符串处理类性能分析

  • Date类

  • System类

  • DateFormat类

  • Calendat类

  • Math类

  • BigInteger类和BigDecimal类

  • Random类

  • 枚举类

  • File类

  • 常见的面试题讲述与分析

  • 数据结构算法

  • 数据结构的概述

  • 线性表

  • 顺序表

  • 链表

  • 栈和队列

  • 二叉树

  • 二叉查找树

  • 二叉平衡树

  • 黑红树

  • 冒泡排序

  • 选择排序

  • 递归

  • 折半查找

  • 集合(容器)

  • 集合和数组的联系和区别

  • 集合框架体系

  • ArrayList的使用和源码分析

  • 集合中使用泛型

  • LinkedList的使用和源码分析

  • HashSet的使用和源码分析

  • 哈希表及原理

  • TreeSet的使用和源码分析

  • 比较器Comparable和Comparator

  • HashMap的使用和源码分析

  • TreeMap的使用和源码分析

  • Iterator于ListIterator

  • Collections工具类

  • 旧集合类Vector、Hashtable

  • 集合总结和选择依据

  • 泛型接口

  • 泛型类

  • 泛型方法

  • IO流

  • IO流的概念

  • IO流的分类及其原理分析

  • 文件流FlieInputStream、FileOutputStream

  • 缓冲流BufferedInputStream、BufferedOutputStream

  • 数据流ObjectInputStream、ObjectOutputStream

  • 序列化和反序列化

  • 转换流InputStreamReader、OutputStreamWriter

  • 打印流PrintWrite和PrintStream

  • 数组流ByteArrayOutputStream、ByteArrayInputStream

  • 使用IO复制文件夹

  • 多线程

  • 进程和线程

  • 线程的创建与启动

  • 创建线程的三种方式对比

  • 线程的生命周期

  • 线程控制

  • 多线程的安全问题与解决办法

  • 线程的同步:同步代码块

  • 线程的同步:同步方法

  • 线程的同步:Lock锁

  • 线程的死锁问题

  • 线程通信

  • Condition

  • 线程的完整生命周期

  • 线程池ThreadPoolExecutor

  • ForkJoin框架

  • ThreadLocal类

  • 网络编程

  • 计算机网络基础知识

  • 网络通信协议

  • OSI参考模型

  • TCP/IP参考模型

  • 数据的封装与拆封原理解析

  • TCP协议

  • UDP协议

  • IP地址和端口号

  • URL和Socket

  • 使用TCP编程实现登录功能

  • 使用UDP编程实现客服系统

  • 使用TCP编程实现文件上传

  • 集合提升寻训练

  • 手写ArrayList

  • 手写单链表

  • 手写Linkedlist

  • 手写HashMap

  • 手写HashSet

  • 最新并发集合类

  • 多线程提升训练

  • 生产者消费者模式扩展

  • Lock锁和Condition

  • ReadWriteLock

  • BlockingQueue

  • volatile关键字

  • 多线程题目练习

  • JDK新特征

  • 面试题详解

  • 设计模式

  • 设计模式入门

  • 面向对象设计七大原则

  • 简单工厂模式

  • 工厂方法模式

  • 单例模式

  • 原型模式

  • 装饰模式

  • 适配器模式

  • 外观模式

第二阶段:数据库

    Mysql基础

  • 数据库基础知识

  • MySQL基础知识

  • MySQL8新特征

  • 安装和卸载MySQL8

  • 使用navicat访问数据库

  • SQL语言入门

  • 创建数据库表

  • DML

  • 修改删除数据库表

  • 表的完整性约束

  • 表的外键约束

  • DML扩展

  • MySQL 查询语句

  • 基本select查询

  • where子句

  • 函数

  • group by

  • having

  • SQL99-内连接查询

  • SQL99-外连接查询

  • SQL99-自连接查询

  • SQL92-连接查询

  • 不相关子查询

  • 相关子查询

  • 分页查询

  • 数据库对象

  • 索引

  • 事务及其特征

  • 事务的并发问题

  • 事务的隔离级别

  • 存储过程

  • 导入导出数据

  • JDBC

  • JDBC概述

  • 使用JDBC完成添加/更新/删除操作

  • 使用JDBC完成查询操作

  • JDBC常用接口

  • 使用PreparedStatement

  • 使用事务完成银行转账

  • 提取DBUtil工具类

  • 使用Properties读写属性文件

  • 日志框架log4j

  • 开发员工管理系统

第三阶段:JavaEE阶段

      Servlet

    • web开发概述

    • B/S和C/S架构简介

    • HTTP协议

    • HTTP请求头和响应头

    • Tomcat安装使用

    • Tomcat目录结构

    • Servlet概述

    • Servlet快速入门

    • Servlet生命周期

    • 读取配置文件信息

    • HttpServletRequest

    • HttpServletResponse

    • GET和POST区别

    • 解决中文乱码

    • 请求转发与重定向

    • 绝对路径和相对路径

    • Cookie

    • Session

    • ServletContext

    • ServletConfig

    • JSP

    • JSP技术介绍

    • JSP的执行过程

    • scriptlet

    • 表达式

    • 声明

    • JSP指令元素

    • JSP动作元素

    • JSP隐式对象

    • JSP底层原理

    • 九大内置对象

    • 四个作用域

    • Servlet和JSP的关系和区别

    • MVC模式

    • 合并Servlet

    • JavaScript

    • JavaScript概述与特点

    • JS基础语法

    • 函数

    • 数组

    • Math对象

    • String对象

    • Date对象

    • 事件event

    • 浏览器开发者工具

    • console

    • DOM和BOM

    • window

    • location

    • navigator

    • history

    • 认识DOM

    • DOM获取元素

    • jQuery

    • jQuery简介及快速入门

    • jQuery入口函数

    • jQuery对象与DOM对象互相转换

    • 基本选择器

    • 属性选择器

    • 位置选择器

    • 表单选择器

    • 内容选择器

    • jQuery事件

    • jQuery动画效果

    • DOM操作-操作文本

    • DOM操作-操作属性

    • DOM操作-操作元素

    • 直接操作CSS样式

    • 操作CSS类样式

    • 购物车案例

    • 表单验证

    • 正则表达式

    • EL+JSTL+过滤器+监听器

    • EL介绍及使用

    • EL取值原理

    • EL隐含对象

    • EL逻辑运算

    • JSTL介绍-核心标签库

    • JSTL核心标签库

    • JSTL-格式标签库

    • Filter原理

    • Filter生命周期

    • Filter链

    • Filter登录验证

    • Filter权限控制

    • Listener概述及分类

    • Listener监听在线用户

    • Ajax和JSON

    • Ajax异步请求和局部刷新的原理

    • 使用原生Ajax验证用户唯一性

    • jQuery Ajax

    • JSON的格式和使用

    • 主要JSON解析器

    • Jackson的使用

    • Jackson的实现原理

    • 使用jQuery Ajax实现三级联动

    • 使用jQuery Ajax实现自动补全

    • 分页和文件上传/下载

    • 分页的意义

    • 理解分页工具类

    • 实现基本分页

    • 实现带查询的分页

    • 文件上传原理

    • 文件上传API

    • 实现文件上传

    • 文件下载原理

    • 文件下载响应头

    • 实现文件下载

    第四阶段:框架阶段

      MyBatis

    • MyBatis概述

    • MyBatis入门配置

    • 基本的CRUD操作

    • 核心配置文件详解

    • Mapper.xml基础详解

    • 模糊查询

    • 分页的实现及插件PageHelper的使用

    • 动态sql+sql片段的使用

    • 一对多、多对一的关系处理

    • 注解的使用

    • 一级缓存和二级缓存说明及使用

    • generator逆向工程使用

    • Spring

    • Spring框架简介

    • Spring官方压缩包目录介绍

    • Spring环境搭建

    • IoC/DI容器详解

    • Spring创建Bean的三种方式

    • scope属性讲解

    • Spring中几种注入方式

    • 静态代理设计模式

    • 动态代理设计模式

    • AOP详解

    • AOP中几种通知类型

    • AOP两种实现方式

    • 自动注入

    • 声明式事务

    • 事务传播行为

    • 事务隔离级别

    • 只读事务

    • 事务回滚

    • 基于注解式配置

    • 常用注解

    • Spring 整合MyBatis

    • i18n

    • Spring整合Junit

    • SpringMVC

    • MVC架构模式

    • 手写MVC框架

    • SpringMVC简介

    • SpringMVC运行原理

    • 基于配置文件方式搭建环境

    • 基于注解方式搭建环境

    • SpringMVC的跳转及视图解析器的配置

    • SpringMVC和Ajax的交互

    • Spring 参数注入

    • SpringMVC作用域传值

    • 视图解析器

    • 文件下载

    • 文件上传

    • Spring拦截器/拦截器栈

    • 登录状态验证

    • SpringMVC容器和Spring容器介绍

    • 异常处理4种方式

    • SpringMVC5其他常用注解

    • Maven

    • Maven简介

    • Maven原理

    • Linux安装及注意事项

    • Maven项目结构

    • POM模型

    • Maven 中项目类型

    • 创建WAR类型的Maven项目

    • scope属性可取值

    • SSM项目拆分演示

    • Maven的常见插件讲解

    • 热部署

    • BootStrap

    • BootStrap概述

    • BootStrap栅格系统

    • BootStrap常用全局CSS样式

    • 常用组件

    • 常用JavaScript插件

    • RBAC

    • RBAC概述

    • RBAC发展历史

    • 基于RBAC的数据库表设计

    • URL拦截实现

    • 动态菜单实现

    • 密码学

    第五阶段:前后端分离阶段

      Spring Boot

    • Spring Boot简介

    • Spring Boot实现Spring MVC

    • 配置文件顺序及类型讲解

    • Spring Boot项目结构

    • Spring Boot 整合MyBatis

    • Spring Boot 整合Druid

    • Spring Boot 整合PageHelper

    • Spring Boot 整合logback

    • Spring Boot 整合JSP

    • Spring Boot 整合Thymeleaf

    • Spring Boot 开发者工具

    • Spring Boot 异常显示页面

    • Spring Boot 整合Junit4

    • Spring Boot 项目打包部署

    • Spring Boot 整合Quartz

    • Spring Boot 中Interceptor使用

    • Spring Boot Actuator

    • HikariCP

    • Logback

    • Logback简介

    • Logback依赖说明

    • Logback 配置文件讲解

    • Logback 控制台输出

    • Logback 文件输出

    • Logback 数据库输出

    • Spring Security

    • Spring Security简介

    • Spring Security架构原理

    • 什么是认证和授权

    • 基础环境搭建

    • 自定义认证流程

    • UserDetailsService和UserDetails

    • PasswordEncoder

    • 自定义认证结果

    • 授权-访问路径匹配方式

    • 授权-权限管理

    • 基于注解实现权限管理

    • Thymeleaf整合Security权限管理

    • Rememberme 实现

    • 退出实现

    • CSRF

    • Linux - CentOS 8

    • Linux简介

    • VMWare安装及使用

    • Linux安装及注意事项

    • Linux目录结构及路径

    • Linux常用命令

    • VMWare常用配置

    • XShell安装及使用

    • Xftp安装及使用

    • JDK解压版配置步骤

    • Tomcat配置步骤

    • 安装MySQL

    • WAR包部署

    • Docker

    • Docker简介

    • Docker与VM对比

    • Docker特点

    • Docker架构

    • Docker安装与启动

    • 镜像加速器配置

    • Docker镜像操作常用命令

    • Docker容器操作常用命令

    • DockerFile

    • 搭建本地镜像仓库

    • 推送镜像到阿里云及本地仓库

    • Docker容器生命周期

    • Docker数据管理

    • Redis

    • Redis简介

    • Redis 单机版安装

    • Redis 数据类型介绍

    • Redis 常用命令

    • Redis 持久化方案

    • Redis 的主从搭建

    • Redis的哨兵搭建

    • Redis 的集群搭建

    • Spring Boot整合Spring Data Redis

    • Redis的缓存穿透

    • Redis的缓存雪崩

    • Redis的缓存击穿

    • Vue

    • vsCode和插件安装

    • webpack介绍

    • Vue项目创建

    • Vue模板语法

    • Vue条件渲染

    • Vue列表渲染

    • Vue事件处理

    • Vue计算属性

    • Vue Class与Style

    • Vue表单处理

    • Vue组件

    • Vue组件生命周期

    • Vue 路由配置

    • Vue Axios网络请求

    • Vue跨域处理

    • Vue Element

    • Mock.js

    • Swagger

    • Swagger2简介

    • Springfox

    • Swagger2基本用法

    • Swagger-UI用法

    • Swagger2配置

    • Swagger2常用配置

    • Git/GitEE

    • Git的下载和安装

    • Git和SVN对比

    • Git创建版本库

    • Git版本控制

    • Git远程仓库

    • Git分支管理

    • Git标签管理

    • GitEE建库

    • GitEE 连接及使用

    • GitEE 组员及管理员配置

    第六阶段:微服务架构

      FastDFS

    • 分布式文件系统概述

    • FastDFS简介

    • FastDFS架构

    • Tracker Server

    • Storage Server

    • FastDFS安装

    • 安装带有FastDFS模块的Nginx

    • Fastdfs-java-client的使用

    • 创建Fastdfs-java-client工具类

    • 实现文件上传与下载

    • KindEditor介绍

    • 通过KindEditor实现文件上传并回显

    • RabbitMQ

    • AMQP简介

    • RabbitMQ简介

    • 安装Erlang

    • 安装RabbitMQ

    • RabbitMQ原理

    • Spring Boot 集成RabbitMQ

    • RabbitMQ的交换器

    • Spring AMQP的使用

    • Spring Cloud Netflix Eureka

    • Eureka简介

    • Eureka和Zookeeper 对比

    • 搭建Eureka注册中心

    • Eureka 服务管理平台介绍

    • 搭建高可用集群

    • 集群原理

    • Eureka优雅停服

    • Spring Cloud Netflix Ribbon

    • Ribbon简介

    • 集中式与进程内负载均衡区别

    • Ribbon常见的负载均衡策略

    • Ribbon的点对点直连

    • Spring Cloud OpenFeign

    • Feign简介

    • Feign的请求参数处理

    • Feign的性能优化

    • 配置Feign负载均衡请求超时时间

    • Spring Cloud Netflix Hystrix

    • Hystrix简介

    • 服务降级

    • 服务熔断

    • 请求缓存

    • Feign的雪崩处理

    • 可视化的数据监控Hystrix-dashboard

    • Spring Cloud Gateway

    • Spring Cloud Gateway简介

    • Gateway基于配置文件实现路由功能

    • Gateway基于配置类实现路由功能

    • Gateway中内置过滤器的使用

    • Gateway中自定义GatewayFilter过滤器的使用

    • Gateway中自定义GlobalFilter过滤器的使用

    • Gateway中使用过滤器实现鉴权

    • Gateway结合Hystrix实现熔断功能

    • Spring Cloud Config

    • 什么是分布式配置中心

    • 创建配置中心服务端

    • 创建配置中心客户端

    • 基于Gitee存储配置文件

    • 基于分布式配置中心实现热刷新

    • Spring Cloud Bus

    • 什么是消息总线

    • 基于消息总线实现全局热刷新

    • ELK

    • ElasticSearch介绍

    • ElasticSearch单机版安装

    • ElasticSearch集群版安装

    • ElasticSearch索引管理

    • ElasticSearch文档管理

    • ElasticSearch文档搜索

    • SpringDataElasticSearch访问ElasticSearch

    • LogStash介绍

    • 基于LogStash收集系统日志

    • TX-LCN

    • 分布式事务简介

    • 分布式事务两大理论依据

    • 分布式事务常见解决方案

    • LCN简介

    • TX-LCN的3种模式

    • LCN原理

    • LCN环境搭建及Demo演示

    • Nginx

    • Nginx的简介

    • 什么是正向代理、反向代理

    • Nginx的安装

    • Nginx配置虚拟主机

    • Nginx配置服务的反向代理

    • Nginx的负载均衡配置

    • Spring Session

    • Spring Session介绍

    • 通过Spring Session共享session中的数据

    • 通过Spring Session同步自定义对象

    • Spring Session的Redis存储结构

    • 设置Session失效时间

    • Spring Session序列化器

    • MyBatis Plus

    • MyBatis Plus简介

    • Spring整合MyBatis Plus

    • MyBatis Plus的全局策略配置

    • MyBatis 的主键生成策略

    • MyBatis Plus的CRUD操作

    • 条件构造器EntityWrapper讲解

    • MyBatis Plus的分页插件配置

    • MyBatis Plus的分页查询

    • MyBatis Plus的其他插件讲解

    • MyBatis Plus的代码生成器讲解

    • MyBatis Plus的公共字段自动填充

    • ShardingSphere

    • 简介

    • 数据库切分方式

    • 基本概念

    • MySQL主从配置

    • 切片规则

    • 读写分离

    • 实现分库分表

    第七阶段:云服务阶段

      Kafka

    • Kafka简介

    • Kafka架构

    • 分区和日志

    • Kafka单机安装

    • Kafka集群配置

    • 自定义分区

    • 自动控制

    • Spring for Apache Kafka

    • Zookeeper

    • Zookeeper简介和安装

    • Zookeeper 数据模型

    • Zookeeper 单机版安装

    • Zookeeper常见命令

    • ZClient操作Zookeeper

    • Zookeeper 集群版安装

    • Zookeeper 客户端常用命令

    • Zookeeper分布式锁

    • RPC

    • 什么是分布式架构

    • 什么是RFC、RPC

    • HttpClient实现RPC

    • RestTemplate

    • RMI实现RPC

    • 基于Zookeeper实现RPC 远程过程调用

    • Dubbo

    • SOA架构介绍

    • Dubbo简介

    • Dubbo结构图

    • Dubbo注册中心

    • Dubbo 支持的协议

    • Dubbo 注册中心搭建

    • Spring Boot 整合 Dubbo

    • Admin管理界面

    • Dubbo 搭建高可用集群

    • Dubbo 负载均衡

    • Spring Cloud Alibaba Dubbo

    • Spring Cloud Alibaba Dubbo简介

    • 基于Zookeeper发布服务

    • 基于Zookeeper订阅服务

    • 实现远程服务调用处理

    • Spring Cloud Alibaba Nacos

    • Spring Cloud Alibaba Nacos简介

    • 搭建Nacos服务器

    • 基于Nacos发布|订阅服务

    • 实现远程服务调用处理

    • Nacos Config配置中心

    • Spring Cloud Alibaba Sentinel

    • Spring Cloud Alibaba Sentinel简介

    • 搭建Sentinel服务器

    • Sentinel-实时监控

    • Sentinel-簇点链路

    • Sentinel-授权规则

    • Sentinel-系统规则

    • @SentinelResource注解

    • 持久化规则

    • Spring Cloud Alibaba Seata

    • Spring Cloud Alibaba Seata简介

    • 搭建Seata服务器

    • Seata支持的事务模式-AT模式

    • Seata支持的事务模式-TCC模式

    • Seata支持的事务模式-Saga模式

    • Seata支持的事务模式-XA模式

    • SeataAT事务模式应用方式

    • SeataTCC事务模式应用方式

    Ⅱ Spring Cloud全家桶主要组件及简要介绍

    一、微服务简介

    微服务是最近的一两年的时间里是很火的一个概念。感觉不学习一下都快跟不上时代的步伐了,下边做一下简单的总结和介绍。

    何为微服务?简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

    一个微服务一般完成某个特定的功能,比如下单管理、客户管理等等。每一个微服务都是微型六角形应用,都有自己的业务逻辑和适配器。一些微服务还会发布API给其它微服务和应用客户端使用。其它微服务完成一个Web UI,运行时,每一个实例可能是一个云VM或者是Docker容器。

    比如,一个前面描述系统可能的分解如下:

    总的来说,微服务的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作,并且每个服务都维护着自身的数据存储、业务开发、自动化测试以及独立部署机制。

    二、微服务的特征

    1、每个微服务可独立运行在自己的进程里;

    2、一系列独立运行的微服务共同构建起了整个系统;

    3、每个服务为独立的业务开发,一个微服务一般完成某个特定的功能,比如:订单管理、用户管理等;

    4、微服务之间通过一些轻量的通信机制进行通信,例如通过REST API或者RPC的方式进行调用。

    三、微服务的优缺点

    1、易于开发和维护

    2、启动较快

    3、局部修改容易部署

    4、技术栈不受限

    5、按需伸缩

    6、DevOps

    四、常见微服务框架

    1、服务治理框架

    (1)Dubbo、Dubbox(当当网对Dubbo的扩展)

    最近的好消息是Dubbo已近重新开始进行运维啦!

    (2)Netflix的Eureka、Apache的Consul等。

    Spring Cloud Eureka是对Netflix的Eureka的进一步封装。

    2、分布式配置管理

    (1)网络的Disconf

    (2)360的QConf

    (3)Spring Cloud组件中的Config

    (3)淘宝的Diamond

    3、批量任务框架

    (1)Spring Cloud组件中的Task

    (2)LTS

    4、服务追踪框架

    。。。

    五、Spring Cloud全家桶组件

    在介绍Spring Cloud 全家桶之前,首先要介绍一下Netflix ,Netflix 是一个很伟大的公司,在Spring Cloud项目中占着重要的作用,Netflix 公司提供了包括Eureka、Hystrix、Zuul、Archaius等在内的很多组件,在微服务架构中至关重要,Spring在Netflix 的基础上,封装了一系列的组件,命名为:Spring Cloud Eureka、Spring Cloud Hystrix、Spring Cloud Zuul等,下边对各个组件进行分别得介绍:

    (1)Spring Cloud Eureka

    我们使用微服务,微服务的本质还是各种API接口的调用,那么我们怎么产生这些接口、产生了这些接口之后如何进行调用那?如何进行管理哪?

    答案就是Spring Cloud Eureka,我们可以将自己定义的API 接口注册到Spring Cloud Eureka上,Eureka负责服务的注册于发现,如果学习过Zookeeper的话,就可以很好的理解,Eureka的角色和 Zookeeper的角色差不多,都是服务的注册和发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。

    1、两台Eureka服务注册中心构成的服务注册中心的主从复制集群;

    2、然后服务提供者向注册中心进行注册、续约、下线服务等;

    3、服务消费者向Eureka注册中心拉去服务列表并维护在本地(这也是客户端发现模式的机制体现!);

    4、然后服务消费者根据从Eureka服务注册中心获取的服务列表选取一个服务提供者进行消费服务。

    (2)Spring Cloud Ribbon

    在上Spring Cloud Eureka描述了服务如何进行注册,注册到哪里,服务消费者如何获取服务生产者的服务信息,但是Eureka只是维护了服务生产者、注册中心、服务消费者三者之间的关系,真正的服务消费者调用服务生产者提供的数据是通过Spring Cloud Ribbon来实现的。

    在(1)中提到了服务消费者是将服务从注册中心获取服务生产者的服务列表并维护在本地的,这种客户端发现模式的方式是服务消费者选择合适的节点进行访问服务生产者提供的数据,这种选择合适节点的过程就是Spring Cloud Ribbon完成的。

    Spring Cloud Ribbon客户端负载均衡器由此而来。

    (3)Spring Cloud Feign

    上述(1)、(2)中我们已经使用最简单的方式实现了服务的注册发现和服务的调用操作,如果具体的使用Ribbon调用服务的话,你就可以感受到使用Ribbon的方式还是有一些复杂,因此Spring Cloud Feign应运而生。

    简单的可以理解为:Spring Cloud Feign 的出现使得Eureka和Ribbon的使用更为简单。

    (4)Spring Cloud Hystrix

    我们在(1)、(2)、(3)中知道了使用Eureka进行服务的注册和发现,使用Ribbon实现服务的负载均衡调用,还知道了使用Feign可以简化我们的编码。但是,这些还不足以实现一个高可用的微服务架构。

    例如:当有一个服务出现了故障,而服务的调用方不知道服务出现故障,若此时调用放的请求不断的增加,最后就会等待出现故障的依赖方 相应形成任务的积压,最终导致自身服务的瘫痪。

    Spring Cloud Hystrix正是为了解决这种情况的,防止对某一故障服务持续进行访问。Hystrix的含义是:断路器,断路器本身是一种开关装置,用于我们家庭的电路保护,防止电流的过载,当线路中有电器发生短路的时候,断路器能够及时切换故障的电器,防止发生过载、发热甚至起火等严重后果。

    (5)Spring Cloud Config

    对于微服务还不是很多的时候,各种服务的配置管理起来还相对简单,但是当成百上千的微服务节点起来的时候,服务配置的管理变得会复杂起来。

    分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件Spring Cloud Config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在Cpring Cloud Config 组件中,分两个角色,一是Config Server,二是Config Client。

    Config Server用于配置属性的存储,存储的位置可以为Git仓库、SVN仓库、本地文件等,Config Client用于服务属性的读取。

    (6)Spring Cloud Zuul

    我们使用Spring Cloud Netflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载;通过Spring Cloud Config实现了应用多环境的外部化配置以及版本管理。为了使得服务集群更为健壮,使用Hystrix的融断机制来避免在微服务架构中个别服务出现异常时引起的故障蔓延。

    先来说说这样架构需要做的一些事儿以及存在的不足:

    1、首先,破坏了服务无状态特点。为了保证对外服务的安全性,我们需要实现对服务访问的权限控制,而开放服务的权限控制机制将会贯穿并污染整个开放服务的业务逻辑,这会带来的最直接问题是,破坏了服务集群中REST API无状态的特点。从具体开发和测试的角度来说,在工作中除了要考虑实际的业务逻辑之外,还需要额外可续对接口访问的控制处理。

    2、其次,无法直接复用既有接口。当我们需要对一个即有的集群内访问接口,实现外部服务访问时,我们不得不通过在原有接口上增加校验逻辑,或增加一个代理调用来实现权限控制,无法直接复用原有的接口。

    面对类似上面的问题,我们要如何解决呢?下面进入本文的正题:服务网关!

    为了解决上面这些问题,我们需要将权限控制这样的东西从我们的服务单元中抽离出去,而最适合这些逻辑的地方就是处于对外访问最前端的地方,我们需要一个更强大一些的均衡负载器,它就是本文将来介绍的:服务网关。

    服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。Spring Cloud Netflix中的Zuul就担任了这样的一个角色,为微服务架构提供了前门保护的作用,同时将权限控制这些较重的非业务逻辑内容迁移到服务路由层面,使得服务集群主体能够具备更高的可复用性和可测试性。

    (7)Spring Cloud Bus

    在(5)Spring Cloud Config中,我们知道的配置文件可以通过Config Server存储到Git等地方,通过Config Client进行读取,但是我们的配置文件不可能是一直不变的,当我们的配置文件放生变化的时候如何进行更新哪?

    一种最简单的方式重新一下Config Client进行重新获取,但Spring Cloud绝对不会让你这样做的,Spring Cloud Bus正是提供一种操作使得我们在不关闭服务的情况下更新我们的配置。

    Spring Cloud Bus官方意义:消息总线。

    当然动态更新服务配置只是消息总线的一个用处,还有很多其他用处。

    六、总结

    Spring Cloud 的组件还不止这些,通过上边的口水话的介绍,应该可以大致有一定的了解,但是每一个组件的功能远不止上述介绍的那些,每一个组件还有很多其他的功能点,这里的介绍希望能够带大家入个门,不要对微服务这个这么大的概念有所畏惧。

    Ⅲ zookeeper

    客户端的Watcher

    String就是节点的path,有三大类。
    dataWatches:数据watcher
    existWatches:节点是否存在的watcher
    childWatches:节点的子节点个数变化,包括:0->1,1->2等等,只要数量变化就触发。

    对于zk的watcher机制,有几个疑问?

    三、ZK的通信协议
    分两类:请求和响应协议。是基于TCP/IP的应用层协议,其实就是规定了应用层报文的格式,以及每个字段的含义。客户端和服务端双方都遵守这种约定,脱离了ZK,其他框架是无法识别这种通信协议的。

    请求和响应报文格式,网上搜一下一大堆。这里不再赘述

    那么回到什么是分布式协调呢?我们就以RPC这种场景来说:
    比如我们可以理解上面的图,一半client是service角色,一半client是consumer角色,然后zk提供了这些client之间的协调 -- 充当consumer角色的client必须依赖于充当service角色提供的服务,这可不就是分布式协调的一种嘛(协调其中一半的client依赖另一半)。当然我们可以继续扩展:分布式配置中心Disconf,有个client它的角色可以是管理员(配置员),它是一个进程。它向zk某一个节点配置了XX数据,然后其他所有client同时收到最新配置。这可不就是另外一种协调了嘛(其他client依赖这个配置的值执行业务)。

    ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能

    乍一看这个定义挺抽象的,一时半会没理解。其实举个例子就容易理解的多,比如你有个资源,我们先简单把该资源当做一个本地文件或本地电影。你为了保证该资源的可靠性,你需要把该资源到3台机器上。那么这三个资源,在互联网上就会有三个url地址:机器1/xxx/xxx/xxx.pdf,机器2/xxx/xxx/xxx.pdf,机器3/xxx/xxx/xxx.pdf。请求方为了访问该资源,肯定不会把这三个地址硬编码到自己本地,这样不易拓展。所以这个时候,就需要一个统一命名服务来封装该资源的三个真实地址,对外只提供一个地址并且永远可以不变。那么这个统一命名服务,我们当然可以用http协议来实现,也可以用zk协议(ZAB协议)来实现。
    现在理解了上面的内容,那么我们就容易拓展这个资源的定义了。上面所说的资源,我们可以拓展为一个服务 xxx.xxx.xxx.UserService,该服务的提供方可以有很多个,但是为了封装真实提供方,我们只能对外暴露一个地址那就是xxx.xxx.xxx.UserService。是不是很熟悉?Dubbo的ZK注册中心,就是这么干的。

    理解定义我们就不说了,这个很好理解。实际案例咱们可以参考Dubbo的ZK,提供者发布或修改服务真实地址后,消费者可以实时收到变化的通知,然后再去ZK拉取最新数据。这可不就是ZK的发布与订阅嘛,通过Listener观察者模式来实现。应用场景很多:RPC服务发现,配置中心的配置分发等等。

    所谓集群管理无在乎两点:是否有机器退出和加入、选举 Master。
    不就是ZK的发布订阅嘛,没啥好说的。

    这里的maser选举,可不是ZK内部的master选举(两者相差十万八千里)。这里的master选举,是指业务调用方,属于client角色的进程,进行选举。
    业务master选举其实很简单,完全没必要像ZK内部选举那样,还要实现一套可靠的选举算法(paxos算法包含了一个提案选举,paxos算法可不止一个选举算法)。ZK本身提供了一个可靠创建唯一节点的API接口,这个接口保证了并发调用只会有一个成功。那么业务master选举,是不是可以转化为多个业务进程并发调用该API接口,谁创建唯一节点成功了,谁就是master了,其他进程就是slave。怎么感觉这么像分布式锁的实现呢?除了少了释放锁的通知操作。。。

    软负载均衡也没啥好说的,就是注册与发现的变种,或者说发布与订阅的变种。获取统一命名服务的所有提供者列表,然后通过负载均衡算法在这一堆列表中选择一个,策略可以是随机选择,轮训选择,Hash一致性选择等等。。。Dubbo的负债均衡是实现在消费者调用逻辑里面的,并不在获取列表接口里面,ZK不做负载均衡,基于ZK的应用可以做。

    和上面的数据发布与订阅 一模一样 ,不在赘述。

    和上面说的Master选举很像,都是一堆client角色的业务调用方,调用创建某唯一节点的API。谁创建成功,谁就拿锁。只不过ZK的底层实现是严格按照顺序来的,所以必然是ZK接收请求的时候,谁第一个谁拿锁。注意可不是client谁先请求谁拿锁。client请求还要经过网络,同时请求是没法确定哪个client先到达的。
    但是光创建唯一节点成功还不叫锁,锁天然包含了两个功能:可重入和释放锁唤醒其他等待的client节点。可重入ZK是实现不了,需要业务方自己实现。释放锁的唤醒ZK是通过Listener的通知唤醒的。

    我们看下上面的所有应用场景,其实本质上都是调用zk的两个最核心的接口:创建节点和监听节点变化。

    ZooKeeper 将数据保存在内存中,这也就保证了高吞吐量和低延迟 (但是内存限制了能够存储的容量不太大,此限制也是保持 znode 中存储的数据量较小的进一步原因)。ZK集群加机器可不能增加内存,为啥呢?因为ZK集群里面的所有数据,都是每台机器保存一份副本。整个集群内存最小的机器,决定整个集群的内存大小。

    ZooKeeper 是高性能的。在“读”多于“写”的应用程序中尤其的高性能 ,因为“写”会导致所有的服务器间同步状态。(“读”多于“写”是协调服务的典型场景。)

    ZooKeeper 底层其实只提供了两个功能: