当前位置: 首页 > news >正文

从微服务到云原生

        很多文章介绍云原生概念,说它包含微服务,又包含了其它几个方面的东西,还扯到文化层面、组织层面和技术层面,搞技术的人一听到公司文化问题和组织部门问题,就十分地晕眩,不能让我好好地坐下来写写代码、搞搞纯技术吗?

        记得微服务是2013年大火起来的,搞Java企业应用系统开发的人们都痴迷于这一新概念,从2014年到2018年我也特别喜欢弄这一个新架构,痴迷于MartinFlower那颗大树上的茂密藤曼,希望它杀死我面前的一切单体应用,一次次研读Chris Richardson的微服务架构系列文章,实际工作中使用了Dubbo和SpringCloud两个框架,总体感觉微服务架构的概念还是比较内聚的,SpringCloud在官网号称它是最完整的微服务框架:

         And don’t forget, no microservice architecture is complete without Spring Cloud ‒ easing administration and boosting your fault-tolerance.

        我们就用SpringCloud来看看微服务的主要概念:

  • 服务注册与发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon
  • 断路器(容错)——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config
  • 分布式日志追踪——Spring Cloud Sleuth

         我所理解的微服务架构知识主要是这6个方面,其它的我都不关心,就算是这6个方面也不好实现,让我难受的是:

  1. SpringCloud从Netflix接收过来的东西,名字都怪怪的,让人难受;
  2. Netflix Hystrix断路器实际搞起来特麻烦,反正我就没真正去实现过;
  3. Spring Cloud Config的实现也让人难受,在客户线上环境安装SVN或GitLab,真的有点怪怪的。
  4. Spring Cloud Sleuth分布式日志追踪,开发人员不用不关心,运维人员不懂不关心,所谓的DevOps实际搞起来没那么融洽。

         很多技术主管和架构师都号称搞微服务,到底搞到什么程度了?我估计都是实际搞一半,吹嘘一半。但反过来讲,搞一半是不是就够了,我们最终目的不就是软件交付嘛,按时向客户交付,功能正确和性能可接受,界面不要太难看,解决企业和用户的实际问题,就是项目成功了嘛,客户管你是用单体架构还是微服务架构呢。

        还有,不是做互联网系统,而是给企事业做应用系统的,系统的特点是功能多、用户少,根本就没几个人来访问,所以流量大而要做负载均衡就谈不上,真正解决的问题其实就是大单体带来的开发维护难问题,按功能内聚原则分拆设计就好了,按大功能点搞成一个个微服务就OK,所以,做企业应用系统真正需要的微服务组件最少简化到:

  •  服务注册与发现——Netflix Eureka
  •  服务网关——Netflix Zuul

   所以,我们不是什么时候都要搞全家桶的,学习起来还是很痛苦的,根据20/80原则,公司至少有80%的人是混日子不学习的,对他们来说越简单越好,其实SpringMVC搞单体对他们来讲是最好的,只是奈何他们不是技术总监或技术经理。

        微服务讲了这么多,我们用SpringCloud框架或其它微服务框架开发了一个应用系统,搞了一堆微服务组件,怎么发布?怎么部署?

        翻遍Spring官网都不见有大篇幅介绍系统部署的文章, 好了,我认为云原生技术知识就是刚好来解决这个下半场的问题。上半场是开发测试,下半场是部署交付,软件公司难道不就是干这两件大事吗?

        能想到的有多少种部署方式:

        1)单机部署:把所有的微服务组件进程都部署在一台机器上,不行吗?操作系统本来就是可以运行多进程的,所以你喜欢自然行,但是这台机器故障垮了就全完了。

        2)多机部署:搞N台硬件服务器,安装上Linux系统,根据所有硬件的资源情况,精细规划各个微服务组件应该分布到哪些节点上去,然后手工去每台机器安装JDK,配置好各种环境,最后手工去部署jar或war,一个分布式集群就形成了,不行吗?可以,就是太累太烦。比如使用不同的JDK版本同时部署,手工搞特麻烦。

        3)虚拟机部署:虚拟机技术出世后,VMWare公司兴起,同样是N台硬件服务器,采用虚拟机方式部署,又方便一点,但是虚拟机的开销还是受不了,据说Heroku早期是采用这种方式部署的,现实中没听说有人采用过。

        4)容器部署:Docker技术横空出世,拉开了容器化大幕,基于容器的一系列开源技术系统不断涌现,应用程序发布打包成容器镜像文件,对集群中节点的主机系统依赖几乎微乎其微,本身开销相对虚拟机也是非常地小,基本上是目前默认采用的部署方式。

        那么微服务架构开发出来的应用系统需要怎样的部署技术呢?或者说云原生应用系统需要怎样的部署方式呢?

  1.  容器化:以容器镜像文件方式发布,把对目标系统的依赖降低到最小;Docker镜像优雅地解决了这一问题。
  2.  集群化:通过API向一个集群发布,而不需要关注到具体的一个个物理节点;K8s、Swarm都是管理容器集群的。
  3.  服务编排:声明式容器编排技术,可以对集群中的容器进行自动动态的管理和调度;K8s、Swarm的主要功能就是负责容器编排的。
  4.  服务发现:K8s和Swarm以及配套系统已经直接支持了服务发现,根本不用像SpringCloud那样自己去实现。
  5.  负载均衡:K8s和Swarm也是直接支持了负载均衡,根本不用像SpringCloud那样自己去实现。
  6. API网关:同样,基于K8s和Swarm一整套云原生基础系统,有现成的方案来支持API网关,如Traefik、NGINX Ingress Controller等,功能都非常强大。
  7. 分布式配置:K8s直接支持,consul等系统也可以用来存放配置,通过配置文件变化监控工具,可以做到非侵入式配置方式,应用程序还是读取本地配置文件,比侵入式方式优雅多了。

        主要分析以上7个方面,对一般中小型云原生应用系统都足够了,用不着服务网格等更复杂的技术,如限流、熔断、良好的灰度发布支持等,一般企业应用系统没必要在这方面耗费精力。

        什么是云原生?管它什么是标准准确的定义,先把上面讲的上下半场都搞好了,系统开发发布敏捷起来了,能频繁地发布部署,一切自动化起来,方方面面都比以前好了,就自然理解云原生了。如果搞了一通这些技术,软件交付更糟糕了,那么说明你的系统很简单,用单体吧,合适才是最好的!

             

        

        

