关于java:Spring-Cloud-2020-版本最佳实践你落伍了

32次阅读

共计 6722 个字符,预计需要花费 17 分钟才能阅读完成。

作者:低调小熊猫 \
起源:https://ilovey.live/2021/09/2…

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 等

总体架构图

版本关系

应用 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-aoden…

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

Spring Boot 根底就不介绍了,举荐下这个实战教程:
https://www.javastack.cn/cate…

在父 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/cate…

在浏览器上输出 http://localhost:8763/getInfo…,浏览器返回响应

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/getInfo…,浏览器会交替显示:

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,残缺的配置如图所示:

源码下载:

https://github.com/java-aoden…

参考资料:

https://www.fangzhipeng.com/s… \
https://spring.io/projects/sp… \
https://www.springcloud.cc/ \
https://blog.csdn.net/lllllll…

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0