微服务架构与Spring Cloud

2024-05-08 17:36
文章标签 spring cloud 架构 服务 java

本文主要是介绍微服务架构与Spring Cloud,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 微服务架构

1.1 微服务架构概述

        微服务架构(Microservice Architecture, MSA)是一种新型的服务端架构设计方案,通过将应用程序拆分成多个小型、自治的服务,实现了服务的松耦合和快速迭代。

        微服务架构特征主要包括以下几个方面:

        1、基于服务的分布式架构:微服务架构将应用程序拆分成多个服务,每个服务负责一个小部分功能,服务之间通过轻量级的通信机制进行交互。

        2、可独立部署:每个微服务都是一个独立的部署单元,可以独立构建、测试和部署,避免了整个应用程序的重构和重新部署。

        3、强调自治性:微服务应该是自治的,也就是说,每个服务应该可以独立运行、管理和维护,不需要依赖其他服务或中央控制器。

        4、强调容错性:微服务架构通过重试、容错和回滚等机制来应对故障和异常,提高服务的稳定性和健壮性。

1.2 微服务架构的历史

        2014年,Martin Fowler和James Lewis在一篇名为《Microservices: a definition of this new architectural term》的博客中,正式提出了微服务架构的概念,阐述了微服务架构的定义、特点和优劣。

        在2014年至今的这一段时间里,微服务架构的发展经历了以下几个阶段:

        1、探索阶段(2014年-2015年):微服务架构在最初的阶段是一种新的概念,许多企业和组织都在尝试采用该架构。在这个阶段,微服务架构并没有成为主流的软件开发风格。

        2、推广阶段(2015年-2017年):随着对微服务架构的认识和经验的积累,越来越多的企业和组织开始采用微服务架构。在这个阶段,开源项目、云计算平台和微服务工具的出现为微服务架构的推广提供了有力的技术支持。

        3、普及阶段(2017年-至今):微服务架构在最近几年成为了软件开发的主流,越来越多的企业和组织开始探索和使用微服务架构。同时,微服务管理平台、API网关、服务网格等工具的发展也为微服务架构提供了更多的技术支持。

        另外,近年来,微服务架构有以下发展趋势:

        1、微前端:微前端是一种将前端应用程序拆分成多个小型服务来开发和维护的方式,类似于微服务架构中的服务拆分。微前端与微服务架构相结合,可以实现更加灵活的应用程序开发和部署。

        2、服务网格:服务网格是一种新兴的服务架构,它可以解决微服务架构中的服务通信和治理问题,为微服务架构提供了更加健全的技术支持。

        3、云原生:云原生是一种新的应用程序架构,它将微服务架构、容器化和DevOps文化相结合,实现了快速交付、高度可扩展以及基础设施自动化的目标,是未来软件开发的重要趋势。

        总的来说,微服务架构从探索到现在已经发展成为现代化企业软件架构的主流之一,未来对技术的创新、落地以及普及,都是微服务发展的重点。

1.3 微服务架构入门

        通过一个简单的案例来演示微服务架构的基本思想:将应用程序拆分为小的、独立的服务,每个服务负责特定的功能,并通过网络通信来协同工作。

        本案例中将开发2个微服务。用户微服务对外提供一个用户注册的接口,积分微服务提供对外提供一个为用户添加积分的接口。当用户注册时,先实现用户注册,再实现为用户赠送积分。

        本案例仅关注服务间的通信,完善的业务功能将在后续逐步实现。

        注意:为了兼容其他框架的版本,本阶段开始使用的JDK版本为1.8,Spring Boot版本为2.3.12.RELEASE。

        本案例实现步骤如下:

        1、创建管理项目。

        2、创建积分微服务项目,并开发增加积分接口。

        3、创建用户微服务项目,并开发注册接口。

        4、实现用户微服务对积分微服务的访问。

        5、综合测试。

        以下是具体实现。

        1、创建管理项目

        为便于项目代码的管理,首先新建一个父项目,项目类型为Maven项目,命名为PointSystemParent,项目的打包方式为pom。

        2、创建积分微服务项目,并开发增加积分接口

        首先,在PointSystemParent项目下新建一个Module,类型为Spring Boot项目,命名为PointService。然后,在application.yml中配置项目的基本信息。

spring:application:name: point-service
server:servlet:context-path: /point-serviceport: 8091

        接下来,新建controller包,并在controller包下新建PointController类,模拟为用户增加积分的接口。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/points")
