springcloud微服务框架简单上手
文章目录
- springcloud微服务框架简单上手
 - 一、SpringCloud简单介绍
 - 1.1 单体架构
 - 1.2 分布式架构
 - 1.3 微服务
 
- 二、SpringCloud与SpringBoot的版本对应关系
 - 2022.x 分支
 - 2021.x 分支
 - 2.2.x 分支
 
- 三、Nacos注册中心
 - 3.1 认识和安装Nacos
 - 3.2 配置Nacos
 - 3.3 nacos部署springboot项目
 
- 四、http客户端Feign
 - 4.1 Feign的介绍
 - 4.2 自定义实现Feign
 - 4.3 Feign实践
 
- 五、统一网关Gateway
 - 5.1 为什么要使用网关
 - 5.2 搭建网关服务
 - 5.3 测试网关GateWay
 
前言:作者是通过自己的项目所运用作为讲解,分享只是作者用到的方面
一、SpringCloud简单介绍
- SpringCloud是目前国内使用最广泛的微服务框架。官网地址:https://spring.io/projects/spring-cloud。
 - SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验:
 

1.1 单体架构
单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
**优点 **:
 架构简单
 部署成本低
缺点:
 耦合度高
如下就是简单的单体架构图

1.2 分布式架构
分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。
 优点:
 降低服务耦合
 有利于服务升级拓展
如下就是简单的分布式架构图

1.3 微服务
微服务:是一种经过良好架构设计的分布式架构方案
微服务架构特征:
 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责,避免重复业务开发
 面向服务:微服务对外暴露业务接口
 自治:团队独立、技术独立、数据独立、部署独立
 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
如下就是简单的微服务架构图

二、SpringCloud与SpringBoot的版本对应关系
2022.x 分支
适配 Spring Boot 3.0,Spring Cloud 2022.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记): (注意,该分支 Spring Cloud Alibaba 版本命名方式进行了调整,未来将对应 Spring Cloud 版本,前三位为 Spring Cloud 版本,最后一位为扩展版本,比如适配 Spring Cloud 2022.0.0 版本对应的 Spring Cloud Alibaba 第一个版本为:2022.0.0.0,第个二版本为:2022.0.0.1,依此类推)
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version | 
|---|---|---|
| 2022.0.0.0* | Spring Cloud 2022.0.0 | 3.0.2 | 
| 2022.0.0.0-RC2 | Spring Cloud 2022.0.0 | 3.0.2 | 
| 2022.0.0.0-RC1 | Spring Cloud 2022.0.0 | 3.0.0 | 
2021.x 分支
适配 Spring Boot 2.4,Spring Cloud 2021.x 版本及以上的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version | 
|---|---|---|
| 2021.0.5.0* | Spring Cloud 2021.0.5 | 2.6.13 | 
| 2021.0.4.0 | Spring Cloud 2021.0.4 | 2.6.11 | 
| 2021.0.1.0 | Spring Cloud 2021.0.1 | 2.6.3 | 
| 2021.1 | Spring Cloud 2020.0.1 | 2.4.2 | 
2.2.x 分支
适配 Spring Boot 为 2.4,Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本按从新到旧排列如下表(最新版本用*标记):
| Spring Cloud Alibaba Version | Spring Cloud Version | Spring Boot Version | 
|---|---|---|
| 2.2.10-RC1* | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE | 
| 2.2.9.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE | 
| 2.2.8.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE | 
| 2.2.7.RELEASE | Spring Cloud Hoxton.SR12 | 2.3.12.RELEASE | 
| 2.2.6.RELEASE | Spring Cloud Hoxton.SR9 | 2.3.2.RELEASE | 
| 2.2.1.RELEASE | Spring Cloud Hoxton.SR3 | 2.2.5.RELEASE | 
| 2.2.0.RELEASE | Spring Cloud Hoxton.RELEASE | 2.2.X.RELEASE | 
| 2.1.4.RELEASE | Spring Cloud Greenwich.SR6 | 2.1.13.RELEASE | 
| 2.1.2.RELEASE | Spring Cloud Greenwich | 2.1.X.RELEASE | 
| 2.0.4.RELEASE(停止维护,建议升级) | Spring Cloud Finchley | 2.0.X.RELEASE | 
| 1.5.1.RELEASE(停止维护,建议升级) | Spring Cloud Edgware | 1.5.X.RELEASE | 
spring cloud alibaba、spring cloud、spring boot版本对应:来自 gitHub 中的spring cloud alibaba官方说明:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
spring官网:https://spring.io/
spring历史官方文档:https://docs.spring.io/spring-cloud/docs/
spring离线依赖及文档下载地址:https://repo.spring.io/ui/native/libs-release-local/org/springframework/
 