相关文章:

从微服务到云原生

很多文章介绍云原生概念,说它包含微服务,又包含了其它几个方面的东西,还扯到文化层面、组织层面和技术层面,搞技术的人一听到公司文化问题和组织部门问题,就十分地晕眩,不能让我好好地坐下来写写代码、搞搞…...

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组: — CAN1 和…...

武忠祥2025高等数学,基础阶段的百度网盘+视频及PDF

考研数学武忠祥基础主要学习以下几个方面的内容: 1.微积分:主要包括极限、连续、导数、积分等概念,以及它们的基本性质和运算方法。 2.线性代数:主要包括向量、向量空间、线性方程组、矩阵、行列式、特征值和特征向量等概念,以及它们的基本…...

用JavaFX写了一个简易的管理系统

文章目录 前言正文一、最终效果1.1 主页面1.2 动物管理页面-初始化1.3 动物管理页面-修改&新增1.4 动物管理页面-删除&批量删除 二、核心代码展示2.1 启动类2.2 数据库配置-db.setting2.3 日志文本域组件2.4 自定义表格视图组件2.5 自定义分页组件2.6 动物管理页面2.7 …...

第二百九十回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容,本章回中将介绍如何通过相机获取视频文件.闲话休提,让我们一起Talk Flutter吧。 1. …...

bert实现完形填空简单案例

使用 bert 来实现一个完形填空的案例,使用预训练模型 bert-base-chinese ,这个模型下载到跟代码同目录下即可,下载可参考:bert预训练模型下载-CSDN博客 通过这个案例来了解一下怎么使用预训练模型来完成下游任务,算是对…...

Jmeter 分布式测试

