天天看點

Spring Cloud 2020 版本最佳實踐,你落伍了!

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等

總體架構圖

Spring Cloud 2020 版本最佳實踐,你落伍了!
版本關系
Spring Cloud 2020 版本最佳實踐,你落伍了!

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

<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 基礎教程及實戰示例:

在浏覽器上輸入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 ,完整的配置如圖所示:

Spring Cloud 2020 版本最佳實踐,你落伍了!