目录
一,前言
在当今这个快速变化的技术时代,软件开发模式也在不断进化。传统的单体应用已经满足不了一些场景的使用了,从而引入了微服务这一概念,微服务架构的产生,这不仅仅是技术上的革新,更是一种思维方式的转变。微服务架构以其高度的灵活性、可扩展性和容错性,正逐渐成为构建现代复杂系统的新标准。
二,微服务的基本组成部分
1.服务注册中心
服务注册中心是微服务架构中的关键组件,用于管理和维护所有服务的地址信息。常见的服务注册中心包括Eureka、Nacos,Consul和Zookeeper等。服务启动时会向注册中心注册自己的地址信息,其他服务需要调用该服务时,通过注册中心获取其地址。
2.配置中心
配置中心用于集中管理和动态更新微服务的配置信息。通过配置中心,可以在不重启服务的情况下修改配置,从而提高系统的灵活性和响应速度。常见的配置中心包括Spring Cloud Config和Apollo。
3.Api网关
API网关作为微服务架构的入口点,负责接收外部请求并将其路由到相应的后端服务。API网关还可以提供负载均衡、身份验证、请求转换等功能。常见的API网关实现包括Spring Cloud Gateway、Netflix Zuul和Kong。
4.远程调用
服务之间的通信是微服务架构中的核心部分,它决定了服务如何协同工作以完成复杂的业务流程。远程调用可以借助消息中间件,也可以基于相关的框架,常用的消息中间件有RabbitMq,RocketMq,Kafka,RedisMq等,一般用于异步通信,常用的框架有Double,Fegin,Grpc,Netty等框架,常用于实时性安全性较高的同步通信。
5. 负载均衡
负载均衡由客户端决定请求哪个服务实例,通常与服务发现结合使用,用来减轻高强度的请求,从而降低每个服务的压力,一般常见的使用的是Ribbon,Nginx。
三,如何搭建一个springCloud项目
1.环境准备及项目介绍
项目介绍
* cloud-gateway:网关微服务
* cloud-order订:单微服务
* cloud-product:商品微服务
* cloud-user:用户微服务
* fegin-api:远程调用公共组件
此处使用的是SpringCloudAlibaba作为微服务的注册中心和配置中心,使用Fegin作为远程调用,使用SpringCloudGateWay作为Api网关,负载均衡使用的是Ribbon,所以在开始前我们需要下载好Nacos组件,方便后面的开发(此处只搭建基本的环境,不做业务的扩展,如需其他的组件,后续加入即可)
2.创建一个maven空项目
去除无用的一些目录,只保留pox文件
3.加入版本控制
修改pom文件内容:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>cloud</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.3.9.RELEASE</version>
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<mysql.version>8.0.20</mysql.version>
<mybatis.version>2.1.3</mybatis.version>
<alibaba.fastjson>1.2.75</alibaba.fastjson>
<alibaba.cloud>2.2.6.RELEASE</alibaba.cloud>
</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>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${alibaba.fastjson}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${alibaba.cloud}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>
为了更好的管理整个微服务项目,此处我们需要对一些依赖做版本控制,以防止不同服务之间的同一个依赖项出现不同的版本的情况,此外,还引入了一些共用的依赖,由于依赖的传递性,在此处做引入,其他的地方就不需要再次引入了(用于一些比比较常用的依赖项,如lombok,fastjson这一类)。
4.创建微服务
1.创建微服务
点击creat创建
降低jdk版本
先去除无用的文件(看个人情况)
得到项目结构
加入模块
<modules>
<module>cloud-gateway</module>
</modules>
<packaging>pom</packaging>
修改子模块cloud-gateway
<parent>
<groupId>org.example</groupId>
<artifactId>cloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
重复上述操作创建处下面的相关服务
检查一下
2.搭建nacos的环境
启动nacos服务
进入到cmd环境运行
startup.cmd -m standalone
启动
进入nacos的web端
地址:localhost:8848/nacos,此处无需登录,如果需要登录,默认的用户名和密码都是nacos
新建命名空间(主要起环境隔离的作用,不同命名空间不能相互访问)
搭建配置中心配置文件
同理配出其他的环境,并设置端口号
3.配置网关微服务
引入相关依赖
<?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.example</groupId>
<artifactId>cloud</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>cloud-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
刷新依赖
重命名配置文件增加优先级
插入nacos配置
此处的配置应和上面nacos的配置文件名的相关信息对应,不然就会读取不到
服务名-开发环境.yaml
spring:
application:
name: cloudGateway # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
discovery:
namespace: 自己的命名空间地址
config:
file-extension: yaml # 文件后缀名
namespace: 自己的命名空间地址
测试一下
此处端口已经切换了,说明配置中心生效了
此处服务注册成功,说明注册中心配置成功
配置网关路由
server:
port: 8089
spring:
cloud:
gateway:
routes: # 网关路由配置
- id: cloud-Order # 路由id,自定义,只要唯一即可
uri: lb://cloudOrder # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- Path=/order/** # 这个是按照路径匹配,只要以/order/开头就符合要求,此处配置了。后面相应的服务就要与这个路径开头,才能转发到相应的服务
- id: cloud-User
uri: lb://cloudUser
predicates:
- Path=/user/**
- id: cloud-Product
uri: lb://cloudProduct
predicates:
- Path=/product/**
发布
4.配置其他服务
** 订单服务**
加入注册中心和配置中心的配置(此处我只讲主体的框架,对于其他的依赖按需要加入,对于公共性的依赖,加入到父模块中更好管理)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
加入nacos的配置
spring:
application:
name: cloudOrder # 服务名称
profiles:
active: dev #开发环境,这里是dev
cloud:
nacos:
server-addr: localhost:8848 # Nacos地址
config:
file-extension: yaml # 文件后缀名
namespace: 41eb9ea4-fb53-4e5a-ad1c-26b4b8718404
discovery:
namespace: 41eb9ea4-fb53-4e5a-ad1c-26b4b8718404
创建基本的包结构
编写一个简单的测试案列
搭建基本的环境配置
配置前缀,点击发布
server:
port: 8086
servlet:
context-path: /order
简单测试
启动服务
端口配置成功,服务注册成功
测试
没有走网关路由
走网关路由
测试成功
对于其他服务也像order一样的去配置,但是应记得服务名和前缀的配置和修改
重复上面的配置得到如下
此时微服务基本搭建成功
5.搭建服务间的调用
新建一个模块,建立如下包结构
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
编写fegin接口
package org.example.client.orderClient;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author: poet_Dai
* @create: 2024-11-23 16:24
* @Description:
*/
@FeignClient("cloudOrder")
@RequestMapping("/v1/order")
public interface TestOrderClient {
@PostMapping("/get")
public String get();
}
服务调用:此次由cloudUser服务调用cloudOrder服务
cloudUser端
导入公共模块api-fegin的依赖
<dependency>
<groupId>org.example</groupId>
<artifactId>fegin-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
配置api-fegin的包扫描路劲(适用于包路径与服务方的路劲不匹配的情况,如果匹配可以不配置)
package com.example.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients(basePackages = "org.example.client")
public class CloudUserApplication {
public static void main(String[] args) {
SpringApplication.run(CloudUserApplication.class, args);
}
}
引入fegin接口
package com.example.cloud.controller;
import org.example.client.orderClient.TestOrderClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: poet_Dai
* @create: 2024-11-23 16:18
* @Description:
*/
@RestController()
@RequestMapping("/v1")
public class TestController {
@Autowired
private TestOrderClient testOrderClient;
@PostMapping("/get")
public String get(){
return testOrderClient.get();
}
}
启动服务测试
测试
成功
上面是关于fegin的使用,如果在一个服务中需要用到另一个服务的接口,我们就可以像上面那样去操作,实现服务与服务之间安定调用,此处的调用时属于同步调用,如果需要使用异步调用可以引入中间件,如rabbitmq,rocketmq这一类。
四,结语
通过上面的基本配置,我们就完成了一个基本微服务的搭建,但在实际开发过程中,这往往是不够的,还需要引入其他的配置,比如rabbitmq,minio,redis,mysql等一系列的中间件,此处我们只是搭建一个环境,后续的业务部分就需要看情况而加入。