public class PointController {@Value("${server.port}")private String port;@RequestMapping("/add")public String addPoint(Long userId) {System.out.println("为用户" + userId + "增加积分成功");return "add point success: " + port;}
}

        启动PointService项目,使用浏览器测试该接口是否正常生效。

        3、创建用户微服务项目,并开发注册接口

        首先,在PointSystemParent项目下新建一个Module,类型为Spring Boot项目,命名为UserService。然后,在application.yml中配置项目的基本信息。

spring:application:name: user-service
server:servlet:context-path: /user-serviceport: 9001

        接下来,新建controller包,并在controller包下新建UserController类,模拟用户注册的接口。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/users")
public class UserController {@RequestMapping("/register")public String register(String username) {System.out.println("用户" + username + "注册成功");return "register success";}
}

        启动UserService项目,使用浏览器测试该接口是否正常生效。

        4、实现用户微服务对积分微服务的访问

        本案例中使用Spring Boot提供的RestTemplate实现用户微服务对积分微服务的访问。

        首先,在UserService中新增config包,并在config包下新增RestTemplateConfig类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class RestTemplateConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

        然后,修改UserController中的代码。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/users")
public class UserController {@AutowiredRestTemplate restTemplate;@RequestMapping("/register")public String register(String username) {System.out.println("用户" + username + "注册成功");String url = "http://localhost:8091/point-service/points/add?userId=1";String result = restTemplate.getForObject(url, String.class);return "register success and "+result;}
}

        5、综合测试

        首先,启动PointService项目。

        然后,启动UserService项目。

        通过浏览器访问用户注册接口,查看运行效果。

        6、案例总结

        本案例将传统的单体应用中的两个模块(用户和积分)拆分成了两个独立的项目,并通过HTTP访问实现了协作。本案例存在以下问题:

        1、直接使用硬编码的URL调用服务,这种方式显得不够优雅和灵活。

        2、使用硬编码的地址调用服务,这样无法实现服务调用的动态调整和负载均衡。

        微服务架构为上述问题提供了标准的解决方案。这套解决方案的基础是服务的注册与发现。

1.4 服务注册与发现

        服务注册与发现是一种在分布式系统和微服务架构中广泛使用的关键概念,它有助于管理和维护大规模的服务群体。这个机制的核心思想是允许服务在启动时自动注册并在需要与其他服务通信时发现它们。

        1、服务注册:

  • 当一个服务启动时,它会将自己的关键信息(例如服务名称、IP地址、端口号、健康状态等)注册到服务注册中心
  • 服务注册中心通常是一个专门的服务器或服务,它负责存储和管理所有已注册的服务信息

        2、服务发现:

  • 当一个服务需要与其他服务通信时,它会向服务发现组件发送请求,请求包含目标服务的名称或标识
  • 服务发现组件会根据请求中的信息,在服务注册中心中查找并返回目标服务的详细信息

        采用注册和发现机制是一种智能而优雅的方式,可以消除硬编码 URL 带来的问题。但是,开发这一套解决方案对普通开发者来说难度较大。好在主流的微服务框架(如Spring Cloud),均提供了开箱即用的解决方案。

2 Spring Cloud

2.1 Spring Cloud概述

        Spring Cloud是基于Spring Boot开发的一组开源框架和工具,提供了微服务架构中开发分布式系统所需的各种组件和工具。该框架的出现使得在微服务架构中开发分布式系统变得更加简单和高效。

        Spring Cloud的主要特点包括:

        1、简化开发:Spring Cloud提供了一系列开箱即用的组件和工具,可以帮助开发者快速实现服务注册、发现、配置、熔断、负载均衡、分布式消息等功能,大大简化了微服务架构系统的开发和部署工作。

        2、易于集成:Spring Cloud完全兼容Spring Boot,可以方便地与其他Spring组件一起使用,同时也可以与多种第三方工具和服务集成。

        3、可扩展性:Spring Cloud支持多种云计算平台,如AWS、Azure、Oracle、Google Cloud等,可以轻松在云上部署、扩展和维护微服务。

        4、易于维护:Spring Cloud内置了多个组件和工具,可以帮助企业监控和管理微服务系统,诊断和调试系统故障。

        5、社区支持:Spring Cloud拥有活跃的社区,提供了丰富的文档资料、教程和周边工具,可以帮助开发者更快地上手和使用。

