java微服务常用技术
Spring Cloud Alibaba
1 系统架构演进
随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。
1.1 单体架构
早期的软件系统通常是基于单体应用架构设计的,也就是将整个系统作为一个单一的、可执行的应用程序来构建和维护。
如下图所示:
单体架构具有以下优点:
1、简单:单体架构模式相对于其他复杂的架构来说,其结构简单易用,便于新手学习和应用。
2、易于维护:由于整个应用程序都在一个代码库中,因此很容易对其进行维护和更新。
3、易于部署:单个可执行文件可以在任何支持运行该语言的环境中运行,并且部署也相对轻松。
然而,单体架构也存在一些缺点:
1、扩展性差:单体应用程序所有功能都在一个程序中实现,因此扩展功能时需要新增或修改源代码,并重新部署整个应用程序,这可能会导致系统不
稳定和长时间停机。
2、可靠性低:由于单体应用程序集成了所有的逻辑和组件,因此如果其中有一个非常重要的组件出现故障,则可能导致从整个系统崩溃。
3、风险高:单体应用程序中的错误往往比较难以调试,因为代码复杂度高且耦合度强。 综上所述,单体架构适用于小型、简单的软件系统,但是对于
大型、复杂的系统来说,单体架构面临诸多挑战,需要采用其他更加灵活和可扩展的架构模式。
1.2 微服务架构
随着互联网的不断发展,软件系统的架构也是在不断的更新。由原先的单体架构逐渐演变成分布式系统架构,在到目前非常主流的微服务系统架构。
分布式系统架构是指将一个软件系统分割成多个独立的服务,并且这些服务可以在不同的计算机或服务器上运行,并通过网络进行通信。
微服务系统架构:本质上也属于分布式系统架构,在微服务系统架构中,更加重视的是服务拆分粒度。
如下图所示:
微服务架构的特点:
1、单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
2、自治:团队独立、技术独立、数据独立,独立部署和交付
3、面向服务:服务提供统一标准的接口,与语言和技术无关
微服务系统架构的优点:
1、可扩展性好:由于系统中的不同组件可以独立地进行扩展和升级,从而提高了整个系统的扩展性和可靠性。
2、容错性高:由于系统中的组件可以在不同的计算机或服务器上运行,因此即使某些节点出现故障也不会影响整个系统的运行。
3、高效性强:分布式系统可以将负载和任务分配到不同的节点上,从而提高系统的并发能力和处理速度。
4、灵活性强:分布式系统可以支持多种编程语言和应用程序框架,并且可以利用各种云计算技术,如Docker、Kubernetes等。
微服务系统架构的存在的问题:
1、微服务的管理:这些微服务如果没有进行统一的管理,那么维护性就会极差。
2、服务间的通讯:微服务之间肯定是需要进行通讯,比如购物车微服务需要访问商品微服务。
3、前端访问问题:由于每一个微服务都是部署在独立的一台服务器的,每一个微服务都存在一个对应的端口号,前端在访问指定微服务的时候肯定需
要指定微服务的ip地址和端口号,难道需要在前端维护每一个微服务的ip地址和端口号?
4、配置文件管理:当构建服务集群的时候,如果每一个微服务的配置文件还是和微服务进行绑定,那么维护性就极差。
1.3 分布式和集群
分布式:由多台服务器构成的网络环境,在分布式环境下每一台服务器的功能是不一样的。
集群: 由多台服务器构成的网络环境,在集群环境下每一台服务器的功能是一样的。
分布式环境中每一台服务器都可以做集群,如下图所示:
2 Spring Cloud Alibaba概述
针对微服务系统架构所存在的问题,肯定是需要有具体的技术来解决,而所使用到的技术就是Spring Clouad Alibaba。那么想要了解Spring Clouad
Alibaba,那么就需要先了解一下Spring Cloud。
2.1 Spring Cloud简介
1、Spring Cloud 是一系列框架的有序集合。在Spring Cloud这个项目中包含了很多的组件【子框架】,每一个组件都是用来解决问题系统架构中所遇
到的问题,因此Spring Cloud可以看做是一套微服务的解决方案。
2、Spring Cloud中常见的组件:Eureka(服务注册中心)、Openfeign(服务远程调用)、Gateway(服务网关)、Spring Cloud Config(统一配置中心)等。
3、Spring Cloud项目官方网址:Spring Cloud
4、Spring Cloud依赖于Spring Boot,并且有版本的兼容关系,如下所示:
2.2 Spring Cloud Alibaba简介
Spring Cloud Alibaba是阿里针对微服务系统架构所存在的问题给出了一套解决方案,该项目包含了微服务系统架构必须的一些组件。
常见的组件可以参看官网地址:Spring Cloud Alibaba Reference Documentation
注意:
1、Spring Cloud Alibaba中所提供的组件是遵循Spring Cloud规范的,两套技术所提供的组件是可以搭配使用的。
2、在现在企业开发中往往是两套技术组件搭配进行使用:Nacos(服务注册中心和配置中心)、Openfeign(远程调用)、Ribbon(客户端负载均衡器)、
Gateway(服务网关)、Sentinel(服务保护组件)等。
3 微服务环境准备
要想学习Spring Cloud Alibaba,那么此时就需要有一个微服务的系统环境。本章节我们就来使用Spring Boot来搭建两个微服务,分别是用户微服务
和订单微服务。
3.1 工程结构说明
在创建微服务工程的时候都需要先提供一个父工程,使用父工程来管理多个微服务所需要的依赖。我们的微服务系统结构如下所示:
3.2 父工程搭建
具体步骤如下所示:
1、创建一个spzx-cloud-parent的maven项目
2、在pom.xml文件中加入如下依赖
<!-- 定义属性 -->
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>2022.0.2</spring-cloud.version>
<spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version>
<mybatis-spring-boot.version>3.0.1</mybatis-spring-boot.version>
<mysql.version>8.0.29</mysql.version>
</properties>
<!-- 指定spring boot父工程 -->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>3.0.5</version>
</parent>
<dependencyManagement> <!-- 在dependencyManagement标签中所定义的依赖不会被子工程直接进行继承 -->
<dependencies>
<!-- spring cloud的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- mysql的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- mybatis和spring boot整合的起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3、删除src目录
3.3 用户微服务搭建
3.3.1 基础环境搭建
步骤:
1、导入课程资料中所提供的user.sql数据库脚本。
2、在spzx-cloud-parent下面创建一个子模块spzx-cloud-user
3、在pom.xml文件中加入如下依赖
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- spring boot的web开发所需要的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis和spring boot整合的起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!-- lombok依赖,快速生成getter和setter方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
4、在resources目录下创建一个application.yml文件,文件的内容如下所示:
# 配置服务端口号
server:
port: 10100
# 配置数据库的连接信息
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.136.142:3306/spzx-cloud-user?characterEncoding=UTF8
username: root
password: 1234
# 配置mybatis的相关信息
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
type-aliases-package: com.atguigu.spzx.cloud.user.entity
mapper-locations: classpath:/mapper/*.xml
3.3.2 基础代码编写
需求:在user微服务中提供一个根据用户的id查询用户详情的接口
具体步骤:
1、编写启动类
// com.atguigu.spzx.cloud.user
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class , args)