Spring Cloud 2020 版本最佳实践,你落伍了!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
网络型负载均衡 NLB,每月750个小时 15LCU
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Spring Cloud 从H版本之后命名方式改为2020.x.x,话说为毛最新版本不是2021命名,来自强迫症的难受使用组件列表:注册中心:nacos,替代方案eureka、consul、zookeeper配置中心: nacos ,替代方案sc config、consul config调用:feign,替代方案:resttempate熔断:sentinel、,替代方案:Resilience4j熔断监控:sentinel dashboard负载均衡:sc loadbalancer网关:spring cloud gateway链路:spring cloud sleuth+zi

Spring Cloud 从H版本之后命名方式改为2020.x.x,话说为毛最新版本不是2021命名,来自强迫症的难受


使用组件列表:

注册中心:nacos,替代方案eureka、consul、zookeeper

配置中心: nacos ,替代方案sc config、consul config

调用:feign,替代方案:resttempate

熔断:sentinel、,替代方案:Resilience4j

熔断监控:sentinel dashboard

负载均衡:sc loadbalancer

网关:spring cloud gateway

链路:spring cloud sleuth+zipkin,替代方案:skywalking等

总体架构图


image.png

版本关系

image.png


使用nacos作为注册中心和配置中心

下载nacos

下载地址:https://github.com/alibaba/nacos


导入数据库

创建mysql数据库nacos,导入 conf/nacos-mysql.sql


配置数据库

修改 conf/application.properties

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

配置启动模式

将nacos设为单机模式启动,编辑 bin/startup.cmd 将MODE 修改为:

set MODE="standalone"

启动运行

登陆页面:http://localhost:8848/nacos/,登陆用户nacos,登陆密码为nacos


工程案例

工程案例源码:https://github.com/java-aodeng/springcloud2020-demo-1


工程案例包括2个,一个服务提供者provider 、服务消费者consumer


Spring Boot 基础就不介绍了,推荐下这个实战教程: https://www.javastack.cn/categories/Spring-Boot/


在父pom文件引入相关的依赖,如下:

<properties>
    <java.version>1.8</java.version>
    <spring-boot.version>2.4.4</spring-boot.version>
    <spring-cloud.version>2020.0.2</spring-cloud.version>
    <spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
    <dependencies>
        <!-- spring boot 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 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>
    </dependencies>
</dependencyManagement>

服务提供者provider

在pom文件引入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置文件:

server:
  port: 8762
spring:
  application:
    name: provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

启动入口添加注解:

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}

写个接口:

@RestController
public class DemoController {
    @Value("${server.port}")
    String port;
    @GetMapping("getInfo")
    public String getInfo(@RequestParam(value = "name",defaultValue = "nacosConfig",required = false)String name){
        return "my name is "+name+",my port is "+port;
    }
}

服务消费者consumer

在pom文件引入以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--引入openfeign,必须要引入loadbalancer,否则无法启动-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

配置文件

server:
  port: 8763
spring:
  application:
    name: consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

在工程的启动入口开启FeignClient的功能

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}

写一个FeignClient,去调用provider服务的接口:

@FeignClient(value = "provider")
public interface ProviderClient {
    @GetMapping("getInfo")
    String getInfo(@RequestParam(value = "name",defaultValue = "nacosConfig",required = false)String name);
}

写一个接口,让consumer去调用provider服务的接口:

@RestController
public class DemoController {
    @Autowired
    ProviderClient providerClient;
    @GetMapping("getInfoByFeign")
    public String getInfoByFeign(){
        return providerClient.getInfo("consumer feign");
    }
}

启动两个工程,在nacos服务列表页面出现,consumer,provider2个服务表示都已经注册成功


服务调用

推荐一个 Spring Boot 基础教程及实战示例: https://www.javastack.cn/categories/Spring-Boot/


在浏览器上输入http://localhost:8763/getInfoByFeign,浏览器返回响应

my name is consumer feign,my port is 8761

可见浏览器的请求成功调用了consumer服务的接口,consumer服务也成功地通过feign成功的调用了provider服务的接口。


使用sc loadbanlancer作为负载均衡

使用spring cloud loadbanlancer作为负载均衡器。 通过修改provider的端口,再在本地启动一个新的provider服务,那么本地有2个provider 服务,端口分别为8761 和8762。在浏览器上多次调用http://localhost:8763/getInfoByFeign,浏览器会交替显示:

my name is consumer feign,my port is 8761
my name is consumer feign,my port is 8762

注册中心provider服务也会显示两个示例

使用nacos作为配置中心

父工程添加nacos配置版本,另一个是用来解决最新版本导致的问题:

