Bootstrap

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

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:ilovey.live/2021/09/
26/springcloud2020/

7796e3443b250aac2479333ee3a8a274.png


新版!

Spring Cloud 2020.0.4 发布,安排!

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等

总体架构图

979ac6b3535f7ddc4c18b0e6bf20f87e.png

版本关系

0343966d8b3c5c6de3710fb1458882fe.png

推荐下自己做的 Spring Boot 的实战项目:

https://github.com/YunaiV/ruoyi-vue-pro

使用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

工程案例

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

在父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个服务表示都已经注册成功。

服务调用

在浏览器上输入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 的拼接格式变成 {file-extension}

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

7c02f13df11f391f319111aa17f9df1e.png

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

8305e2783ab29b0c958774262915c868.png

已在知识星球更新源码解析如下:

369bb403ddecc55cc3b24f6ab593e935.png

e4aa958d566a322bcab69f5b75ada2e5.png

caffb3becd568d6d06687f4321445179.png

70ba64da1570c20a8d6b18c26fbde460.png

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
;