Jmeter单机进行压测,受到单台机器的性能影响,Jmeter支持分布式测试,用一个控制节点去控制多个工作节点去模拟更多的用户。 版本信息 内容版本号JDK1.8Jmeter5.6.2 分布式测试原理 jmeter 官网对分布式测试有说明,jmeter分布式…...

在 Ubuntu 上安装 Docker Engine

系列文章目录 前言 要在 Ubuntu 上开始使用 Docker Engine,请确保满足先决条件,然后按照安装步骤进行操作。 一、先决条件 注意事项 如果您使用 ufw 或 firewalld 管理防火墙设置,请注意当您使用 Docker 暴露容器端口时,这些端口…...

Mac安装nvm,安装多个不同版本node,指定node版本

一.安装nvm brew install nvm二。配置文件 touch ~/.zshrc echo export NVM_DIR~/.nvm >> ~/.zshrc echo source $(brew --prefix nvm)/nvm.sh >> ~/.zshrc三.查看安装版本 nvm -vnvm常用命令如下:nvm ls :列出所有已安装的 node 版本nvm…...

【开源】基于JAVA+Vue+SpringBoot的智慧家政系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…...

Python NLP深度学习进阶:自然语言处理

自然语言处理(Natural Language Processing,NLP)是人工智能领域中的一个重要分支,涉及到处理和理解人类语言的方法和技术。随着深度学习的快速发展,NLP的研究和应用也在不断进步。 在Python中,有许多强大的…...

STM32单片机基本原理与应用(三)

矩阵键盘工作原理 矩阵键盘由多个独立按键组成,按键的一端接地,一端接MCU的GPIO。当按键没有被按下时,电路其实是一个断路,将单片机该引脚设置成输入上拉状态,读到的电平为高电平。当按下按键时,引脚会被拉…...

Android studio布局详解

文章目录 一、Android studio布局详解二、Android studio六大布局案例三、优缺点四、热门文章 一、Android studio布局详解 Android Studio是一种用于开发Android应用程序的集成开发环境(IDE),用于设计和编辑Android应用程序的用户界面布局。在Android …...

第四篇:怎么写express的路由(接口+请求)

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: &#x1f4…...

算法学习记录:有关树的基础

前言: 算法学习记录不是算法介绍,本文记录的是从零开始的学习过程(见到的例题,代码的理解……),所有内容按学习顺序更新,而且不保证正确,如有错误,请帮助指出。 学习工具…...

2. 《大数据之路:阿里巴巴大数据实践》学习笔记,持续更新ing

笔记链接(飞书):https://t0s016els2a.feishu.cn/docx/JrNydGljUonH1ExcGCpcoC8unTb 密码:r661391 该书籍部分目录如下: 文章目录 第1篇 数据技术篇第2章 日志采集2.1 浏览器的页面日志采集2.1.1 页面浏览日志采集流程2.1.2 页面交互日志采集…...

编程笔记 html5cssjs 062 JavaScrip如何使用

编程笔记 html5&css&js 062 JavaScrip如何使用 一、 引入JavaScript二、DOM操作三、事件处理四、数据验证五、异步编程六、使用库和框架七、模块化开发小结 开始学习使用JavaScript进行前端开发的基本步骤和常见实践。 这里先列示基本的步骤和内容,后面慢慢…...

【前端基础--7】

DOM操作 DOM&#xff0c;全称(Document Object Model)&#xff0c;文档对象模型。 提供操作HTML的方法&#xff08;操作页面元素&#xff09; 获取节点 --- 操作元素标签 <body><div id"box">我是盒子标签</div><p class"text"&g…...

微信小程序如何搜索iBeacon设备

1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…...

JVM篇:垃圾回收算法

标记清除 通过遍历GC Root后得到不再被引用的对象&#xff0c;对没被引用的对象做一个标记处理&#xff0c;然后对其进行清除。 优点&#xff1a;速度快 缺点&#xff1a;会产生内存碎片&#xff0c;可能会导致空闲的内存足够保存对象&#xff0c;但由于不连续而保存失败。 标…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...