Java微服务学习笔记(一):微服务架构的概念理解

Java微服务学习笔记

Tips:入门学习时粗略整理,仅供参考
(一):架构的基础理解



前言

在项目伊始时,常见的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

总结

微服务框架将单体项目拆成了数量更多的子服务,还引入了更多的服务模块,虽然总体更加复杂,但可以使单个服务的开发更加专注,同时也能提高计算资源的利用率。在没有更高效的架构出来之前,随着项目的发展,为避免制约,终将会朝着微服务结构改变。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值