三、Nacos注册中心
3.1 认识和安装Nacos
Nacos 是一个开源的分布式服务发现、配置管理和服务管理平台。它提供了服务注册与发现、配置管理、服务健康监测等功能,可以帮助开发者构建和管理云原生微服务架构。
具体来说,Nacos 提供了以下核心功能:
- 服务注册与发现(Service Discovery):允许服务实例注册到 Nacos,并通过 Nacos 客户端发现其他服务实例。这样,服务之间可以动态地发现和通信,实现了微服务架构中的服务发现功能。
 - 配置管理(Configuration Management):Nacos 提供了统一的配置管理平台,允许开发者集中管理微服务的配置信息,支持配置的动态变更和实时推送,从而提高了配置管理的灵活性和可靠性。
 - 服务健康监测(Health Check):Nacos 会定期检查服务实例的健康状态,确保只有健康的服务实例会被注册到服务发现中,并且及时地将不健康的实例移除,从而提高了整个系统的稳定性和可用性。
 
Nacos下载
链接:https://pan.baidu.com/s/1gwHPkvylWLtrjQYQCwmqqw?pwd=T401
 提取码:T401
3.2 配置Nacos
Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

修改其中的内容为其他端口

启动nacos,进入bin目录, 然后 cmd 进入该目录执行命令
./startup.cmd -m standalone
 
出现下面内容即可

如果觉得在cmd输入命令麻烦可以修改脚本, 编辑start.cmd脚本,将集群模式修改为单机模式,在bin目录下右击startup.cmd文件,用记事本的方式打开,将MODE改成standalone即可,如下图所示

这样直接双击startup.cmd即可运行nacos

ctrl+左键点击命令窗口给的地址

nacos账号: nacos
nacos密码: nacos

到此nacos安装完成
3.3 nacos部署springboot项目
父工程
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
 
添加nacos的客户端依赖
 
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
 
修改需要更改服务的中的application.yml文件
spring:  
  application:  # 应用配置项
    name: dataAccountService  # 应用名称为 dataAccountService
  cloud:  
    nacos: 
      server-addr: localhost:8848  # Nacos 服务端地址为 localhost:8848
      discovery:  # Nacos 服务发现配置项
        cluster-name: CQ  # 使用的 Nacos 集群名称为 CQ
 
启动springboot项目和nacos,出现自己配置的服务,及完成nacos的简单部署,在我的项目中,nacos主要做的是服务注册与发现,并没有其他内容,如果有需要可以参考其他博客

四、http客户端Feign
4.1 Feign的介绍
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign
 其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
Feign 的主要优势在于:
- 声明式 API 定义:Feign 允许开发者使用接口和注解来定义 RESTful 服务的请求和响应,而无需关心底层的 HTTP 请求和响应处理逻辑。通过编写简单的 Java 接口和添加 Feign 注解,就可以定义服务调用的各种细节,比如 URL、HTTP 方法、请求参数、请求头等。
 - 模板化请求:Feign 提供了一套模板化的请求构建和发送机制,使得开发者可以轻松地构造 HTTP 请求并发送到目标服务端点。Feign 会根据接口定义和注解配置,自动构造出对应的 HTTP 请求,并将请求参数、请求头等信息注入到请求中。
 - 集成了负载均衡和服务发现:Feign 可以与 Spring Cloud 中的服务发现组件(如 Eureka、Consul 等)和负载均衡组件(如 Ribbon)集成,从而实现服务之间的负载均衡和自动服务发现。开发者可以直接通过服务名来调用其他微服务,而无需硬编码服务的地址和端口。
 - 可扩展性:Feign 提供了丰富的扩展点,开发者可以通过自定义编码器、解码器、拦截器等来扩展 Feign 的功能,从而满足各种特定的业务需求。
 

Feign运行自定义配置来覆盖默认配置,可以修改的配置如下:
| 类型 | 作用 | 说明 | 
|---|---|---|
| feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL | 
| feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 | 
| feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 | 
| feign. Contract | 支持的注解格式 | 默认是SpringMVC的注解 | 
| feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 | 
4.2 自定义实现Feign
导入依赖
如果服务A需要调用服务B的方法,则将依赖写入服务A的pom文件中,既服务A是消费者
        <!--        feign消费者-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
 
配置Feign日志有两种方式:
 方式一:配置文件方式
 全局生效:
feign:
  httpclient:
    enabled: true
  client:
    config:
      default:  # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
        logger-level: NONE #日志级别
 
局部生效
feign:
  httpclient:
    enabled: true
  client:
    config:
      dataAssetService:  # 这里用dataAssetService就是局部配置,只对dataAssetService服务生效
        logger-level: NONE #日志级别
 
方式二:编程方式,先声明一个Bean:
public class FeignClientConfiguration {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.BASIC; 
    }
}
 
而后如果是全局配置,则把它放到@EnableFeignClients这个注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class) 
 
如果是局部配置,则把它放到@FeignClient这个注解中:
@FeignClient(value = "dataAssetService", configuration = FeignClientConfiguration.class) 
 
