Java微服务学习笔记(一):微服务架构的概念理解
Java微服务学习笔记
Tips:入门学习时粗略整理,仅供参考
(一):架构的基础理解
文章目录
- Java微服务学习笔记
- 前言
- 一、微服务是什么?
- 二、常用开源微服务框架演化
- 1. Dubbo
- 2. Spring Cloud (NetFlix)
- 3. Spring Cloud Alibaba
- 三、微服务架构与技术栈组成
- 1.微服务本体
- 2.服务间通讯工具
- 1. RestTemplate:
- 2. Feign:
- 3. Dubbo?:
- 3.负载均衡
- Ribbon:
- 4.注册中心&配置中心
- 1.Eureka:
- 2.Nacos:
- 5.网关
- 1.Gateway:
- 2.Zuul:
- 6.消息队列(MQ)
- 7.服务监控
- 8.数据与缓存
- 总结
前言
在项目伊始时,常见的SpringBoot单体项目就可以满足需求,但随着业务功能迭代和用户数量的增加,项目也不可避免地遇到以下的一些问题:
一、更新波及范围过大:某个服务更新时,需要将完整项目重新打包,停止所有服务后再次部署
二、服务性能拓展受限:单体项目只能集成在一个应用程序包中,拓展时必须要在新的计算机资源中,完整部署一个新的单体项目,无法针对某个特别需求性能的服务进行单独拓展
对于这些问题,可以使用 微服务 的部署结构来解决
一、微服务是什么?
微服务是一种软件部署架构,将每个业务功能都单独拆分成一个服务模块,每个服务模块都有属于自己的数据资源,可以自主实现个体功能而不会干扰到其他服务,需要协助完成的,通过约定的协议(HTTP/RPC)来进行通信,通过这些服务模块来组合成一个复杂的大型应用程序。
二、常用开源微服务框架演化
1. Dubbo
由阿里巴巴公司开发,于2011年底进行开源,后续捐赠给Apache基金会,成为Apache孵化器项目
在Spring Cloud出现之前,Dubbo是国内微服务部署的主流框架。
作为初代探索者,很好解决了当时微服务开发的问题,但开发相对繁琐
- 服务注册中心:zookeeper
- 服务交流协议:自订的RPC协议(Dubbo协议)
- 服务网关:无
- 配置中心:无
- 服务监控/安全维护:Dubbo-admin
2. Spring Cloud (NetFlix)
由Spring开源基金会维护,在SpringBoot项目的基础上,约定了一个微服务开发规范,整合和开发了微服务架构所需各种应用服务模块,例如注册中心、网关、负载均衡等。
在开始时,服务模块实现主要使用了NetFlix公司开源的组件,例如Eureka、Ribbon、Zuul等,这阶段也被称为Spring Cloud NetFlix,但随着这些模块原开源项目的关闭,基本都替换为了Spring自行维护的新模块,"Spring Cloud NetFlix"这一称呼也不再使用。
主要提供了新的微服务“体系”,抽象了微服务的开发模式,底层的实现模块可以更方便的替换,同时结合SpringBoot的快捷配置(start)功能,使单个微服务模块的配置效率大大提升。
- 服务注册中心:NetFlix Eureka /HashiCorp Consul
- 服务交流协议:HTTP协议(Rest API)
- 服务网关:Spring Cloud Gateway / NetFlix Zuul
- 配置中心:Spring Cloud Config
- 服务监控/安全维护:Hystrix
拓展阅读:4 年 46 个版本,一文读懂 Spring Cloud 发展历史-2020
3. Spring Cloud Alibaba
阿里巴巴公司在SpringCloud架构基础上,开发的一系列新的微服务套件实现,被称为Spring Cloud Alibaba。
提供了一些更加方便的服务组件,例如Nacos,整合了注册中心和配置中心,服务交流协议中拓展支持了Dubbo协议,可以使原Dubbo开发项目更方便地迁移,目前国内主流微服务框架学习都以此项目为准
- 服务注册中心:Alibaba Nacos
- 服务交流协议:HTTP协议(Rest API) / RPC协议(Dubbo协议)
- 服务网关:Spring Cloud Gateway / NetFlix Zuul
- 配置中心:Alibaba Nacos
- 服务监控/安全维护:Alibaba Sentinel
三、微服务架构与技术栈组成
Tips:未深入理解,仅作当前阶段总结
1.微服务本体
将单个业务功能拆分成的单独的微服务,本质是个功能更加纯粹的SpringBoot应用,拥有独立的数据库,避免各服务之间干扰。服务间通过约定的协议进行通讯,例如Dubbo/Http等
2.服务间通讯工具
1. RestTemplate:
Spring提供的带有基础封装的HTTP客户端,可以快速地将返回的json数据转成指定对象后再利用。没有负载均衡功能,需要使用其他框架,例如Ribbon等
2. Feign:
声明式编程请求客户端,使用类springmvc的controller模型,定义访问客户端接口,通过调用接口来传递数据,内部封装了Ribbon来实现负载均衡功能
3. Dubbo?:
(暂未用到,略)
3.负载均衡
负载均衡即对请求进行分流,以使各微服务的性能充分利用
Ribbon:
对于RestTemplate,需要在Bean声明方法中使用@AutoBanlance注解启用负载均衡
- 工作原理:对HTTP客户端访问的URI进行拦截,获取URI中的host(服务名),从注册中心中获取服务列表,根据负载均衡策略,替换为服务列表中的连接地址来访问
4.注册中心&配置中心
对于微服务来说,不能由业务服务本身来维护其他关联服务实例通讯地址,于是有了注册中心的概念。
业务服务运行时,在注册中心进行注册,然后由注册中心维护具体的服务列表。
1.Eureka:
基础的配置中心,Server基于服务本身维护,通过Client的心跳维护服务列表
- 服务端组成:由微服务本身构成,引入Eureka-Server依赖后,成为服务端
- 服务列表维护机制:通过Client对Server发送的心跳判断存活
- 获取服务列表的方法:Client主动请求(Pull)
2.Nacos:
更加先进的注册中心模块,同时引入了配置中心功能,可由Web UI控制
- 服务端组成:独立的执行程序,可选独立模式/集群模式
- 服务列表维护机制:
- A.通过Client对Server发送的心跳判断存活
- B.对于非临时实例,Server将会主动调用Client来判断存活,失联时仅标记而不移除出服务列表
- 获取服务列表的方法:
- Client主动请求(Pull),定时从注册中心获取,缓存至本地,消息可能不及时
- Server主动推送(Push),服务列表变动(服务失效)时主动推送,避免消息延时导致的服务通讯错误
对比Eureka提供的新功能:
- 引入服务集群和新的负载均衡策略:对服务的地域/可用区进行区分,Client使用NacosRule负载均衡策略时,对于同一个集群的服务,将优先内部调用,失效时才进行跨集群调用,并打印WARN日志
- 增加权重机制:
- 对于部署主机性能不同的服务,可以用于调整流量分布
- 可以通过权重分配,实现服务的阶段式替换更新上线,或小范围实验性运行测试
- 增加命名空间(namespace),可以用于服务之间的隔离
- 增加了配置中心功能,可以用于服务配置的统一管理和配置的热更新
5.网关
对于用户侧发过来的请求,一般不允许直接与微服务实例进行通讯,需要由网关来进行先行处理。
主要职责:
- 路由(route):由网关识别请求,来指向具体的微服务
- 过滤器(filter):在此模块中可以通过过滤器,对请求进行验证或加工等
1.Gateway:
基于Spring5的WebFlux响应式编程,性能效率更高。
- 部署:引入gateway依赖包,与其他微服务一样在注册中心中注册, 用户侧的请求都指向网关地址
- 路由:可以在配置文件中,定义一个路由表(routers)列表,在其中定义(id)路由ID、(url)服务指向URL(直接指向/lb动态均衡)、(predicates)路由断言匹配规则
- 过滤器:
- A.使用内置过滤器工厂规则,可以在路由表配置中为每个路由都定义过滤器(router-filters),或直接定义默认过滤器(default-filters)
- B.对于更高级的过滤器,可以实现GlobalFilter接口,按需求自定义实现全局过滤器(global-filter)
- 跨域配置:配置文件中通过跨域配置项(globalcors)来对指定请求类型、来源、携带请求头、携带Cookies、跨域检测有效期等进行配置
2.Zuul:
基于传统servlet的实现,阻塞式编程
(详略)
6.消息队列(MQ)
TODO
7.服务监控
TODO
8.数据与缓存
TODO
总结
微服务框架将单体项目拆成了数量更多的子服务,还引入了更多的服务模块,虽然总体更加复杂,但可以使单个服务的开发更加专注,同时也能提高计算资源的利用率。在没有更高效的架构出来之前,随着项目的发展,为避免制约,终将会朝着微服务结构改变。
Java微服务学习笔记(一):微服务架构的概念理解相关推荐
- ASP.Net学习笔记002--ASP.Net服务端控件做了什么2
ASP.Net学习笔记002--ASP.Net服务端控件做了什么2 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交 ...
- 【学习笔记】微体系结构-单周期、多周期、流水线
[学习笔记]微体系结构-单周期.多周期.流水线 前言 一.单周期 单周期直通计算机的内核结构 寄存器-寄存器数据通路 1.Load操作 2.Store操作 3.跳转指令 4.条件分支 示例 性能分析 ...
- 华为帐号服务学习笔记(四):Authorization Code模式服务端开发
笔者在<华为帐号服务学习笔记(二):OAuth2.0协议详解>中已经给大家介绍了Authorization Code模式是需要有后台服务器才能使用的,并且在<华为帐号服务学习笔记(三 ...
- java.util.List学习笔记
概述 在Java中,List是一种特殊的集合结构,即:List是一种有序的集合.在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等: List一般允许重复 ...
- java 网络编程学习笔记
java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...
- java/android 设计模式学习笔记(8)---桥接模式
这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...
- [转]Java中文处理学习笔记——Hello Unicode
Java中文处理学习笔记--Hello Unicode 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: ...
- Java中文处理学习笔记——Hello Unicode (转)
Java中文处理学习笔记--Hello Unicode (转)[@more@] Java中文处理学习笔记--Hello Unicode 作者: 车东 chedong@bigfoot.com 最后更新: ...
- Java中文处理学习笔记
Java中文处理学习笔记--Hello Unicode 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: ...
最新文章
- hibernate分页
- JavaScript如何获得input元素value值
- C#中调用C++ 动态链接库 dll 的方法
- 打造轻量化的View Controller
- Mysql:增加用户和密码,赋予权限
- 二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)
- 链表递增输出并释放空间
- 洛谷P5050 【模板】多项式多点求值
- 自学python考哪些证书-给零基础学习Python的小伙伴的四个建议
- java 字符串面试_Java字符串面试问答
- BZOJ4571: [Scoi2016]美味【主席树】【贪心】
- QML用openGL渲染NV12
- 信息系统项目管理(二)网络协议、网络存储技术、网络工程、数据仓库和中间件
- KIB、MiB、GiB
- 点云学习笔记16——pcl点云可视化
- Unix 编程三件套环境搭建
- Flutter factory关键字
- 7-1 C0216:输入矩形的长和宽,输出周长和面积
- 如何向外行解释,Bug是如何产生的?
- AR市场不明朗,VR市场方兴未艾
热门文章
- stitcher:Feedback-driven Data Provider for Object Detection论文翻译
- Wireshark网络抓包工具下载和安装(2023)
- 使用Spring发送电子邮件
- 国标28181之服务端下发云台PTZ命令浅谈
- 愿学习linux没有白白受苦
- 生成对抗网络(GAN)简单梳理
- python bottle使用实例
- 易学笔记-系统分析师考试-第2章 经济管理与应用数学/2.6 IT审计相关常识/2.6.2 IT审计程序
- c语言二级软件破解,C语言二级题库
- 2023年第八届数维杯大学生数学建模挑战赛 A题 河流-地下水系统水体污染研究