2.2 Spring Cloud的分支

        Spring Cloud的分支是指在Spring Cloud基础上进行了特定功能深度开发或集成其他技术栈(如阿里巴巴、Kubernetes、AWS等)的变种。目前比较主流的Spring Cloud分支有:

        1、Spring Cloud Netflix:Netflix是Spring Cloud最早的支持者之一,提供了一系列的分布式微服务组件,包括服务注册和发现、客户端负载均衡、断路器、智能路由、API网关等。

        2、Spring Cloud Alibaba:阿里巴巴是Spring Cloud的另一个重要贡献者,提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息总线、链路追踪等,能够与阿里云上的云服务集成。

        3、Spring Cloud AWS:AWS是Amazon云计算平台,Spring Cloud AWS提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息队列等,能够与Amazon Web Services集成。

        4、Spring Cloud GCP:GCP是Google的云计算平台,Spring Cloud GCP提供了一系列的分布式微服务组件,包括服务注册和发现、配置中心、消息总线等,能够与Google云服务集成。

        5、Spring Cloud Azure:Azure是微软的云计算平台,Spring Cloud Azure提供了一系列的分布式微服务组件,能够与Azure上的众多云原生服务(如CosmosDB、Storage、Service Bus等)无缝集成,以实现更方便的部署、管理和扩展微服务。

这篇关于微服务架构与Spring Cloud的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970978

相关文章

测试服务搭建之centos7下安装java

一 安装Java 1 创建普通用户 useradd userNameTest passwd userNameTest 提示输入密码:【输入wujian的密码】 user:userNameTest group:root passwd:123456789   2 给“userNameTest”分配root权限 vi /etc/sudoers 在文件中找到 # %wheel ALL=(

selenium +java 多个类公用driver问题

问题点:太久没有写selenium代码,居然把driver公用的问题忘记了,即:每写一个测试类,执行过程中都会新建一个窗口,这样应该说是非常不专业的。 大概想了一个方法,虽然看起来也不怎么专业,但感觉能用就很开心了。 解决步骤:                1 创建一个获取获取driver的方法getDriver()                2 创建成员变量,将 getDriver()赋值

IDEA +maven git tomcat database数据库 调试 插件 log4j Spring junit

前言 idea优化配置、常规配置、配置maven、git、tomcat、database数据库、调试配置、插件配置、log4j配置、Spring配置等等,稍后一一更新! 优化配置(#item1 “item1”) 打开文件 :“idea – > bin – >idea64.exe.vmoptions” -Xms: 初始内存;-Xmx : 最大内存;-ReservedCodeCache

4-Springboot集成FLOWABLE之流程驳回

目录标题 演示地址效果功能后端代码补充 演示地址 效果 功能 默认驳回到上一节点 后端代码 flowable自带驳回功能, 在源码ProcessInstanceResource.class下已有该功能,不需要自己额外去写 @ApiOperation(value = "Change the state a process instance", tags = { "Pr

bimface 模型集成-后端(java)上传、发起转换、获取转换状态

目录 前言后端架构流程存储表结构全局工具类先根据appid, appsecret 生成accesstoken, 保存到自己的存储服务器。利用保存的 accesstoken 上传模型发起转换获取转换状态根据bimface文件ID获取模型viewtoken, 获取到viewtoken就可以利用前端浏览模型或图纸了 前言 之前没有注意官方有个sdk,然后自己就实现了这么个逻辑。建议

三种主流web服务实现

目前知道的三种主流的Web服务实现方案为:   REST:表象化状态转变 (软件架构风格)   SOAP:简单对象访问协议   XML-RPC:远程过程调用协议   下面分别作简单介绍:   REST:表征状态转移(Representational State Transfer),采用Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 将所有

JavaScript的变量申明提前

变量提升 JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部: 只是将变量的申明提前,而不提前变量的值和函数的值 'use strict';function foo() {var x = 'Hello, ' + y;alert(x);var y = 'Bob';}foo(); 虽然是strict模式,但语句var x = 'Hell

使用frp把内网http服务映射到外部网络

使用的软件为frp,地址为: https://github.com/fatedier/frp A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. 一个快速的反向代理,可以帮助你暴露在NAT或防火墙后面的内网本地的服务器给互联网。 Windows7  本

Java ArryList

ArrayList简介 ArrayList就是传说中的动态数组,用MSDN中的说法,就是Array的复杂版本,它提供了如下一些好处: 1、动态的增加和减少元素; 2、实现了ICollection和IList接口 ; 3、灵活的设置数组的大小; ArrayList的基本用法 1、创建一个动态数组,并赋值 //创建一个动态数组ArrayList list = new ArrayL

SpringBoot 学习六:数据库的增删改查

1、新建一个Girl类,添加如下代码: package controlle;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entitypublic class Girl {@Id@GeneratedValueprivate Integer