4.3 Feign实践
方式一(继承):给消费者的FeignClient和提供者的controller定义统一的父接口作为标准。
-  
服务紧耦合
 -  
父接口参数列表中的映射不会被继承
自定义Feign 客户端接口
 
//被消费的服务名称
@FeignClient(name = "dataManagementService")
public interface dataAssetClient {
    /**
     * 获取数据标准信息
     * @param dataStandardCode 
     * @return
     * /dataStandard/getDataStandardInfo为被消费的接口路径
     */
    @GetMapping("/dataStandard/getDataStandardInfo")
    R getDataStandard(@RequestParam("dataStandardCode") String dataStandardCode);
}
 
消费者的controller
/**
 * <p>
 * 数据资产表 前端控制器
 * </p>
 *
 * @author 不入青山入我怀
 * @since 2024-03-21
 */
@RestController
@RequestMapping("/dataAsset")
public class DataAssetController {
    @Autowired
    private dataAssetClient dataassetClient;//数据标准目录
     /**
     * 远程调用其他接口
     * /dataAsset/getDataStandard 在该服务调用其他服务的接口路径
     * @return
     */
    @GetMapping("getDataStandard")
    public R getDataStandard() {
        return dataassetClient.getDataStandard("");
    }
}
 
被消费者controller(正常写就行)
    /**
     * 获取数据标准信息
     * @param dataStandardCode
     * @return
     */
    @GetMapping("getDataStandardInfo")
    public R getDataStandardInfo(@RequestParam("dataStandardCode") String dataStandardCode){
        return dataStandardService.getDataStandardInfo(dataStandardCode);//实现具体逻辑
    }
 
作者的Feign的实现逻辑

你也可以将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用,如下图

五、统一网关Gateway
5.1 为什么要使用网关
- 路由与负载均衡:网关可以作为请求的入口,根据请求的路径或者其他条件将请求路由到不同的后端服务。这样可以实现请求的负载均衡,将流量合理地分发到不同的服务实例上,从而提高整个系统的性能和可扩展性。
 - 安全性:网关可以作为安全屏障,用于保护后端服务免受恶意攻击或者非法访问。通过网关可以实现访问控制、身份认证、权限验证等安全功能,确保只有合法的请求可以访问后端服务。
 - 监控与统计:网关可以对请求进行监控和统计,记录请求的响应时间、成功率、失败率等指标,并生成相应的监控报告和统计数据。这样可以帮助开发者实时了解系统的运行状况,及时发现和解决问题。
 - 日志与审计:网关可以记录请求的日志,包括请求的来源、目的地、参数、响应状态等信息,用于后续的审计和分析。这对于排查问题、追踪请求流程、分析用户行为等都非常有帮助。
 - 服务聚合与协议转换:网关可以将多个后端服务的接口聚合成一个统一的接口供客户端调用,从而简化客户端的调用逻辑。同时,网关还可以实现不同协议之间的转换,比如将 HTTP 请求转换为 WebSocket 请求,或者将 RESTful 接口转换为 GraphQL 接口等。
 
5.2 搭建网关服务
创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖:
   <!--        网关gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
       
       <!--        nacos服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
 
编写路由配置及nacos地址
网关路由可以配置的内容包括:
- 路由id:路由唯一标示
 - uri:路由目的地,支持lb和http两种
 - predicates:路由断言,判断请求是否符合要求,符合则转发到路由目的地
 - filters:路由过滤器,处理请求或响应
 
spring:  
  application:  
    name: gateway  # 应用名称为 gateway
  cloud: 
    nacos: 
      discovery: 
        server-addr: localhost:8848  # Nacos 服务端地址为 localhost:8848
    gateway: 
      routes:  # 网关路由配置项,定义了多个路由规则
        - id: server-provice  # 第一个路由规则的标识符
          uri: lb://serve-provide  # 路由到服务名为 serve-provide 的服务
          predicates:  # 定义了路由匹配的条件
            - Path=/api/serve/**  # 匹配路径以 /api/serve/ 开头的请求
          filters:  # 定义了对请求和响应的处理规则
            - RewritePath=/api/(?<segment>/?.*),/$\{segment}  # 重写请求路径,将 /api/ 后面的路径段作为参数传递给后端服务
        - id: data-asset-service  # 第二个路由规则的标识符
          uri: lb://dataAssetService  # 路由到服务名为 dataAssetService 的服务
          predicates:  # 定义了路由匹配的条件
            - Path=/api/dataAsset/** ,/api/dataAssetField/** ,/api/dataAssetRelationCategory/**  # 匹配多个路径的请求
          filters:  # 定义了对请求和响应的处理规则
            - RewritePath=/api/(?<segment>/?.*),/$\{segment}  # 重写请求路径,将 /api/ 后面的路径段作为参数传递给后端服务
server:
  port: 8989 
 
GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理:

5.3 测试网关GateWay
利用Postman来测试,通过访问网关的端口8989,成功把接口转发到对应的服务中去




















