集群

  • 下面介绍一个传统服务请求的全过程:
    • 用户需要通过ip(但因为ip太难记了,所以要买一个域名绑定ip)访问网站;
    • 请求进入Nginx网关,负责负载均衡(如轮询、权重)和流量转发;
    • 发送给部署了相同jar包的服务器,这样实现了高可用高并发;
    • 数据库也可以部署在多台服务器上。

      集群就是同一个功能的副本

分布式架构

  • 定义:分布式架构是将一个大型应用的功能拆分为多个小型服务(微服务),分别部署在不同的服务器上,彼此协作完成整个业务流程。
  • 下面介绍大致流程
    • 原来的大型应用的功能都被拆分成了小模块,可以去部署到同一ip下的不同位置;
    • 不同功能之间想要请求数据时要发一个http请求,获得json数据,就需要远程调用(RPC);
    • 每个服务都将自己的地址信息注册到注册中心(如Nacos、Eureka),其他服务可通过注册中心获取其地址,实现服务发现与调用;
    • 注册中心也可以进行客户端或服务端负载均衡;
    • 为了提高系统的稳定性,还会加入服务熔断、限流、降级等机制(如使用 Sentinel、Hystrix)。
  • 如果采用分布式,访问的流程
    • 先访问域名,请求还是会来到网关,网关会通过注册中心找到请求路由分发到不同的服务器上
    • 如果要微服务:SpringBoot
    • 如果是注册中心、配置中心:Spring Cloud Alibaba Nacos
    • 网关:SpringCloud GateWay
    • 远程调用:Spring Cloud OpenFeign
    • 服务熔断:Spring Cloud Alibaba Sentinel

创建SpringCloud parent项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>pom</packaging>
<groupId>com.explainsf</groupId>
<artifactId>cloud-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-demo</name>
<description>cloud-demo</description>
<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>2023.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.3.2</spring-cloud-alibaba.version>
</properties>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

  • 看父子结构,src相当于是写代码的地方,父结构只需要导入依赖,不需要写代码,所以src的都删掉;
  • 架构是cloud-demo -> service -> service-product&&servicie-order

安装nacos(naming and configuration service)

  • 注意配置好JAVA_HOME的路径,说明我变强了哈哈,能看出gpt给出来的东西是错的,明明我知道java 17安装在d盘的,之前一直被gpt忽悠在c盘,难怪配置总是失败。
  • 端口号是8848,还要加上一个/nacos
  • 配置管理就是配置中心;服务管理就是注册中心
  • 体验注册中心,也就是功能来的时候,要去哪个地方访问另一个功能。

启动微服务项目

  • 为order项目添加springboot web依赖,然后更新maven
  • 编写好注册类(添加SpringBootApplication注解)以及application.properties来确定端口号及注册中心地址。
1
2
3
spring.application.name=service-product
server.port=9000
spring.cloud.nacos.server-addr=127.0.0.1:8848

服务发现(注解:@EnableDiscoveryClient)

  • 最重要的就是启动注解@EnableDiscoveryClient,之后应该都能上层封装,可以获取ip,端口号