微服务技术选型之路

摘要:
本文根据作者的个人经验,描述了微服务方面的技术选择和相关知识点。前几年流行的微服务技术包括阿里巴巴的Dubbo方案。本文主要介绍了Spring系统下的微服务技术选择方案。要构建一套微服务技术选择,可以参考以下方案:不同的技术选项有不同的应用场景:网关:如果整个公司的业务是基于Java开发的,那么可以直接使用Spring Gateway作为网关。③ 实现网关级的网关和微服务交互技术包括SpringGateWay、Kong网关等。

    本文以笔者个人经历讲述关于微服务方面的技术选型和相关知识点。微服务模式的项目从初建到上线部署应用,每一个环节都会涉及到相当多的技术细节(上线后的性能调优更需要)。本文着重介绍一套微服务搭建流程中面临的一些技术选型,战略性的技术方案及相关技术的简要介绍,不做每一项技术的深入说明。

 微服务简介

    微服务是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。微服务也指一种种松耦合的、有一定的有界上下文的面向服务架构。

    微服务是系统架构上的一种设计风格,主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP/HTTPS协议的RESTful API进行通信协作,也可以通过RPC协议进行通信协作。被拆分成的每一个小型服务都围绕着系统中一些耦合度较高的业务功能进行构建,并且每个服务都维护着自身的数据存储,业务开发,自动化测试案例以及独立部署机制。由于有了轻量级的通信协作基础,所以这些微服务可以使用不同的语言来编写。

微服务的优点

  • 每个微服务都很小,这样能够聚焦一个指定的业务功能或业务需求。
  • 微服务能够被小团队单独开发,这个小团队是2到5人的开发人员组成。
  • 微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
  • 微服务能使用不同的语言开发,如Java、Python、PHP、C#等。
  • 微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如Jenkins, Travis CI等工具。
  • 一个团队的新成员能够更快投入生产。
  • 微服务易于被一个开发人员理解,修改和维护,这样小团队能够更关注自己的工作成果。无需通过合作才能体现价值。
  • 微服务方便融合最新技术。
  • 微服务只是业务逻辑的代码,不会和HTML,CSS 或其他界面组件混合。
  • 微服务能够即时被要求扩展。
  • 微服务能部署中低端配置的服务器上。
  • 易于和第三方应用系统集成。
  • 每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库。

 微服务技术选型

     前几年较为火的微服务技术有阿里的Dubbo方案。后面又出现了Spring体系下的微服务方案。本文主要介绍Spring体系下的微服务技术选型方案。

微服务技术选型之路第1张

     构建一套微服务最基本的是需要搭建网关,注册中心,开发具体实现业务功能的服务。对于各个微服务之间的通信,可通过Feign方案处理。具体搭建一套微服务技术选型可参考如下方案:

微服务技术选型之路第2张

    不同的技术选择应用的场景不同:

  • 网关:若整个公司业务都基于java开发,可以直接使用Spring Gateway做网关。若还存在其他的开发语言,也可选择kong网关模式。
  • 注册中心:基于java开发,Spring体系下可直接用 Spring Eureka。若还存在其他语言编写的服务,可使用Consul。
  • 微服务搭建:各自语言都可以搭建。若采用java开发,可参考Spring boot方案搭建微服务。
  • 持续集成的方案,三种都可以。若基于java开发,第一种最为传统,运维人员或开发人员工作更多,需编写启动脚本,使用jdk命令启动java程序。建议使用第二种方案。第三种方案操作更为简便,但需用阿里云的产品。
  • Spring Boot 项目构建:采用Spring Boot模式搭建微服务项目时,对于Maven项目pom.xml配置文件的使用需注意pom文件配置单项目模式和项目聚合模式的区别。对于网关,注册中心可采用单项目模式。但在搭建真正业务的服务时,建议采用父子级项目聚合的方式。笔者最初做微服务开发时,采用了单项目的模式,当开发了多个业务的微服务后,单项目模式在引用依赖项目版本,管理项目时极为不便。

微服务技术落地

    搭建完成一个具体微服务项目后,微服务的整体应用流程可参考如下方案:

    微服务技术选型之路第3张

    对于一套基于微服务框架搭建的系统,在落地应用时。需关注如下几个核心点:

①应用前端与后端规划

  • 推荐技术方案:Vue.js+Spring boot+Spring Shiro.
  • 实现应用层面的前后端分离,可采用的技术方案较多。重点关注前后端分离带来的性能,安全性问题。对于权限安全模块,推荐引入Spring Shiro权限框架。

②后端与网关交互

    采用微服务模式,应用业务的后端主要是通过网关调用已经存在的微服务接口,本身不操作底层的数据库,不用编码实现真正的业务功能。但针对一些应用的个性化的需求,可建立应用数据库,本身开发功能完成业务支撑。一个应用的后端可通过网关调用多个微服务提供的接口。

微服务与网关的这一层关系主要作用有两点:

  • 后端通过网关调用不同的微服务接口,技术方案:Spring Feign。
  • 网关统一设置权限认证,限流等处理(类似于拦截器的功能)。保证后端合法合规的调用微服务接口。 后端与网关之间的认证技术方案:JWT。限流方案:Spring GateWay自带限流功能。

③网关与微服务交互

    实现网关层面的技术有:Spring GateWay,Kong网关等。本质都是从一个服务访问地址列表中选择具体的服务地址路径,访问具体的微服务。

    Spring Gateway一般配合Spring Eureka服务注册与治理,Spring Eureka动态生成可访问的服务地址列表。

    Kong网关模式可设置配置文件,直接把相关的微服务地址放入到配置文件中。当微服务地址发生变化时,在手动去更新配置文件。

④服务注册中心与服务治理

  • 推荐技术方案:Spring Eureka,Consul
  • Spring Eureka主要功能就是完成具体微服务的注册和治理。通过监听微服务的心跳,动态的维护可访问的服务地址列表。新增的微服务地址可动态的加入到注册中心,不可用的微服务地址可自动剔除。当一个微服务分布式布置时,设置不同的策略模式(随机,权重,选举)供调用方获取服务访问地址。
  • Consul:提供不同开发语言的服务注册到中心(如Java开发的服务和php开发的服务)。

⑤业务数据库与数据仓库的融合

    各个微服务本身具有各自独立的数据库,不同的微服务之间的数据库不可相互访问。如商品服务具有独立的商品库,订单服务具有独立的订单库。若需要做商品销售的综合报表分析时,需要获取商品库数据和订单库数据。这里便引发了数据仓库的需求。数据仓库作用是统一汇总各个业务数据库的数据,根据综合业务,形成新的数据。生成数据仓库的方案:

  • 数据备份:定时拉取各个子业务系统的数据表,做简单的同步操作。
  • 数据清洗:采用大数据方案,拉取业务数据,清洗数据,根据综合应用的需求,重新生成新的应用数据模型。

⑥微服务之间的调用

  • 推荐技术方案:Spirng Feign
  • 不同的微服务之间存在接口交互需求,在微服务接口交互中,重点关注服务熔断,服务负载均衡,服务请求三个环节。Spirng Feign内置了熔断和负载功能,并封装了Http调用流程。方便开发人员调用不同的服务接口。

微服务相关知识点

    本文针对Spring体系下微服务常用的几个知识点做简要说明,具体细节,原理,如何应用可通过关键词搜索详细了解。

Spring Boot

    Spring Boot是由 Pivotal团队提供的全新框架,其设计目的是用来简化新 Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

Spring Boot的核心思想就是约定大于配置,一切自动完成。采用 Spring Boot可以大大的简化开发模式,通过组件的模式集成常用的框架。

