1.单体服务架构的特点
当服务单一、规模小、逻辑简单时,用一个单体服务就挺
单体服务的缺点
- 复杂程度高。维护成本越来越高,各个模块之间边界模糊,一个模块的改动可能导致整个服务出现问题,一点内存泄漏、一处指针错误就会让整个服务停机。
- 水平扩展困难。单机的容量有限,而且缺乏弹性,一荣俱荣,一损俱损。垂直扩展受到硬件约束,水平扩展也比较困难。
- 性能优化困难。单体服务支持着多个业务,多种逻辑可以交织在一起,互相影响,互相争用系统资源,在服务性能调优时很难取舍,要做出令人满意的平衡很难。
- 可测试性变差。复杂性变高、模块众多、耦合在一起的代码必然造成测试困难。
2.分布式架构的特点
使每个服务之间的耦合度降低,不再会有牵一发而动全身的风险。每个服务分别部署在相同或不同的服务器上,各自运行,也能避免因一个服务器或者一个模块、服务的失败或错误,导致整个项目宕机
分布式架构的缺点:服务之间调用变得复杂,维护成本变得更高。
3.微服务的架构特征
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复开发
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立、数据独立、技术独立、部署独立
- 隔离性强:服务调用做好隔离、容错、降级、避免级联问题
优点:服务拆分粒度更小,服务更独立,耦合度更低
缺点:架构非常复杂,运维,监控,部署难度更高。
4.走进微服务(最重要的图)
分为四大部分 注册中心、配置中心、服务网关、集群服务、
总结
- 单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统
- 分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝
- 微服务:一种良好的分布式架构方案
- ①优点:拆分粒度更小、服务更独立、耦合度更低
- ②缺点:架构非常复杂,运维、监控、部署难度提高
4.如何快速搭建一个分布式项目(重点)
1.创建一个maven项目
2.删除工程中最大的的src文件
3.修改pom.xml文件中的内容,添加如下
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<mysql.version>5.1.47</mysql.version>
<mybatis.version>2.1.1</mybatis.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.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-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
父项目搭建成功,以后有公共的依赖就可以放到父项目的pom.xml中。
4.创建新的模块
5.新模块中的pom.xml添加一下内容
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
在新模块下创建各个层对应的相关目录和主类
添加启动项
6.添加配置文件,两种yml和properties,一般使用yml。
配置文件代码如下
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/testwxx?useSSL=false
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
mybatis:
type-aliases-package: cn.itcast.user.pojo
configuration:
map-underscore-to-camel-case: true
logging:
level:
cn.itcast: debug
pattern:
dateformat: MM-dd HH:mm:ss:SSS
这样就配置完成了
2.注册RestTemplate
首先,我们在order-service服务中的OrderApplication启动类中,注册RestTemplate实例:
实现远程调用
Eureka 注册中心
Eureka的结构和作用
作用 注册服务,拉取服务,负载均衡,远程调用。
搭建eureka-server
首先大家注册中心服务端:eureka-server,这必须是一个独立的微服务
1.创建eureka-server服务 就是创建一个mouduled
2.引入eureka依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3.编写启动类
package com.tledu.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
4.编写配置文件
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
配置完成启动服务
服务注册
其实就是在其他模型的配置文件中吧eureka-server 注册进去
步骤如下
在user-service的pom文件中,引入下面的eureka-client依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件 地址和eureka 的地址一样
启动多个user-service实例
首先,复制原来的user-service启动配置:
然后,在弹出的窗口中,填写信息:
服务拉取和负载均衡
最后,我们要去eureka-server中拉取user-service服务的实例列表,并且实现负载均衡。
不过这些动作不用我们去做,只需要添加一些注解即可。
在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解: