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提供的新功能:

  1. 引入服务集群和新的负载均衡策略:对服务的地域/可用区进行区分,Client使用NacosRule负载均衡策略时,对于同一个集群的服务,将优先内部调用,失效时才进行跨集群调用,并打印WARN日志
  2. 增加权重机制:
    • 对于部署主机性能不同的服务,可以用于调整流量分布
    • 可以通过权重分配,实现服务的阶段式替换更新上线,或小范围实验性运行测试
  3. 增加命名空间(namespace),可以用于服务之间的隔离
  4. 增加了配置中心功能,可以用于服务配置的统一管理和配置的热更新

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微服务学习笔记(一):微服务架构的概念理解相关推荐

  1. ASP.Net学习笔记002--ASP.Net服务端控件做了什么2

    ASP.Net学习笔记002--ASP.Net服务端控件做了什么2 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交 ...

  2. 【学习笔记】微体系结构-单周期、多周期、流水线

    [学习笔记]微体系结构-单周期.多周期.流水线 前言 一.单周期 单周期直通计算机的内核结构 寄存器-寄存器数据通路 1.Load操作 2.Store操作 3.跳转指令 4.条件分支 示例 性能分析 ...

  3. 华为帐号服务学习笔记(四):Authorization Code模式服务端开发

    笔者在<华为帐号服务学习笔记(二):OAuth2.0协议详解>中已经给大家介绍了Authorization Code模式是需要有后台服务器才能使用的,并且在<华为帐号服务学习笔记(三 ...

  4. java.util.List学习笔记

    概述 在Java中,List是一种特殊的集合结构,即:List是一种有序的集合.在List接口的实现中,需要提供根据列表下表对元素进行操作的方法,包括:插入,删除,查询和修改等: List一般允许重复 ...

  5. java 网络编程学习笔记

    java 网络编程学习笔记 C/S模式:客户端和服务器 客户端创建流程 1 1.建立Socket端点 2 3 Socket s = new Socket(绑定地址, 绑定端口); 2.确认源数据方式和 ...

  6. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  7. [转]Java中文处理学习笔记——Hello Unicode

    Java中文处理学习笔记--Hello Unicode 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: ...

  8. Java中文处理学习笔记——Hello Unicode (转)

    Java中文处理学习笔记--Hello Unicode (转)[@more@] Java中文处理学习笔记--Hello Unicode 作者: 车东 chedong@bigfoot.com 最后更新: ...

  9. Java中文处理学习笔记

    Java中文处理学习笔记--Hello Unicode 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/07 最后更新: ...

最新文章

  1. hibernate分页
  2. JavaScript如何获得input元素value值
  3. C#中调用C++ 动态链接库 dll 的方法
  4. 打造轻量化的View Controller
  5. Mysql:增加用户和密码,赋予权限
  6. 二叉树 中序遍历 python_LeetCode 105 树 从前序与中序遍历序列构造二叉树(Medium)
  7. 链表递增输出并释放空间
  8. 洛谷P5050 【模板】多项式多点求值
  9. 自学python考哪些证书-给零基础学习Python的小伙伴的四个建议
  10. java 字符串面试_Java字符串面试问答
  11. BZOJ4571: [Scoi2016]美味【主席树】【贪心】
  12. QML用openGL渲染NV12
  13. 信息系统项目管理(二)网络协议、网络存储技术、网络工程、数据仓库和中间件
  14. KIB、MiB、GiB
  15. 点云学习笔记16——pcl点云可视化
  16. Unix 编程三件套环境搭建
  17. Flutter factory关键字
  18. 7-1 C0216:输入矩形的长和宽,输出周长和面积
  19. 如何向外行解释,Bug是如何产生的?
  20. AR市场不明朗,VR市场方兴未艾

热门文章

  1. stitcher:Feedback-driven Data Provider for Object Detection论文翻译
  2. Wireshark网络抓包工具下载和安装(2023)
  3. 使用Spring发送电子邮件
  4. 国标28181之服务端下发云台PTZ命令浅谈
  5. 愿学习linux没有白白受苦
  6. 生成对抗网络(GAN)简单梳理
  7. python bottle使用实例
  8. 易学笔记-系统分析师考试-第2章 经济管理与应用数学/2.6 IT审计相关常识/2.6.2 IT审计程序
  9. c语言二级软件破解,C语言二级题库
  10. 2023年第八届数维杯大学生数学建模挑战赛 A题 河流-地下水系统水体污染研究