Spring Cloud

    Spring Cloud是一系列框架的有序集合。它利用 Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线线、负载均衠、断路器、数据监控等,都可以用 Spring Boot的开发风格做到一键启动和部署。 Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组台起来,通过 Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系統开发工具包。

     微服务是可以独立部署、水平扩展、独立访问(或者有独立的数据库)的服务单元, Spring Cloud就是这些微服务的大管家,采用了微服务这种架构之后,项目的数量会非常多, Spring Cloud做为大管家就需要提供各种方案来维护整个生态。

    Spring Cloud就是一套分布式服务治理的框架,既然它是一套服务治理的框架,那么它本身不会提供具体功能性的操作,更专注于服务之间的通讯、熔断、监控等。因此就需要很多的组件来支持一套功能。

    Spring Cloud的子项目,大致可分成两类,一类是对现有成熟框架”Spring Boot化”的封装和抽象,也是数量最多的项目;第二类是开发了一部分分布式系统的基础设施的实现,如Spring Cloud Stream扮演的就是kafka, ActiveMQ这样的角色。

 Spring Cloud Eureka

    Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

Spring Cloud Gateway

    Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代Netflix ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。

Spring Cloud Feign

    Feign是一个伪客户端,即它不做任何的请求处理。Feign通过处理注解生成request,从而实现简化HTTP API开发的目的,即开发人员可以使用注解的方式定制request api模板,在发送http request请求之前,feign通过处理注解的方式替换掉request模板中的参数,这种实现方式显得更为直接、可理解。

    Feign封装了Http调用流程,更适合面向接口化的编程习惯。在服务调用的场景中,我们经常调用基于Http协议的服务,而我们经常使用到的框架可能有HttpURLConnection、Apache HttpComponnets、OkHttp3 、Netty等等,这些框架在基于自身的专注点提供了自身特性。而从角色划分上来看,他们的职能是一致的提供Http调用服务。

免责声明:文章转载自《微服务技术选型之路》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇react根据后台返回的组件路径动态的引入组件(react动态加载组件)SpringBoot开发文档下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring框架系列(六)--事务Transaction

  本文绝大部分内容为转载,原文地址:https://blog.csdn.net/trigl/article/details/50968079   除此之外,后面还有延伸内容   事务在企业日常开发中几乎是一定会遇到的,例如一个审核的流程可能涉及到查询、修改、插入等操作,所以保证事务性是很有必要的。一般就是开启事务支持,然后@Transactional,但...

SpringBoot整合Mybatis,TypeAliases配置失败的问题

SpringBoot整合Mybatis,TypeAliases配置失败的问题 问题描述 在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来。 在Mybatis的文档明确写出,如果你没有明确定义实体类的Aliase,框架会自动将Class Name自动 作为别名。 那么问题来了,当使用java -jar xxx.jar&启动的时候...

Semantic UI 中文参考手册

一个拥有友好词汇表的前端框架,完全语义化的前端界面开发框架,为一组开发人员之间共享UI元素配备了规格。使用的词汇(类和ID)相比其它替代品更加简洁,从而降低了学习曲线。有许多HTML元素,UI元素和场景(按钮,表格,表格,手风琴,导航,注释..)的样式。使用LESS作为预处理器。 它有很多非常酷的元素,如可折叠功能、3D动画等,而且动画效果看起来比Boot...

团队介绍&学长采访

1. 团队介绍       刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔 我绝对不知道,我一个写代码的怎么就当PM去了?         张安澜 博客园ID:MinstrelZ 身份:开发 个人介绍: 张安澜,来自北京航空航天大学2015级计算机学院,喜欢旅游,修仙党,lol大乱斗选手,吃鸡...

SpringApplication类-1

SpringApplication类提供了一种方便的方法来引导从main()方法启动的Spring应用程序。在许多情况下,可以委托给静态SpringApplication.run方法,如下例所示: public static voidmain(String[] args) { SpringApplication.run(MySpringConfig...

从零开始手写 dubbo rpc 框架

rpc rpc 是基于 netty 实现的 java rpc 框架,类似于 dubbo。 主要用于个人学习,由渐入深,理解 rpc 的底层实现原理。 前言 工作至今,接触 rpc 框架已经有很长时间。 但是对于其原理一直只是知道个大概,从来没有深入学习过。 以前一直想写,但由于各种原因被耽搁。 技术准备 Java 并发实战学习 TCP/IP 协议学习笔记...