<alibaba.nacos.version>2.0.3</alibaba.nacos.version>
<spring-cloud.bootstrap.version>3.0.4</spring-cloud.bootstrap.version>
     <!--Alibaba Nacos 配置-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>${spring-cloud-alibaba.version}</version>
    </dependency>
    <!--引入这个依赖解决SpringCloud2020整合Nacos-Bootstrap配置不生效的问题-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>${spring-cloud.bootstrap.version}</version>
    </dependency>

服务提供者provider添加依赖:

<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-bootstrap</artifactId>
</dependency>

在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:

server:
  port: 8762
spring:
  application:
    name: provider
  cloud:
    nacos:
      config:
        enabled: true
        server-addr: 127.0.0.1:8848
        file-extension: yml
        prefix: provider
  profiles:
    active: dev

在上面的配置中,配置了nacos config server的地址,配置的扩展名是ymal(目前仅支持yml和properties)。注意是没有配置server.port的,sever.port的属性在nacos中配置。上面的配置是和Nacos中的dataId 的格式是对应的,nacos的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}

prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。 启动nacos,登陆localhost:8848/nacos,创建一个data id ,完整的配置如图所示:

image.png



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
1月前
|
数据可视化 Java BI
将 Spring 微服务与 BI 工具集成:最佳实践
本文探讨了 Spring 微服务与商业智能(BI)工具集成的潜力与实践。随着微服务架构和数据分析需求的增长,Spring Boot 和 Spring Cloud 提供了构建可扩展、弹性服务的框架,而 BI 工具则增强了数据可视化与实时分析能力。文章介绍了 Spring 微服务的核心概念、BI 工具在企业中的作用,并深入分析了两者集成带来的优势,如实时数据处理、个性化报告、数据聚合与安全保障。同时,文中还总结了集成过程中的最佳实践,包括事件驱动架构、集中配置管理、数据安全控制、模块化设计与持续优化策略,旨在帮助企业构建高效、智能的数据驱动系统。
将 Spring 微服务与 BI 工具集成:最佳实践
|
14天前
|
XML Java Nacos
Spring Boot 整合Nacos 版本兼容适配 史上最详细文档
本文介绍SpringBoot整合Nacos的完整流程,涵盖Nacos下载安装、配置中心与服务发现集成、版本兼容性问题及实战配置。重点解决SpringBoot 3.3.0与Nacos版本适配难题,推荐使用Spring Cloud Alibaba方案,并提供项目开源地址供参考学习。
|
2月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
24天前
|
应用服务中间件 Nacos nginx
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
本文为 Mac 用户介绍微服务项目环境搭建,含阿里云服务器用 Docker 装 Nacos 1.2.0,本地通过 brew 装 OpenJDK 8、Maven 3.6.1、Redis,Docker 部署 MySQL 5.7 并配字符集,及 Nginx 安装与反向代理设置,附命令与配置步骤。
117 4
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
|
1月前
|
Prometheus 监控 Java
日志收集和Spring 微服务监控的最佳实践
在微服务架构中,日志记录与监控对系统稳定性、问题排查和性能优化至关重要。本文介绍了在 Spring 微服务中实现高效日志记录与监控的最佳实践,涵盖日志级别选择、结构化日志、集中记录、服务ID跟踪、上下文信息添加、日志轮转,以及使用 Spring Boot Actuator、Micrometer、Prometheus、Grafana、ELK 堆栈等工具进行监控与可视化。通过这些方法,可提升系统的可观测性与运维效率。
125 1
日志收集和Spring 微服务监控的最佳实践
|
2月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
332 0
|
4月前
|
Cloud Native Java 微服务
Spring Boot 3.x 现代化应用开发实战技巧与最佳实践
本指南基于Spring Boot 3.x,融合微服务、云原生与响应式编程等前沿技术,打造现代化应用开发实践。通过构建智能电商平台案例,涵盖商品、订单、用户等核心服务,展示Spring WebFlux、OAuth 2.0认证、Spring Cloud Gateway路由、GraalVM原生编译等技术实现。同时提供Docker/Kubernetes部署方案及性能优化策略,助您掌握从开发到生产的全流程。代码示例详实,适合进阶开发者参考。
389 2
|
6月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
568 5
|
11月前
|
存储 Java Nacos
Spring Cloud+Nacos+KMS 动态配置最佳实践
本文讲述了 Spring Cloud 应用中结合 Nacos 实现了运行期配置动态更新的功能,以及在此基础上结合 KMS 在不改动代码的情况下对应用使用的敏感配置进行保护,解决将配置迁移到 Nacos 中可能存在的数据安全顾虑,并对其底层工作原理做了简单介绍。
1295 156